[{"id":25563,"web_url":"https://patchwork.libcamera.org/comment/25563/","msgid":"<Y1coz2lb03qqCu30@pendragon.ideasonboard.com>","date":"2022-10-25T00:07:43","subject":"Re: [libcamera-devel] [PATCH 09/11] Adds Android makefiles to build\n\tlibcamera inline with AOSP.","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Nicholas,\n\nThank you for the patch.\n\nOn Mon, Oct 24, 2022 at 12:55:41AM -0500, Nicholas Roth via libcamera-devel wrote:\n> From: Nicholas Roth <nicholas@rothemail.net>\n\nThe two files list third party copyrights, could you please indicate in\nthe commit message where that comes from ? A link to a git tree with the\ncode you started from would be good.\n\n> ---\n>  android/Android.mk     |  86 ++++++++++++\n>  android/meson_cross.mk | 296 +++++++++++++++++++++++++++++++++++++++++\n>  2 files changed, 382 insertions(+)\n>  create mode 100644 android/Android.mk\n>  create mode 100644 android/meson_cross.mk\n> \n> diff --git a/android/Android.mk b/android/Android.mk\n> new file mode 100644\n> index 00000000..ff0d1472\n> --- /dev/null\n> +++ b/android/Android.mk\n> @@ -0,0 +1,86 @@\n> +# SPDX-License-Identifier: Apache-2.0\n> +#\n> +# Copyright (C) 2021, GlobalLogic Ukraine\n> +# Copyright (C) 2021, Roman Stratiienko (r.stratiienko@gmail.com)\n> +#\n> +# Android.mk - Android makefile\n> +#\n> +\n> +ifneq ($(filter true, $(BOARD_LIBCAMERA_USES_MESON_BUILD)),)\n\nI assume this variable, as well as BOARD_LIBCAMERA_IPAS and\nBOARD_LIBCAMERA_PIPELINES, need to be defined externally. It would be\nnice to add some Android build documentation to the Documentation/\ndirectory.\n\n> +\n> +LOCAL_PATH := $(call my-dir)\n> +LIBCAMERA_TOP := $(dir $(LOCAL_PATH))\n> +LIBCAMERA_MESON_VERSION := .0.0.1\n\nIs this something that can be provided by meson, to avoid hardcoding\nversion numbers in multiple places ? Or can the utils/gen-version.sh\nscript help ?\n\n> +\n> +include $(CLEAR_VARS)\n> +\n> +LOCAL_SHARED_LIBRARIES := libc libexif libjpeg libyuv_chromium libdl libyaml\n> +MESON_GEN_PKGCONFIGS := libexif libjpeg yaml-0.1 libyuv dl\n> +\n> +ifeq ($(TARGET_IS_64_BIT),true)\n> +LOCAL_MULTILIB := 64\n> +else\n> +LOCAL_MULTILIB := 32\n> +endif\n> +include $(LOCAL_PATH)/meson_cross.mk\n> +\n> +ifdef TARGET_2ND_ARCH\n> +LOCAL_MULTILIB := 32\n> +include $(LOCAL_PATH)/meson_cross.mk\n> +endif\n> +\n> +#-------------------------------------------------------------------------------\n> +\n> +define libcamera-lib\n> +LOCAL_MODULE_CLASS := SHARED_LIBRARIES\n> +LOCAL_MODULE := $1\n> +LOCAL_VENDOR_MODULE := true\n> +LOCAL_MODULE_RELATIVE_PATH := $2\n> +ifdef TARGET_2ND_ARCH\n> +LOCAL_SRC_FILES_$(TARGET_ARCH) := $(call relative_top_path,$(LOCAL_PATH))$($3)\n> +LOCAL_SRC_FILES_$(TARGET_2ND_ARCH) := $(call relative_top_path,$(LOCAL_PATH))$(2ND_$3)\n> +LOCAL_MULTILIB := both\n> +else\n> +LOCAL_SRC_FILES := $(call relative_top_path,$(LOCAL_PATH))$($3)\n> +endif\n> +LOCAL_CHECK_ELF_FILES := false\n> +LOCAL_MODULE_SUFFIX := .so$(${4})\n> +include $(BUILD_PREBUILT)\n> +include $(CLEAR_VARS)\n> +endef\n> +\n> +__MY_SHARED_LIBRARIES := $(LOCAL_SHARED_LIBRARIES)\n> +include $(CLEAR_VARS)\n> +LOCAL_SHARED_LIBRARIES := $(__MY_SHARED_LIBRARIES)\n> +\n> +# Modules 'libcamera', produces '/vendor/lib{64}/libcamera.so'\n> +$(eval $(call libcamera-lib,libcamera,,LIBCAMERA_BIN,LIBCAMERA_MESON_VERSION))\n> +# Modules 'libcamera-base', produces '/vendor/lib{64}/libcamera-base.so'\n> +$(eval $(call libcamera-lib,libcamera-base,,LIBCAMERA_BASE_BIN,LIBCAMERA_MESON_VERSION))\n> +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_rkisp1.so'\n> +$(eval $(call libcamera-lib,ipa_rkisp1,,LIBCAMERA_IPA_RKISP1_BIN,))\n\nIt would also be nice to avoid hardcoding the list of IPA modules (and\nother files below), but I suppose that would be difficult ? Or could\n'meson install' be used to install the files to a directory that would\nthen be picked by the Android build system ?\n\n> +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_rpi.so'\n> +$(eval $(call libcamera-lib,ipa_rpi,,LIBCAMERA_IPA_RASPBERRYPI_BIN,))\n> +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_ipu3.so'\n> +$(eval $(call libcamera-lib,ipa_ipu3,,LIBCAMERA_IPA_IPU3_BIN,))\n> +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_vimc.so'\n> +$(eval $(call libcamera-lib,ipa_vimc,,LIBCAMERA_IPA_VIMC_BIN,))\n> +\n> +# Modules 'camera.libcamera', produces '/vendor/lib{64}/hw/camera.libcamera.so' HAL\n> +$(eval $(call libcamera-lib,camera.libcamera,hw,LIBCAMERA_HAL_BIN,))\n> +\n> +LOCAL_SHARED_LIBRARIES += libcamera libcamera-base ipa_rkisp1 ipa_rpi ipa_ipu3 ipa_vimc\n> +LOCAL_REQUIRED_MODULES := libcamera libcamera-base ipa_rkisp1 ipa_rpi ipa_ipu3 ipa_vimc\n> +\n> +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/rkisp1/)\n> +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/rpi/)\n> +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/ipu3/)\n> +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/vimc/)\n> +$(shell cp $(LIBCAMERA_IPA_RKISP1_CONFIGS)/* $(TARGET_OUT_VENDOR_ETC)/rkisp1/)\n> +$(shell cp $(LIBCAMERA_IPA_RASPBERRYPI_CONFIGS)/* $(TARGET_OUT_VENDOR_ETC)/rpi/)\n> +$(shell cp $(LIBCAMERA_IPA_IPU3_CONFIGS)/* $(TARGET_OUT_VENDOR_ETC)/ipu3/)\n> +$(shell cp $(LIBCAMERA_IPA_VIMC_CONFIGS)/* $(TARGET_OUT_VENDOR_ETC)/vimc/)\n> +\n> +#-------------------------------------------------------------------------------\n> +\n> +endif\n> diff --git a/android/meson_cross.mk b/android/meson_cross.mk\n> new file mode 100644\n> index 00000000..bb1661cd\n> --- /dev/null\n> +++ b/android/meson_cross.mk\n> @@ -0,0 +1,296 @@\n> +# SPDX-License-Identifier: Apache-2.0\n> +#\n> +# Copyright (C) 2021, GlobalLogic Ukraine\n> +# Copyright (C) 2021, Roman Stratiienko (r.stratiienko@gmail.com)\n> +#\n> +# meson_cross.mk - Android makefile\n> +#\n> +\n> +# Turn \"dir1/dir2/dir3/dir4\" into \"../../../../\"\n> +define relative_top_path\n> +$(eval __s:=) \\\n> +$(foreach tmp,$(subst /,$(space),$1),$(eval __s:=$(__s)../)) \\\n> +$(__s)\n> +endef\n> +\n> +MY_PATH := $(call my-dir)\n> +\n> +AOSP_ABSOLUTE_PATH := $(realpath .)\n> +\n> +libcam_m_dummy_$(LOCAL_MULTILIB) := $(TARGET_OUT_INTERMEDIATES)/LIBCAM_DUMMY_$(LOCAL_MULTILIB)/dummy.c\n> +\n> +$(libcam_m_dummy_$(LOCAL_MULTILIB)):\n> +\tmkdir -p $(dir $@)\n> +\ttouch $@\n> +\n> +LOCAL_SRC_FILES := $(call relative_top_path,$(MY_PATH))$(libcam_m_dummy_$(LOCAL_MULTILIB))\n> +LOCAL_VENDOR_MODULE := true\n> +LOCAL_MODULE := libcam.dummy.$(LOCAL_MULTILIB)\n> +\n> +# Prepare intermediate variables by AOSP make/core internals\n> +include $(BUILD_SHARED_LIBRARY)\n> +\n> +LOCAL_PATH := $(MY_PATH)\n> +\n> +link_deps := \\\n> +\t$(built_static_libraries) \\\n> +\t$(built_shared_libraries) \\\n> +\t$(built_whole_libraries) \\\n> +\t$(strip $(all_objects)) \\\n> +\t$(my_target_libatomic) \\\n> +\t$(my_target_libcrt_builtins) \\\n> +\t$(my_target_crtbegin_so_o) \\\n> +\t$(my_target_crtend_so_o)\n> +\n> +# Build using intermediate variables provided by AOSP make/core internals\n> +M_TARGET_PREFIX := $(my_2nd_arch_prefix)\n> +\n> +LIBCAMERA_LIB_DIR := lib$(subst 32,,$(LOCAL_MULTILIB))\n> +\n> +MESON_OUT_DIR                            := $($(M_TARGET_PREFIX)TARGET_OUT_INTERMEDIATES)/MESON_LIBCAMERA\n> +MESON_GEN_DIR                            := $(MESON_OUT_DIR)_GEN\n> +MESON_GEN_FILES_TARGET                   := $(MESON_GEN_DIR)/.timestamp\n> +\n> +$(M_TARGET_PREFIX)LIBCAMERA_BIN := $(MESON_OUT_DIR)/install/usr/local/lib/libcamera.so\n> +$(M_TARGET_PREFIX)LIBCAMERA_HAL_BIN := $(MESON_OUT_DIR)/install/usr/local/lib/libcamera-hal.so\n> +$(M_TARGET_PREFIX)LIBCAMERA_BASE_BIN := $(MESON_OUT_DIR)/install/usr/local/lib/libcamera-base.so\n> +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_BIN := $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_rkisp1.so\n> +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_BIN := $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_rpi.so\n> +$(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_BIN := $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_ipu3.so\n> +$(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_BIN := $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_vimc.so\n> +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_CONFIGS := $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/rkisp1\n> +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_CONFIGS := $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/raspberrypi\n> +$(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_CONFIGS := $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/ipu3\n> +$(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_CONFIGS := $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/vimc\n> +\n> +LIBCAMERA_BINS := \\\n> +\t$($(M_TARGET_PREFIX)LIBCAMERA_BIN) \\\n> +\t$($(M_TARGET_PREFIX)LIBCAMERA_HAL_BIN) \\\n> +\t$($(M_TARGET_PREFIX)LIBCAMERA_BASE_BIN) \\\n> +\t$($(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_BIN) \\\n> +\t$($(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_BIN) \\\n> +\t$($(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_BIN) \\\n> +\t$($(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_BIN)\n> +\n> +MESON_GEN_NINJA := \\\n> +\tcd $(MESON_OUT_DIR) && PATH=/usr/bin:/usr/local/bin:$$PATH meson ./build \\\n> +\t--cross-file $(AOSP_ABSOLUTE_PATH)/$(MESON_GEN_DIR)/aosp_cross           \\\n> +\t--buildtype=release                                                      \\\n> +\t-Dandroid=enabled                                                        \\\n> +\t-Dipas=$(subst $(space),$(comma),$(BOARD_LIBCAMERA_IPAS))                \\\n> +\t-Dpipelines=$(subst $(space),$(comma),$(BOARD_LIBCAMERA_PIPELINES))      \\\n> +\t-Dsysconfdir=/vendor/etc                                                 \\\n> +\t-Dtest=false                                                             \\\n> +\t-Dallow_unsigned_ipas_in_process=true\n> +\n> +MESON_BUILD := PATH=/usr/bin:/bin:/sbin:$$PATH ninja -C $(MESON_OUT_DIR)/build\n> +\n> +$(MESON_GEN_FILES_TARGET): MESON_CPU_FAMILY := $(subst arm64,aarch64,$(TARGET_$(M_TARGET_PREFIX)ARCH))\n> +\n> +define create-pkgconfig\n> +echo -e \"Name: $2\" \\\n> +\t\"\\nDescription: $2\" \\\n> +\t\"\\nVersion: $3\" > $1/$2.pc\n> +\n> +endef\n> +\n> +# Taken from build/make/core/binary.mk. We need this\n> +# to use definitions from build/make/core/definitions.mk\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_GLOBAL_C_INCLUDES := $(my_target_global_c_includes)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_GLOBAL_C_SYSTEM_INCLUDES := $(my_target_global_c_system_includes)\n> +\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CFLAGS := $(my_target_global_cflags)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CONLYFLAGS := $(my_target_global_conlyflags)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CPPFLAGS := $(my_target_global_cppflags)\n> +\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_2ND_ARCH_VAR_PREFIX := $(M_TARGET_PREFIX)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_CC := $(my_cc)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_LINKER := $(my_linker)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_CXX := $(my_cxx)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_CXX_LINK := $(my_cxx_link)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_ASFLAGS := $(my_asflags)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_CONLYFLAGS := $(my_conlyflags)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_CFLAGS := $(my_cflags)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_CPPFLAGS := $(my_cppflags)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_CFLAGS_NO_OVERRIDE := $(my_cflags_no_override)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_CPPFLAGS_NO_OVERRIDE := $(my_cppflags_no_override)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_RTTI_FLAG := $(LOCAL_RTTI_FLAG)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_DEBUG_CFLAGS := $(debug_cflags)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_C_INCLUDES := $(my_c_includes)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_IMPORTED_INCLUDES := $(imported_includes)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_LDFLAGS := $(my_ldflags)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_LDLIBS := $(my_ldlibs)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_LDFLAGS := $(my_target_global_ldflags)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_TIDY_CHECKS := $(my_tidy_checks)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_TIDY_FLAGS := $(my_tidy_flags)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_ARFLAGS := $(my_arflags)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_SHARED_LIBRARIES := $(built_shared_libraries)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_STATIC_LIBRARIES := $(built_static_libraries)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_WHOLE_STATIC_LIBRARIES := $(built_whole_libraries)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_OBJECTS := $(strip $(all_objects))\n> +\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)\n> +\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_LIBCRT_BUILTINS := $(my_target_libcrt_builtins)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_LIBATOMIC := $(my_target_libatomic)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_CRTBEGIN_SO_O := $(my_target_crtbegin_so_o)\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_CRTEND_SO_O := $(my_target_crtend_so_o)\n> +##\n> +\n> +define m-lld-flags\n> +  -nostdlib -Wl,--gc-sections \\\n> +  $(PRIVATE_TARGET_CRTBEGIN_SO_O) \\\n> +  $(PRIVATE_ALL_OBJECTS) \\\n> +  -Wl,--whole-archive \\\n> +  $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \\\n> +  -Wl,--no-whole-archive \\\n> +  $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \\\n> +  $(PRIVATE_ALL_STATIC_LIBRARIES) \\\n> +  $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \\\n> +  $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \\\n> +  $(PRIVATE_TARGET_LIBCRT_BUILTINS) \\\n> +  $(PRIVATE_TARGET_LIBATOMIC) \\\n> +  $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \\\n> +  $(PRIVATE_LDFLAGS) \\\n> +  $(PRIVATE_ALL_SHARED_LIBRARIES) \\\n> +  $(PRIVATE_TARGET_CRTEND_SO_O) \\\n> +  $(PRIVATE_LDLIBS)\n> +endef\n> +\n> +define m-lld-flags-cleaned\n> +  $(subst prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/, \\\n> +  $(subst out/,$(AOSP_ABSOLUTE_PATH)/out/,             \\\n> +  $(subst -Wl$(comma)--fatal-warnings,,                \\\n> +  $(subst -Wl$(comma)--no-undefined-version,,          \\\n> +  $(subst -Wl$(comma)--gc-sections,,                   \\\n> +  $(patsubst %dummy.o,,                                \\\n> +    $(m-lld-flags)))))))\n> +endef\n> +\n> +define m-cpp-flags\n> +  $(PRIVATE_TARGET_GLOBAL_CFLAGS) \\\n> +  $(PRIVATE_TARGET_GLOBAL_CPPFLAGS) \\\n> +  $(PRIVATE_ARM_CFLAGS) \\\n> +  $(PRIVATE_RTTI_FLAG) \\\n> +  $(PRIVATE_CFLAGS) \\\n> +  $(PRIVATE_CPPFLAGS) \\\n> +  $(PRIVATE_DEBUG_CFLAGS) \\\n> +  $(PRIVATE_CFLAGS_NO_OVERRIDE) \\\n> +  $(PRIVATE_CPPFLAGS_NO_OVERRIDE)\n> +endef\n> +\n> +define m-c-flags\n> +  $(PRIVATE_TARGET_GLOBAL_CFLAGS) \\\n> +  $(PRIVATE_TARGET_GLOBAL_CONLYFLAGS) \\\n> +  $(PRIVATE_ARM_CFLAGS) \\\n> +  $(PRIVATE_CFLAGS) \\\n> +  $(PRIVATE_CONLYFLAGS) \\\n> +  $(PRIVATE_DEBUG_CFLAGS) \\\n> +  $(PRIVATE_CFLAGS_NO_OVERRIDE)\n> +endef\n> +\n> +define filter-c-flags\n> +  $(subst -std=gnu++17,, \\\n> +  $(subst -fno-rtti,, \\\n> +  $(patsubst  -W%,, \\\n> +    $1)))\n> +endef\n> +\n> +define m-c-includes-common\n> +$(addprefix -I , $(PRIVATE_C_INCLUDES)) \\\n> +$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),,\\\n> +    $(addprefix -I ,\\\n> +        $(filter-out $(PRIVATE_C_INCLUDES), \\\n> +            $(PRIVATE_GLOBAL_C_INCLUDES))) \\\n> +    $(addprefix -isystem ,\\\n> +        $(filter-out $(PRIVATE_C_INCLUDES), \\\n> +            $(PRIVATE_GLOBAL_C_SYSTEM_INCLUDES))))\n> +endef\n> +\n> +ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 30; echo $$?), 0)\n> +# Android 11+\n> +define m-c-includes\n> +$(foreach i,$(PRIVATE_IMPORTED_INCLUDES),$(EXPORTS.$(i)))\\\n> +$(m-c-includes-common)\n> +endef\n> +define postprocess-includes\n> +endef\n> +else\n> +# Android 10,9\n> +$(MESON_GEN_FILES_TARGET): PRIVATE_IMPORT_INCLUDES := $(import_includes)\n> +define postprocess-includes\n> +\techo \" $$(cat $(PRIVATE_IMPORT_INCLUDES)) \" > $(MESON_GEN_DIR)/import_includes && \\\n> +\tsed -i  -e ':a;N;$$!ba;s/\\n/ /g'                                  \\\n> +\t\t-e 's# \\{2,\\}# #g'                                        \\\n> +\t\t-e 's# -isystem # -isystem#g'                             \\\n> +\t\t-e 's# -I # -I#g'                                         \\\n> +\t\t-e 's# -I# -I$(AOSP_ABSOLUTE_PATH)/#g'                    \\\n> +\t\t-e 's# -isystem# -isystem$(AOSP_ABSOLUTE_PATH)/#g'        \\\n> +\t\t-e \"s# #','#g\" $(MESON_GEN_DIR)/import_includes &&        \\\n> +\tsed -i \"s#<_IMPORT_INCLUDES>#$$(cat $(MESON_GEN_DIR)/import_includes)#g\" $(MESON_GEN_DIR)/aosp_cross\n> +endef\n> +define m-c-includes\n> +<_IMPORT_INCLUDES> $(m-c-includes-common)\n> +endef\n> +endif\n> +\n> +define m-c-abs-includes\n> +  $(subst $(space)-isystem,$(space)-isystem$(AOSP_ABSOLUTE_PATH)/, \\\n> +  $(subst $(space)-I, -I$(AOSP_ABSOLUTE_PATH)/, \\\n> +  $(subst $(space)-I$(space),$(space)-I, \\\n> +  $(subst $(space)-isystem$(space),$(space)-isystem, \\\n> +    $(strip $(m-c-includes))))))\n> +endef\n> +\n> +$(MESON_GEN_FILES_TARGET): MESON_GEN_PKGCONFIGS:=$(MESON_GEN_PKGCONFIGS)\n> +$(MESON_GEN_FILES_TARGET): MESON_GEN_DIR:=$(MESON_GEN_DIR)\n> +$(MESON_GEN_FILES_TARGET): $(sort $(shell find -L $(LIBCAMERA_TOP) -not -path '*/\\.*'))\n> +\tmkdir -p $(dir $@)\n> +\techo -e \"[properties]\\n\"                                                                                                  \\\n> +\t\t\"c_args = [$(foreach flag, $(call filter-c-flags,$(m-c-flags) $(m-c-abs-includes)),'$(flag)', )'']\\n\"             \\\n> +\t\t\"cpp_args = [$(foreach flag, $(call filter-c-flags,$(m-cpp-flags) $(m-c-abs-includes)),'$(flag)', )'']\\n\"         \\\n> +\t\t\"c_link_args = [$(foreach flag, $(m-lld-flags-cleaned),'$(flag)',)'']\\n\"                                          \\\n> +\t\t\"cpp_link_args = [$(foreach flag, $(m-lld-flags-cleaned),'$(flag)',)'']\\n\"                                        \\\n> +\t\t\"needs_exe_wrapper = true\\n\"                                                                                      \\\n> +\t\t\"[binaries]\\n\"                                                                                                    \\\n> +\t\t\"ar = '$(AOSP_ABSOLUTE_PATH)/$($($(M_TARGET_PREFIX))TARGET_AR)'\\n\"                                                \\\n> +\t\t\"c = [$(foreach arg,$(PRIVATE_CC),'$(subst prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/,$(arg))',)'']\\n\"           \\\n> +\t\t\"cpp = [$(foreach arg,$(PRIVATE_CXX),'$(subst prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/,$(arg))',)'']\\n\"        \\\n> +\t\t\"c_ld = 'lld'\\n\"                                                                                                  \\\n> +\t\t\"cpp_ld = 'lld'\\n\\n\"                                                                                              \\\n> +\t\t\"pkgconfig = ['env', 'PKG_CONFIG_LIBDIR=' + '$(AOSP_ABSOLUTE_PATH)/$(MESON_GEN_DIR)', '/usr/bin/pkg-config']\\n\\n\" \\\n> +\t\t\"llvm-config = '/dev/null'\\n\"                                                                                     \\\n> +\t\t\"[host_machine]\\n\"                                                                                                \\\n> +\t\t\"system = 'linux'\\n\"                                                                                              \\\n> +\t\t\"cpu_family = '$(MESON_CPU_FAMILY)'\\n\"                                                                            \\\n> +\t\t\"cpu = '$(MESON_CPU_FAMILY)'\\n\"                                                                                   \\\n> +\t\t\"endian = 'little'\" > $(dir $@)/aosp_cross\n> +\n> +\t#\n> +\t$(foreach pkg, $(MESON_GEN_PKGCONFIGS), $(call create-pkgconfig,$(dir $@),$(word 1, $(subst :, ,$(pkg))),$(word 2, $(subst :, ,$(pkg)))))\n> +\ttouch $@\n> +\n> +$(MESON_OUT_DIR)/.build.timestamp: MESON_GEN_NINJA:=$(MESON_GEN_NINJA)\n> +$(MESON_OUT_DIR)/.build.timestamp: MESON_BUILD:=$(MESON_BUILD)\n> +$(MESON_OUT_DIR)/.build.timestamp: $(MESON_GEN_FILES_TARGET) $(link_deps)\n> +\trm -rf $(dir $@)\n> +\tmkdir -p $(dir $@)\n> +\tmkdir -p $(dir $@)/build\n> +\t# Meson will update timestamps in sources directory, continuously retriggering the build\n> +\t# even if nothing changed. Copy sources into intermediate dir to avoid this effect.\n> +\tcp -r $(LIBCAMERA_TOP)/* $(dir $@)\n> +\t$(MESON_GEN_NINJA)\n> +\t$(MESON_BUILD)\n> +\ttouch $@\n> +\n> +$(MESON_OUT_DIR)/install/.install.timestamp: MESON_BUILD:=$(MESON_BUILD)\n> +$(MESON_OUT_DIR)/install/.install.timestamp: $(MESON_OUT_DIR)/.build.timestamp\n> +\trm -rf $(dir $@)\n> +\tmkdir -p $(dir $@)\n> +\tDESTDIR=$(AOSP_ABSOLUTE_PATH)/$(dir $@) $(MESON_BUILD) install\n> +\ttouch $@\n> +\n> +$(LIBCAMERA_BINS): $(MESON_OUT_DIR)/install/.install.timestamp\n> +\techo \"Build $@\"\n> +\ttouch $@","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 2FBE5BD16B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 25 Oct 2022 00:08:11 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 90E7262EAE;\n\tTue, 25 Oct 2022 02:08:10 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EEC8462EAE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 25 Oct 2022 02:08:08 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 66AC88BF;\n\tTue, 25 Oct 2022 02:08:08 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666656490;\n\tbh=1pcIsEGWgvluii1xF6XvFgeR2IwYLQROfDZY6wovZSA=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=AFmTD9TD5uxqS2yUTZcE6XTI5JfiPdUvaEayWaaCmSpjaUtepFzkIPm6pSxXHDsaD\n\tnW2UL5sVli3yJiRH4ua+HDdotrJgMclWYXSPuTcOVX/E94PrmOPIlBBFYdGiGfuLNu\n\tJP7BydjUBqee2Yc8g9Ls9K/6t08Wx0zV4WkHOQ8hOOq96Tka6QnkXX+xZYo01dx+10\n\tTe9TxG20hgDQpTQsQspTRA1Lo0WKKIodOF2EiczB/UwuBXaqlIGwTKed7ImjloRXrP\n\tr4NcoByxx6mi+xcp1UYf/cZlpZAkSNodNrALH/rDfs7vZXYYLBnKrhvaT2g4WmukDC\n\tdMkL6tfq/74hw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1666656488;\n\tbh=1pcIsEGWgvluii1xF6XvFgeR2IwYLQROfDZY6wovZSA=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=otTxZgSMXWLZygzSzvZxFF2KkST7FV7kzgKFx8IWxp+2zadZQ6zNPPEB+SRvqF3tT\n\trIpFQpqbR8L+pPY7gBsGTeyu8W4sVIuzQKZPSfLv5hrGViwmjazVLO/qXFYDkaVpUl\n\tVD0RgBvyZYpuDaOeohx9D5MgB4MGp1WRci7Q+8K0="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"otTxZgSM\"; dkim-atps=neutral","Date":"Tue, 25 Oct 2022 03:07:43 +0300","To":"Nicholas Roth via libcamera-devel <libcamera-devel@lists.libcamera.org>","Message-ID":"<Y1coz2lb03qqCu30@pendragon.ideasonboard.com>","References":"<20221024055543.116040-1-nicholas@rothemail.net>\n\t<20221024055543.116040-10-nicholas@rothemail.net>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20221024055543.116040-10-nicholas@rothemail.net>","Subject":"Re: [libcamera-devel] [PATCH 09/11] Adds Android makefiles to build\n\tlibcamera inline with AOSP.","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"nicholas@rothemail.net","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25583,"web_url":"https://patchwork.libcamera.org/comment/25583/","msgid":"<CAD2rFCrwdoHvTOnK9sORF35OB1z=w452HYd8Vn+VvAbLLhbBKQ@mail.gmail.com>","date":"2022-10-26T02:22:13","subject":"Re: [libcamera-devel] [PATCH 09/11] Adds Android makefiles to build\n\tlibcamera inline with AOSP.","submitter":{"id":137,"url":"https://patchwork.libcamera.org/api/people/137/","name":"Nicholas Roth","email":"nicholas@rothemail.net"},"content":"> The two files list third party copyrights, could you please indicate in\n> the commit message where that comes from ? A link to a git tree with the\n> code you started from would be good.\nHappy to:\nhttps://gitlab.freedesktop.org/mesa/mesa/-/blob/main/android/mesa3d_cross.mk.\nI'll make sure to include this in the commit message.\n\n> I assume this variable, as well as BOARD_LIBCAMERA_IPAS and\n> BOARD_LIBCAMERA_PIPELINES, need to be defined externally. It would be\n> nice to add some Android build documentation to the Documentation/\n> directory.\nAs this review is already quite large, I've created Bug 164 to track this.\nFor now, would it be possible to link to my doc that covers this\nhttps://docs.google.com/document/d/1Sly_VH3w6wFIdE72WXijQegoHZh8IxEnJ9m0hH7GodU/edit\nand reference Bug 164 in the commit message?\n\n>> +LOCAL_PATH := $(call my-dir)\n>> +LIBCAMERA_TOP := $(dir $(LOCAL_PATH))\n>> +LIBCAMERA_MESON_VERSION := .0.0.1\n> Is this something that can be provided by meson, to avoid hardcoding\n> version numbers in multiple places ? Or can the utils/gen-version.sh\n> script help ?\nI will investigate whether utils/gen-version.sh can help. I believe running\nshell scripts is deprecated, but my copy commands at the bottom of\nAndroid.mk do the trick, so it _might_ work, at least for now.\n\n> It would also be nice to avoid hardcoding the list of IPA modules (and\n> other files below), but I suppose that would be difficult ? Or could\n> 'meson install' be used to install the files to a directory that would\n> then be picked by the Android build system ?\nWe already \"meson install\" the files to a known location. Those files have\nto be explicitly accessed, though, because Android needs to transform the\n.so files after they are built with Makefile targets. This is also why\nsignature verification fundamentally does not work on Android.\n\nThanks for your thoughtful responses.\n\n-Nicholas\n\nOn Mon, Oct 24, 2022 at 7:08 PM Laurent Pinchart <\nlaurent.pinchart@ideasonboard.com> wrote:\n\n> Hi Nicholas,\n>\n> Thank you for the patch.\n>\n> On Mon, Oct 24, 2022 at 12:55:41AM -0500, Nicholas Roth via\n> libcamera-devel wrote:\n> > From: Nicholas Roth <nicholas@rothemail.net>\n>\n> The two files list third party copyrights, could you please indicate in\n> the commit message where that comes from ? A link to a git tree with the\n> code you started from would be good.\n>\n> > ---\n> >  android/Android.mk     |  86 ++++++++++++\n> >  android/meson_cross.mk | 296 +++++++++++++++++++++++++++++++++++++++++\n> >  2 files changed, 382 insertions(+)\n> >  create mode 100644 android/Android.mk\n> >  create mode 100644 android/meson_cross.mk\n> >\n> > diff --git a/android/Android.mk b/android/Android.mk\n> > new file mode 100644\n> > index 00000000..ff0d1472\n> > --- /dev/null\n> > +++ b/android/Android.mk\n> > @@ -0,0 +1,86 @@\n> > +# SPDX-License-Identifier: Apache-2.0\n> > +#\n> > +# Copyright (C) 2021, GlobalLogic Ukraine\n> > +# Copyright (C) 2021, Roman Stratiienko (r.stratiienko@gmail.com)\n> > +#\n> > +# Android.mk - Android makefile\n> > +#\n> > +\n> > +ifneq ($(filter true, $(BOARD_LIBCAMERA_USES_MESON_BUILD)),)\n>\n> I assume this variable, as well as BOARD_LIBCAMERA_IPAS and\n> BOARD_LIBCAMERA_PIPELINES, need to be defined externally. It would be\n> nice to add some Android build documentation to the Documentation/\n> directory.\n>\n> > +\n> > +LOCAL_PATH := $(call my-dir)\n> > +LIBCAMERA_TOP := $(dir $(LOCAL_PATH))\n> > +LIBCAMERA_MESON_VERSION := .0.0.1\n>\n> Is this something that can be provided by meson, to avoid hardcoding\n> version numbers in multiple places ? Or can the utils/gen-version.sh\n> script help ?\n>\n> > +\n> > +include $(CLEAR_VARS)\n> > +\n> > +LOCAL_SHARED_LIBRARIES := libc libexif libjpeg libyuv_chromium libdl\n> libyaml\n> > +MESON_GEN_PKGCONFIGS := libexif libjpeg yaml-0.1 libyuv dl\n> > +\n> > +ifeq ($(TARGET_IS_64_BIT),true)\n> > +LOCAL_MULTILIB := 64\n> > +else\n> > +LOCAL_MULTILIB := 32\n> > +endif\n> > +include $(LOCAL_PATH)/meson_cross.mk\n> > +\n> > +ifdef TARGET_2ND_ARCH\n> > +LOCAL_MULTILIB := 32\n> > +include $(LOCAL_PATH)/meson_cross.mk\n> > +endif\n> > +\n> >\n> +#-------------------------------------------------------------------------------\n> > +\n> > +define libcamera-lib\n> > +LOCAL_MODULE_CLASS := SHARED_LIBRARIES\n> > +LOCAL_MODULE := $1\n> > +LOCAL_VENDOR_MODULE := true\n> > +LOCAL_MODULE_RELATIVE_PATH := $2\n> > +ifdef TARGET_2ND_ARCH\n> > +LOCAL_SRC_FILES_$(TARGET_ARCH) := $(call\n> relative_top_path,$(LOCAL_PATH))$($3)\n> > +LOCAL_SRC_FILES_$(TARGET_2ND_ARCH) := $(call\n> relative_top_path,$(LOCAL_PATH))$(2ND_$3)\n> > +LOCAL_MULTILIB := both\n> > +else\n> > +LOCAL_SRC_FILES := $(call relative_top_path,$(LOCAL_PATH))$($3)\n> > +endif\n> > +LOCAL_CHECK_ELF_FILES := false\n> > +LOCAL_MODULE_SUFFIX := .so$(${4})\n> > +include $(BUILD_PREBUILT)\n> > +include $(CLEAR_VARS)\n> > +endef\n> > +\n> > +__MY_SHARED_LIBRARIES := $(LOCAL_SHARED_LIBRARIES)\n> > +include $(CLEAR_VARS)\n> > +LOCAL_SHARED_LIBRARIES := $(__MY_SHARED_LIBRARIES)\n> > +\n> > +# Modules 'libcamera', produces '/vendor/lib{64}/libcamera.so'\n> > +$(eval $(call\n> libcamera-lib,libcamera,,LIBCAMERA_BIN,LIBCAMERA_MESON_VERSION))\n> > +# Modules 'libcamera-base', produces '/vendor/lib{64}/libcamera-base.so'\n> > +$(eval $(call\n> libcamera-lib,libcamera-base,,LIBCAMERA_BASE_BIN,LIBCAMERA_MESON_VERSION))\n> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_rkisp1.so'\n> > +$(eval $(call libcamera-lib,ipa_rkisp1,,LIBCAMERA_IPA_RKISP1_BIN,))\n>\n> It would also be nice to avoid hardcoding the list of IPA modules (and\n> other files below), but I suppose that would be difficult ? Or could\n> 'meson install' be used to install the files to a directory that would\n> then be picked by the Android build system ?\n>\n> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_rpi.so'\n> > +$(eval $(call libcamera-lib,ipa_rpi,,LIBCAMERA_IPA_RASPBERRYPI_BIN,))\n> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_ipu3.so'\n> > +$(eval $(call libcamera-lib,ipa_ipu3,,LIBCAMERA_IPA_IPU3_BIN,))\n> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_vimc.so'\n> > +$(eval $(call libcamera-lib,ipa_vimc,,LIBCAMERA_IPA_VIMC_BIN,))\n> > +\n> > +# Modules 'camera.libcamera', produces '/vendor/lib{64}/hw/\n> camera.libcamera.so' HAL\n> > +$(eval $(call libcamera-lib,camera.libcamera,hw,LIBCAMERA_HAL_BIN,))\n> > +\n> > +LOCAL_SHARED_LIBRARIES += libcamera libcamera-base ipa_rkisp1 ipa_rpi\n> ipa_ipu3 ipa_vimc\n> > +LOCAL_REQUIRED_MODULES := libcamera libcamera-base ipa_rkisp1 ipa_rpi\n> ipa_ipu3 ipa_vimc\n> > +\n> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/rkisp1/)\n> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/rpi/)\n> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/ipu3/)\n> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/vimc/)\n> > +$(shell cp $(LIBCAMERA_IPA_RKISP1_CONFIGS)/*\n> $(TARGET_OUT_VENDOR_ETC)/rkisp1/)\n> > +$(shell cp $(LIBCAMERA_IPA_RASPBERRYPI_CONFIGS)/*\n> $(TARGET_OUT_VENDOR_ETC)/rpi/)\n> > +$(shell cp $(LIBCAMERA_IPA_IPU3_CONFIGS)/*\n> $(TARGET_OUT_VENDOR_ETC)/ipu3/)\n> > +$(shell cp $(LIBCAMERA_IPA_VIMC_CONFIGS)/*\n> $(TARGET_OUT_VENDOR_ETC)/vimc/)\n> > +\n> >\n> +#-------------------------------------------------------------------------------\n> > +\n> > +endif\n> > diff --git a/android/meson_cross.mk b/android/meson_cross.mk\n> > new file mode 100644\n> > index 00000000..bb1661cd\n> > --- /dev/null\n> > +++ b/android/meson_cross.mk\n> > @@ -0,0 +1,296 @@\n> > +# SPDX-License-Identifier: Apache-2.0\n> > +#\n> > +# Copyright (C) 2021, GlobalLogic Ukraine\n> > +# Copyright (C) 2021, Roman Stratiienko (r.stratiienko@gmail.com)\n> > +#\n> > +# meson_cross.mk - Android makefile\n> > +#\n> > +\n> > +# Turn \"dir1/dir2/dir3/dir4\" into \"../../../../\"\n> > +define relative_top_path\n> > +$(eval __s:=) \\\n> > +$(foreach tmp,$(subst /,$(space),$1),$(eval __s:=$(__s)../)) \\\n> > +$(__s)\n> > +endef\n> > +\n> > +MY_PATH := $(call my-dir)\n> > +\n> > +AOSP_ABSOLUTE_PATH := $(realpath .)\n> > +\n> > +libcam_m_dummy_$(LOCAL_MULTILIB) :=\n> $(TARGET_OUT_INTERMEDIATES)/LIBCAM_DUMMY_$(LOCAL_MULTILIB)/dummy.c\n> > +\n> > +$(libcam_m_dummy_$(LOCAL_MULTILIB)):\n> > +     mkdir -p $(dir $@)\n> > +     touch $@\n> > +\n> > +LOCAL_SRC_FILES := $(call\n> relative_top_path,$(MY_PATH))$(libcam_m_dummy_$(LOCAL_MULTILIB))\n> > +LOCAL_VENDOR_MODULE := true\n> > +LOCAL_MODULE := libcam.dummy.$(LOCAL_MULTILIB)\n> > +\n> > +# Prepare intermediate variables by AOSP make/core internals\n> > +include $(BUILD_SHARED_LIBRARY)\n> > +\n> > +LOCAL_PATH := $(MY_PATH)\n> > +\n> > +link_deps := \\\n> > +     $(built_static_libraries) \\\n> > +     $(built_shared_libraries) \\\n> > +     $(built_whole_libraries) \\\n> > +     $(strip $(all_objects)) \\\n> > +     $(my_target_libatomic) \\\n> > +     $(my_target_libcrt_builtins) \\\n> > +     $(my_target_crtbegin_so_o) \\\n> > +     $(my_target_crtend_so_o)\n> > +\n> > +# Build using intermediate variables provided by AOSP make/core\n> internals\n> > +M_TARGET_PREFIX := $(my_2nd_arch_prefix)\n> > +\n> > +LIBCAMERA_LIB_DIR := lib$(subst 32,,$(LOCAL_MULTILIB))\n> > +\n> > +MESON_OUT_DIR                            :=\n> $($(M_TARGET_PREFIX)TARGET_OUT_INTERMEDIATES)/MESON_LIBCAMERA\n> > +MESON_GEN_DIR                            := $(MESON_OUT_DIR)_GEN\n> > +MESON_GEN_FILES_TARGET                   := $(MESON_GEN_DIR)/.timestamp\n> > +\n> > +$(M_TARGET_PREFIX)LIBCAMERA_BIN :=\n> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera.so\n> > +$(M_TARGET_PREFIX)LIBCAMERA_HAL_BIN :=\n> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera-hal.so\n> > +$(M_TARGET_PREFIX)LIBCAMERA_BASE_BIN :=\n> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera-base.so\n> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_BIN :=\n> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_rkisp1.so\n> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_BIN :=\n> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_rpi.so\n> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_BIN :=\n> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_ipu3.so\n> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_BIN :=\n> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_vimc.so\n> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_CONFIGS :=\n> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/rkisp1\n> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_CONFIGS :=\n> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/raspberrypi\n> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_CONFIGS :=\n> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/ipu3\n> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_CONFIGS :=\n> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/vimc\n> > +\n> > +LIBCAMERA_BINS := \\\n> > +     $($(M_TARGET_PREFIX)LIBCAMERA_BIN) \\\n> > +     $($(M_TARGET_PREFIX)LIBCAMERA_HAL_BIN) \\\n> > +     $($(M_TARGET_PREFIX)LIBCAMERA_BASE_BIN) \\\n> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_BIN) \\\n> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_BIN) \\\n> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_BIN) \\\n> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_BIN)\n> > +\n> > +MESON_GEN_NINJA := \\\n> > +     cd $(MESON_OUT_DIR) && PATH=/usr/bin:/usr/local/bin:$$PATH meson\n> ./build \\\n> > +     --cross-file $(AOSP_ABSOLUTE_PATH)/$(MESON_GEN_DIR)/aosp_cross\n>        \\\n> > +     --buildtype=release\n>       \\\n> > +     -Dandroid=enabled\n>       \\\n> > +     -Dipas=$(subst $(space),$(comma),$(BOARD_LIBCAMERA_IPAS))\n>       \\\n> > +     -Dpipelines=$(subst\n> $(space),$(comma),$(BOARD_LIBCAMERA_PIPELINES))      \\\n> > +     -Dsysconfdir=/vendor/etc\n>        \\\n> > +     -Dtest=false\n>        \\\n> > +     -Dallow_unsigned_ipas_in_process=true\n> > +\n> > +MESON_BUILD := PATH=/usr/bin:/bin:/sbin:$$PATH ninja -C\n> $(MESON_OUT_DIR)/build\n> > +\n> > +$(MESON_GEN_FILES_TARGET): MESON_CPU_FAMILY := $(subst\n> arm64,aarch64,$(TARGET_$(M_TARGET_PREFIX)ARCH))\n> > +\n> > +define create-pkgconfig\n> > +echo -e \"Name: $2\" \\\n> > +     \"\\nDescription: $2\" \\\n> > +     \"\\nVersion: $3\" > $1/$2.pc\n> > +\n> > +endef\n> > +\n> > +# Taken from build/make/core/binary.mk. We need this\n> > +# to use definitions from build/make/core/definitions.mk\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_GLOBAL_C_INCLUDES :=\n> $(my_target_global_c_includes)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_GLOBAL_C_SYSTEM_INCLUDES :=\n> $(my_target_global_c_system_includes)\n> > +\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CFLAGS :=\n> $(my_target_global_cflags)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CONLYFLAGS :=\n> $(my_target_global_conlyflags)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CPPFLAGS :=\n> $(my_target_global_cppflags)\n> > +\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_2ND_ARCH_VAR_PREFIX :=\n> $(M_TARGET_PREFIX)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CC := $(my_cc)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LINKER := $(my_linker)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CXX := $(my_cxx)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CXX_LINK := $(my_cxx_link)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ASFLAGS := $(my_asflags)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CONLYFLAGS := $(my_conlyflags)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CFLAGS := $(my_cflags)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CPPFLAGS := $(my_cppflags)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CFLAGS_NO_OVERRIDE :=\n> $(my_cflags_no_override)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CPPFLAGS_NO_OVERRIDE :=\n> $(my_cppflags_no_override)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_RTTI_FLAG := $(LOCAL_RTTI_FLAG)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_DEBUG_CFLAGS := $(debug_cflags)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_C_INCLUDES := $(my_c_includes)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_IMPORTED_INCLUDES :=\n> $(imported_includes)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LDFLAGS := $(my_ldflags)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LDLIBS := $(my_ldlibs)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_LDFLAGS :=\n> $(my_target_global_ldflags)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TIDY_CHECKS := $(my_tidy_checks)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TIDY_FLAGS := $(my_tidy_flags)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ARFLAGS := $(my_arflags)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_SHARED_LIBRARIES :=\n> $(built_shared_libraries)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_STATIC_LIBRARIES :=\n> $(built_static_libraries)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_WHOLE_STATIC_LIBRARIES :=\n> $(built_whole_libraries)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_OBJECTS := $(strip\n> $(all_objects))\n> > +\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ARM_CFLAGS :=\n> $(normal_objects_cflags)\n> > +\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_LIBCRT_BUILTINS :=\n> $(my_target_libcrt_builtins)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_LIBATOMIC :=\n> $(my_target_libatomic)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_CRTBEGIN_SO_O :=\n> $(my_target_crtbegin_so_o)\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_CRTEND_SO_O :=\n> $(my_target_crtend_so_o)\n> > +##\n> > +\n> > +define m-lld-flags\n> > +  -nostdlib -Wl,--gc-sections \\\n> > +  $(PRIVATE_TARGET_CRTBEGIN_SO_O) \\\n> > +  $(PRIVATE_ALL_OBJECTS) \\\n> > +  -Wl,--whole-archive \\\n> > +  $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \\\n> > +  -Wl,--no-whole-archive \\\n> > +  $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \\\n> > +  $(PRIVATE_ALL_STATIC_LIBRARIES) \\\n> > +  $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \\\n> > +  $(if $(filter\n> true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \\\n> > +  $(PRIVATE_TARGET_LIBCRT_BUILTINS) \\\n> > +  $(PRIVATE_TARGET_LIBATOMIC) \\\n> > +  $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \\\n> > +  $(PRIVATE_LDFLAGS) \\\n> > +  $(PRIVATE_ALL_SHARED_LIBRARIES) \\\n> > +  $(PRIVATE_TARGET_CRTEND_SO_O) \\\n> > +  $(PRIVATE_LDLIBS)\n> > +endef\n> > +\n> > +define m-lld-flags-cleaned\n> > +  $(subst prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/, \\\n> > +  $(subst out/,$(AOSP_ABSOLUTE_PATH)/out/,             \\\n> > +  $(subst -Wl$(comma)--fatal-warnings,,                \\\n> > +  $(subst -Wl$(comma)--no-undefined-version,,          \\\n> > +  $(subst -Wl$(comma)--gc-sections,,                   \\\n> > +  $(patsubst %dummy.o,,                                \\\n> > +    $(m-lld-flags)))))))\n> > +endef\n> > +\n> > +define m-cpp-flags\n> > +  $(PRIVATE_TARGET_GLOBAL_CFLAGS) \\\n> > +  $(PRIVATE_TARGET_GLOBAL_CPPFLAGS) \\\n> > +  $(PRIVATE_ARM_CFLAGS) \\\n> > +  $(PRIVATE_RTTI_FLAG) \\\n> > +  $(PRIVATE_CFLAGS) \\\n> > +  $(PRIVATE_CPPFLAGS) \\\n> > +  $(PRIVATE_DEBUG_CFLAGS) \\\n> > +  $(PRIVATE_CFLAGS_NO_OVERRIDE) \\\n> > +  $(PRIVATE_CPPFLAGS_NO_OVERRIDE)\n> > +endef\n> > +\n> > +define m-c-flags\n> > +  $(PRIVATE_TARGET_GLOBAL_CFLAGS) \\\n> > +  $(PRIVATE_TARGET_GLOBAL_CONLYFLAGS) \\\n> > +  $(PRIVATE_ARM_CFLAGS) \\\n> > +  $(PRIVATE_CFLAGS) \\\n> > +  $(PRIVATE_CONLYFLAGS) \\\n> > +  $(PRIVATE_DEBUG_CFLAGS) \\\n> > +  $(PRIVATE_CFLAGS_NO_OVERRIDE)\n> > +endef\n> > +\n> > +define filter-c-flags\n> > +  $(subst -std=gnu++17,, \\\n> > +  $(subst -fno-rtti,, \\\n> > +  $(patsubst  -W%,, \\\n> > +    $1)))\n> > +endef\n> > +\n> > +define m-c-includes-common\n> > +$(addprefix -I , $(PRIVATE_C_INCLUDES)) \\\n> > +$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),,\\\n> > +    $(addprefix -I ,\\\n> > +        $(filter-out $(PRIVATE_C_INCLUDES), \\\n> > +            $(PRIVATE_GLOBAL_C_INCLUDES))) \\\n> > +    $(addprefix -isystem ,\\\n> > +        $(filter-out $(PRIVATE_C_INCLUDES), \\\n> > +            $(PRIVATE_GLOBAL_C_SYSTEM_INCLUDES))))\n> > +endef\n> > +\n> > +ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 30; echo $$?), 0)\n> > +# Android 11+\n> > +define m-c-includes\n> > +$(foreach i,$(PRIVATE_IMPORTED_INCLUDES),$(EXPORTS.$(i)))\\\n> > +$(m-c-includes-common)\n> > +endef\n> > +define postprocess-includes\n> > +endef\n> > +else\n> > +# Android 10,9\n> > +$(MESON_GEN_FILES_TARGET): PRIVATE_IMPORT_INCLUDES := $(import_includes)\n> > +define postprocess-includes\n> > +     echo \" $$(cat $(PRIVATE_IMPORT_INCLUDES)) \" >\n> $(MESON_GEN_DIR)/import_includes && \\\n> > +     sed -i  -e ':a;N;$$!ba;s/\\n/ /g'                                  \\\n> > +             -e 's# \\{2,\\}# #g'                                        \\\n> > +             -e 's# -isystem # -isystem#g'                             \\\n> > +             -e 's# -I # -I#g'                                         \\\n> > +             -e 's# -I# -I$(AOSP_ABSOLUTE_PATH)/#g'                    \\\n> > +             -e 's# -isystem# -isystem$(AOSP_ABSOLUTE_PATH)/#g'        \\\n> > +             -e \"s# #','#g\" $(MESON_GEN_DIR)/import_includes &&        \\\n> > +     sed -i \"s#<_IMPORT_INCLUDES>#$$(cat\n> $(MESON_GEN_DIR)/import_includes)#g\" $(MESON_GEN_DIR)/aosp_cross\n> > +endef\n> > +define m-c-includes\n> > +<_IMPORT_INCLUDES> $(m-c-includes-common)\n> > +endef\n> > +endif\n> > +\n> > +define m-c-abs-includes\n> > +  $(subst $(space)-isystem,$(space)-isystem$(AOSP_ABSOLUTE_PATH)/, \\\n> > +  $(subst $(space)-I, -I$(AOSP_ABSOLUTE_PATH)/, \\\n> > +  $(subst $(space)-I$(space),$(space)-I, \\\n> > +  $(subst $(space)-isystem$(space),$(space)-isystem, \\\n> > +    $(strip $(m-c-includes))))))\n> > +endef\n> > +\n> > +$(MESON_GEN_FILES_TARGET): MESON_GEN_PKGCONFIGS:=$(MESON_GEN_PKGCONFIGS)\n> > +$(MESON_GEN_FILES_TARGET): MESON_GEN_DIR:=$(MESON_GEN_DIR)\n> > +$(MESON_GEN_FILES_TARGET): $(sort $(shell find -L $(LIBCAMERA_TOP) -not\n> -path '*/\\.*'))\n> > +     mkdir -p $(dir $@)\n> > +     echo -e \"[properties]\\n\"\n>                                                         \\\n> > +             \"c_args = [$(foreach flag, $(call\n> filter-c-flags,$(m-c-flags) $(m-c-abs-includes)),'$(flag)', )'']\\n\"\n>      \\\n> > +             \"cpp_args = [$(foreach flag, $(call\n> filter-c-flags,$(m-cpp-flags) $(m-c-abs-includes)),'$(flag)', )'']\\n\"\n>    \\\n> > +             \"c_link_args = [$(foreach flag,\n> $(m-lld-flags-cleaned),'$(flag)',)'']\\n\"\n>       \\\n> > +             \"cpp_link_args = [$(foreach flag,\n> $(m-lld-flags-cleaned),'$(flag)',)'']\\n\"\n>     \\\n> > +             \"needs_exe_wrapper = true\\n\"\n>                                                         \\\n> > +             \"[binaries]\\n\"\n>                                                         \\\n> > +             \"ar =\n> '$(AOSP_ABSOLUTE_PATH)/$($($(M_TARGET_PREFIX))TARGET_AR)'\\n\"\n>                                 \\\n> > +             \"c = [$(foreach arg,$(PRIVATE_CC),'$(subst\n> prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/,$(arg))',)'']\\n\"           \\\n> > +             \"cpp = [$(foreach arg,$(PRIVATE_CXX),'$(subst\n> prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/,$(arg))',)'']\\n\"        \\\n> > +             \"c_ld = 'lld'\\n\"\n>                                                         \\\n> > +             \"cpp_ld = 'lld'\\n\\n\"\n>                                                         \\\n> > +             \"pkgconfig = ['env', 'PKG_CONFIG_LIBDIR=' +\n> '$(AOSP_ABSOLUTE_PATH)/$(MESON_GEN_DIR)', '/usr/bin/pkg-config']\\n\\n\" \\\n> > +             \"llvm-config = '/dev/null'\\n\"\n>                                                        \\\n> > +             \"[host_machine]\\n\"\n>                                                         \\\n> > +             \"system = 'linux'\\n\"\n>                                                         \\\n> > +             \"cpu_family = '$(MESON_CPU_FAMILY)'\\n\"\n>                                                         \\\n> > +             \"cpu = '$(MESON_CPU_FAMILY)'\\n\"\n>                                                        \\\n> > +             \"endian = 'little'\" > $(dir $@)/aosp_cross\n> > +\n> > +     #\n> > +     $(foreach pkg, $(MESON_GEN_PKGCONFIGS), $(call\n> create-pkgconfig,$(dir $@),$(word 1, $(subst :, ,$(pkg))),$(word 2, $(subst\n> :, ,$(pkg)))))\n> > +     touch $@\n> > +\n> > +$(MESON_OUT_DIR)/.build.timestamp: MESON_GEN_NINJA:=$(MESON_GEN_NINJA)\n> > +$(MESON_OUT_DIR)/.build.timestamp: MESON_BUILD:=$(MESON_BUILD)\n> > +$(MESON_OUT_DIR)/.build.timestamp: $(MESON_GEN_FILES_TARGET)\n> $(link_deps)\n> > +     rm -rf $(dir $@)\n> > +     mkdir -p $(dir $@)\n> > +     mkdir -p $(dir $@)/build\n> > +     # Meson will update timestamps in sources directory, continuously\n> retriggering the build\n> > +     # even if nothing changed. Copy sources into intermediate dir to\n> avoid this effect.\n> > +     cp -r $(LIBCAMERA_TOP)/* $(dir $@)\n> > +     $(MESON_GEN_NINJA)\n> > +     $(MESON_BUILD)\n> > +     touch $@\n> > +\n> > +$(MESON_OUT_DIR)/install/.install.timestamp: MESON_BUILD:=$(MESON_BUILD)\n> > +$(MESON_OUT_DIR)/install/.install.timestamp:\n> $(MESON_OUT_DIR)/.build.timestamp\n> > +     rm -rf $(dir $@)\n> > +     mkdir -p $(dir $@)\n> > +     DESTDIR=$(AOSP_ABSOLUTE_PATH)/$(dir $@) $(MESON_BUILD) install\n> > +     touch $@\n> > +\n> > +$(LIBCAMERA_BINS): $(MESON_OUT_DIR)/install/.install.timestamp\n> > +     echo \"Build $@\"\n> > +     touch $@\n>\n> --\n> Regards,\n>\n> Laurent Pinchart\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 543FFBDB16\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 26 Oct 2022 02:22:28 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 73FA562F46;\n\tWed, 26 Oct 2022 04:22:27 +0200 (CEST)","from mail-io1-xd36.google.com (mail-io1-xd36.google.com\n\t[IPv6:2607:f8b0:4864:20::d36])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C127862F34\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 Oct 2022 04:22:25 +0200 (CEST)","by mail-io1-xd36.google.com with SMTP id s27so2700717ioa.10\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 25 Oct 2022 19:22:25 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666750947;\n\tbh=Bv1K5riknhu4PeR2FMQIHcD31jTeEojZaqsw5GlgRic=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=aEHr38q13+77DuRDIet+wP6lL5Z8b4F92re/3Vy9S2aKIgdYaFiSbiopJkFudbukn\n\tVbndUFsiO3WWfiXWVjGuBAq2j0udLQ1h/WEaJkJrMli7dfus8sHl0cS6in0ilhfceC\n\tkV0GdzNK47k8MlTc2hEpYLLnKyxo3mQEx5Gqxc5XqhFr0kPMVkCyIYu2XzpJryGc0o\n\t2ZeJRX1U2xpCrEYbMQWTAAzdgsmnDWIFNUp6X8S5Cl9CytpunXOmYIQod6dzHEndE1\n\tLl0JSS5Csoemr/Hnx4r9rf8AtwBQGK1MDb1J1Sv7yzeQWnKs/IkDVVItnWMW8qhDD2\n\tcQny+34J/mHWg==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=rothemail-net.20210112.gappssmtp.com; s=20210112;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=9IMuVpiPcMP1FzI5o+B1RWBuqygzYUNGNmnKKPgSGU8=;\n\tb=eJiZFKfong25w78UdJOCjKYAVVqhFt/6e8hGLROGUoxfEDpAj32VIz/t+n7mvYxFiN\n\tqLRttAsiJx1Uohuk7OqxWmtgPlKa+spqo8puvqHzLX8E4Q+byxAq22ZFuQQs5K8lI/7y\n\ttHma4SQIvuE88Yqajt6bFT6P1qVEeVAbd+O9msTJTin/6yTuSLwwsFJUVQzP7zwO9x5v\n\tEy0OaIK1pFuDFLWkrZpR55BDC63etgKmzw6pH0c79wtIaF0c/skRH/xVans5XHPmiweO\n\tNDCb9Pck8ExVDb3bMX2dKk+N0kuvQ/RVhcIenT7mAEQ6+44csIDIKuY9+Ct06YJHJnoK\n\t0iQg=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected)\n\theader.d=rothemail-net.20210112.gappssmtp.com\n\theader.i=@rothemail-net.20210112.gappssmtp.com header.b=\"eJiZFKfo\"; \n\tdkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=9IMuVpiPcMP1FzI5o+B1RWBuqygzYUNGNmnKKPgSGU8=;\n\tb=j6BSPNcVVzP/+qWhOHpZ9mUFN3+vfqgkvm3A58OK/NDZhfF8tcQNBKHHQF4OtAyuJa\n\tB5psD9fiIxhOu7qR7/u3JNQgpuL5vk1GZn1Kx218bUD6cEpZyUtrJ1bI8HAxWt/K6iyX\n\tx1bdyPDLYWFjyC/R1EJiPDARhAazEgGtt//GrtEQvLTUmNg/nncL35zsaOj4XyQn0kGE\n\tlvCFhnY17sfT5MMj00RV9eyjq5KLwTxwpVxOdaZhbYZffWiYBuiF/Fy/Nnuz212zrff4\n\trhx24uRXu2M3R7GFDu+XdwffYDmeAokKWfImTmx+2Y5L5dqLs3hToMBcZAjjhgVo4uJ+\n\tHx9g==","X-Gm-Message-State":"ACrzQf1i1pm4Ltf34k1FFGFIrGFZiK2q+qYYI8Hnb3juiAK6VW6j8J/Y\n\thxqdvtlCBHrUpO0nICj0K1Nq/ZU9+ATxwTDFkL+qVBE4gzgRLHY8","X-Google-Smtp-Source":"AMsMyM4BqN/F/hyJBLGM8B3/s2aP1JLruOK7mNTf3BX2NQBVGrPI2F5bLG89NsMvydDati+BNx40XN4zfr4LaQ5bn84=","X-Received":"by 2002:a02:9982:0:b0:364:6be:dbd6 with SMTP id\n\ta2-20020a029982000000b0036406bedbd6mr26736575jal.311.1666750943976;\n\tTue, 25 Oct 2022 19:22:23 -0700 (PDT)","MIME-Version":"1.0","References":"<20221024055543.116040-1-nicholas@rothemail.net>\n\t<20221024055543.116040-10-nicholas@rothemail.net>\n\t<Y1coz2lb03qqCu30@pendragon.ideasonboard.com>","In-Reply-To":"<Y1coz2lb03qqCu30@pendragon.ideasonboard.com>","Date":"Tue, 25 Oct 2022 21:22:13 -0500","Message-ID":"<CAD2rFCrwdoHvTOnK9sORF35OB1z=w452HYd8Vn+VvAbLLhbBKQ@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"000000000000f1f83605ebe6b1ec\"","Subject":"Re: [libcamera-devel] [PATCH 09/11] Adds Android makefiles to build\n\tlibcamera inline with AOSP.","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Nicholas Roth via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Nicholas Roth <nicholas@rothemail.net>","Cc":"Nicholas Roth via libcamera-devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25584,"web_url":"https://patchwork.libcamera.org/comment/25584/","msgid":"<CAD2rFCrPqLRAuFj1mSTkUzL15TKckVhvKOfadTnqW1QVk8W31A@mail.gmail.com>","date":"2022-10-26T03:05:38","subject":"Re: [libcamera-devel] [PATCH 09/11] Adds Android makefiles to build\n\tlibcamera inline with AOSP.","submitter":{"id":137,"url":"https://patchwork.libcamera.org/api/people/137/","name":"Nicholas Roth","email":"nicholas@rothemail.net"},"content":"+Kieran Bingham <kieran.bingham@ideasonboard.com> since Laurent is out.\n\n\nOn Tue, Oct 25, 2022 at 9:22 PM Nicholas Roth <nicholas@rothemail.net>\nwrote:\n\n> > The two files list third party copyrights, could you please indicate in\n> > the commit message where that comes from ? A link to a git tree with the\n> > code you started from would be good.\n> Happy to:\n> https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/android/mesa3d_cross.mk.\n> I'll make sure to include this in the commit message.\n>\n> > I assume this variable, as well as BOARD_LIBCAMERA_IPAS and\n> > BOARD_LIBCAMERA_PIPELINES, need to be defined externally. It would be\n> > nice to add some Android build documentation to the Documentation/\n> > directory.\n> As this review is already quite large, I've created Bug 164 to track this.\n> For now, would it be possible to link to my doc that covers this\n> https://docs.google.com/document/d/1Sly_VH3w6wFIdE72WXijQegoHZh8IxEnJ9m0hH7GodU/edit\n> and reference Bug 164 in the commit message?\n>\n> >> +LOCAL_PATH := $(call my-dir)\n> >> +LIBCAMERA_TOP := $(dir $(LOCAL_PATH))\n> >> +LIBCAMERA_MESON_VERSION := .0.0.1\n> > Is this something that can be provided by meson, to avoid hardcoding\n> > version numbers in multiple places ? Or can the utils/gen-version.sh\n> > script help ?\n> I will investigate whether utils/gen-version.sh can help. I believe\n> running shell scripts is deprecated, but my copy commands at the bottom of\n> Android.mk do the trick, so it _might_ work, at least for now.\n>\n> > It would also be nice to avoid hardcoding the list of IPA modules (and\n> > other files below), but I suppose that would be difficult ? Or could\n> > 'meson install' be used to install the files to a directory that would\n> > then be picked by the Android build system ?\n> We already \"meson install\" the files to a known location. Those files have\n> to be explicitly accessed, though, because Android needs to transform the\n> .so files after they are built with Makefile targets. This is also why\n> signature verification fundamentally does not work on Android.\n>\n> Thanks for your thoughtful responses.\n>\n> -Nicholas\n>\n> On Mon, Oct 24, 2022 at 7:08 PM Laurent Pinchart <\n> laurent.pinchart@ideasonboard.com> wrote:\n>\n>> Hi Nicholas,\n>>\n>> Thank you for the patch.\n>>\n>> On Mon, Oct 24, 2022 at 12:55:41AM -0500, Nicholas Roth via\n>> libcamera-devel wrote:\n>> > From: Nicholas Roth <nicholas@rothemail.net>\n>>\n>> The two files list third party copyrights, could you please indicate in\n>> the commit message where that comes from ? A link to a git tree with the\n>> code you started from would be good.\n>>\n>> > ---\n>> >  android/Android.mk     |  86 ++++++++++++\n>> >  android/meson_cross.mk | 296 +++++++++++++++++++++++++++++++++++++++++\n>> >  2 files changed, 382 insertions(+)\n>> >  create mode 100644 android/Android.mk\n>> >  create mode 100644 android/meson_cross.mk\n>> >\n>> > diff --git a/android/Android.mk b/android/Android.mk\n>> > new file mode 100644\n>> > index 00000000..ff0d1472\n>> > --- /dev/null\n>> > +++ b/android/Android.mk\n>> > @@ -0,0 +1,86 @@\n>> > +# SPDX-License-Identifier: Apache-2.0\n>> > +#\n>> > +# Copyright (C) 2021, GlobalLogic Ukraine\n>> > +# Copyright (C) 2021, Roman Stratiienko (r.stratiienko@gmail.com)\n>> > +#\n>> > +# Android.mk - Android makefile\n>> > +#\n>> > +\n>> > +ifneq ($(filter true, $(BOARD_LIBCAMERA_USES_MESON_BUILD)),)\n>>\n>> I assume this variable, as well as BOARD_LIBCAMERA_IPAS and\n>> BOARD_LIBCAMERA_PIPELINES, need to be defined externally. It would be\n>> nice to add some Android build documentation to the Documentation/\n>> directory.\n>>\n>> > +\n>> > +LOCAL_PATH := $(call my-dir)\n>> > +LIBCAMERA_TOP := $(dir $(LOCAL_PATH))\n>> > +LIBCAMERA_MESON_VERSION := .0.0.1\n>>\n>> Is this something that can be provided by meson, to avoid hardcoding\n>> version numbers in multiple places ? Or can the utils/gen-version.sh\n>> script help ?\n>>\n>> > +\n>> > +include $(CLEAR_VARS)\n>> > +\n>> > +LOCAL_SHARED_LIBRARIES := libc libexif libjpeg libyuv_chromium libdl\n>> libyaml\n>> > +MESON_GEN_PKGCONFIGS := libexif libjpeg yaml-0.1 libyuv dl\n>> > +\n>> > +ifeq ($(TARGET_IS_64_BIT),true)\n>> > +LOCAL_MULTILIB := 64\n>> > +else\n>> > +LOCAL_MULTILIB := 32\n>> > +endif\n>> > +include $(LOCAL_PATH)/meson_cross.mk\n>> > +\n>> > +ifdef TARGET_2ND_ARCH\n>> > +LOCAL_MULTILIB := 32\n>> > +include $(LOCAL_PATH)/meson_cross.mk\n>> > +endif\n>> > +\n>> >\n>> +#-------------------------------------------------------------------------------\n>> > +\n>> > +define libcamera-lib\n>> > +LOCAL_MODULE_CLASS := SHARED_LIBRARIES\n>> > +LOCAL_MODULE := $1\n>> > +LOCAL_VENDOR_MODULE := true\n>> > +LOCAL_MODULE_RELATIVE_PATH := $2\n>> > +ifdef TARGET_2ND_ARCH\n>> > +LOCAL_SRC_FILES_$(TARGET_ARCH) := $(call\n>> relative_top_path,$(LOCAL_PATH))$($3)\n>> > +LOCAL_SRC_FILES_$(TARGET_2ND_ARCH) := $(call\n>> relative_top_path,$(LOCAL_PATH))$(2ND_$3)\n>> > +LOCAL_MULTILIB := both\n>> > +else\n>> > +LOCAL_SRC_FILES := $(call relative_top_path,$(LOCAL_PATH))$($3)\n>> > +endif\n>> > +LOCAL_CHECK_ELF_FILES := false\n>> > +LOCAL_MODULE_SUFFIX := .so$(${4})\n>> > +include $(BUILD_PREBUILT)\n>> > +include $(CLEAR_VARS)\n>> > +endef\n>> > +\n>> > +__MY_SHARED_LIBRARIES := $(LOCAL_SHARED_LIBRARIES)\n>> > +include $(CLEAR_VARS)\n>> > +LOCAL_SHARED_LIBRARIES := $(__MY_SHARED_LIBRARIES)\n>> > +\n>> > +# Modules 'libcamera', produces '/vendor/lib{64}/libcamera.so'\n>> > +$(eval $(call\n>> libcamera-lib,libcamera,,LIBCAMERA_BIN,LIBCAMERA_MESON_VERSION))\n>> > +# Modules 'libcamera-base', produces\n>> '/vendor/lib{64}/libcamera-base.so'\n>> > +$(eval $(call\n>> libcamera-lib,libcamera-base,,LIBCAMERA_BASE_BIN,LIBCAMERA_MESON_VERSION))\n>> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_rkisp1.so'\n>> > +$(eval $(call libcamera-lib,ipa_rkisp1,,LIBCAMERA_IPA_RKISP1_BIN,))\n>>\n>> It would also be nice to avoid hardcoding the list of IPA modules (and\n>> other files below), but I suppose that would be difficult ? Or could\n>> 'meson install' be used to install the files to a directory that would\n>> then be picked by the Android build system ?\n>>\n>> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_rpi.so'\n>> > +$(eval $(call libcamera-lib,ipa_rpi,,LIBCAMERA_IPA_RASPBERRYPI_BIN,))\n>> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_ipu3.so'\n>> > +$(eval $(call libcamera-lib,ipa_ipu3,,LIBCAMERA_IPA_IPU3_BIN,))\n>> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_vimc.so'\n>> > +$(eval $(call libcamera-lib,ipa_vimc,,LIBCAMERA_IPA_VIMC_BIN,))\n>> > +\n>> > +# Modules 'camera.libcamera', produces '/vendor/lib{64}/hw/\n>> camera.libcamera.so' HAL\n>> > +$(eval $(call libcamera-lib,camera.libcamera,hw,LIBCAMERA_HAL_BIN,))\n>> > +\n>> > +LOCAL_SHARED_LIBRARIES += libcamera libcamera-base ipa_rkisp1 ipa_rpi\n>> ipa_ipu3 ipa_vimc\n>> > +LOCAL_REQUIRED_MODULES := libcamera libcamera-base ipa_rkisp1 ipa_rpi\n>> ipa_ipu3 ipa_vimc\n>> > +\n>> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/rkisp1/)\n>> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/rpi/)\n>> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/ipu3/)\n>> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/vimc/)\n>> > +$(shell cp $(LIBCAMERA_IPA_RKISP1_CONFIGS)/*\n>> $(TARGET_OUT_VENDOR_ETC)/rkisp1/)\n>> > +$(shell cp $(LIBCAMERA_IPA_RASPBERRYPI_CONFIGS)/*\n>> $(TARGET_OUT_VENDOR_ETC)/rpi/)\n>> > +$(shell cp $(LIBCAMERA_IPA_IPU3_CONFIGS)/*\n>> $(TARGET_OUT_VENDOR_ETC)/ipu3/)\n>> > +$(shell cp $(LIBCAMERA_IPA_VIMC_CONFIGS)/*\n>> $(TARGET_OUT_VENDOR_ETC)/vimc/)\n>> > +\n>> >\n>> +#-------------------------------------------------------------------------------\n>> > +\n>> > +endif\n>> > diff --git a/android/meson_cross.mk b/android/meson_cross.mk\n>> > new file mode 100644\n>> > index 00000000..bb1661cd\n>> > --- /dev/null\n>> > +++ b/android/meson_cross.mk\n>> > @@ -0,0 +1,296 @@\n>> > +# SPDX-License-Identifier: Apache-2.0\n>> > +#\n>> > +# Copyright (C) 2021, GlobalLogic Ukraine\n>> > +# Copyright (C) 2021, Roman Stratiienko (r.stratiienko@gmail.com)\n>> > +#\n>> > +# meson_cross.mk - Android makefile\n>> > +#\n>> > +\n>> > +# Turn \"dir1/dir2/dir3/dir4\" into \"../../../../\"\n>> > +define relative_top_path\n>> > +$(eval __s:=) \\\n>> > +$(foreach tmp,$(subst /,$(space),$1),$(eval __s:=$(__s)../)) \\\n>> > +$(__s)\n>> > +endef\n>> > +\n>> > +MY_PATH := $(call my-dir)\n>> > +\n>> > +AOSP_ABSOLUTE_PATH := $(realpath .)\n>> > +\n>> > +libcam_m_dummy_$(LOCAL_MULTILIB) :=\n>> $(TARGET_OUT_INTERMEDIATES)/LIBCAM_DUMMY_$(LOCAL_MULTILIB)/dummy.c\n>> > +\n>> > +$(libcam_m_dummy_$(LOCAL_MULTILIB)):\n>> > +     mkdir -p $(dir $@)\n>> > +     touch $@\n>> > +\n>> > +LOCAL_SRC_FILES := $(call\n>> relative_top_path,$(MY_PATH))$(libcam_m_dummy_$(LOCAL_MULTILIB))\n>> > +LOCAL_VENDOR_MODULE := true\n>> > +LOCAL_MODULE := libcam.dummy.$(LOCAL_MULTILIB)\n>> > +\n>> > +# Prepare intermediate variables by AOSP make/core internals\n>> > +include $(BUILD_SHARED_LIBRARY)\n>> > +\n>> > +LOCAL_PATH := $(MY_PATH)\n>> > +\n>> > +link_deps := \\\n>> > +     $(built_static_libraries) \\\n>> > +     $(built_shared_libraries) \\\n>> > +     $(built_whole_libraries) \\\n>> > +     $(strip $(all_objects)) \\\n>> > +     $(my_target_libatomic) \\\n>> > +     $(my_target_libcrt_builtins) \\\n>> > +     $(my_target_crtbegin_so_o) \\\n>> > +     $(my_target_crtend_so_o)\n>> > +\n>> > +# Build using intermediate variables provided by AOSP make/core\n>> internals\n>> > +M_TARGET_PREFIX := $(my_2nd_arch_prefix)\n>> > +\n>> > +LIBCAMERA_LIB_DIR := lib$(subst 32,,$(LOCAL_MULTILIB))\n>> > +\n>> > +MESON_OUT_DIR                            :=\n>> $($(M_TARGET_PREFIX)TARGET_OUT_INTERMEDIATES)/MESON_LIBCAMERA\n>> > +MESON_GEN_DIR                            := $(MESON_OUT_DIR)_GEN\n>> > +MESON_GEN_FILES_TARGET                   := $(MESON_GEN_DIR)/.timestamp\n>> > +\n>> > +$(M_TARGET_PREFIX)LIBCAMERA_BIN :=\n>> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera.so\n>> > +$(M_TARGET_PREFIX)LIBCAMERA_HAL_BIN :=\n>> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera-hal.so\n>> > +$(M_TARGET_PREFIX)LIBCAMERA_BASE_BIN :=\n>> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera-base.so\n>> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_BIN :=\n>> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_rkisp1.so\n>> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_BIN :=\n>> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_rpi.so\n>> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_BIN :=\n>> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_ipu3.so\n>> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_BIN :=\n>> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_vimc.so\n>> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_CONFIGS :=\n>> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/rkisp1\n>> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_CONFIGS :=\n>> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/raspberrypi\n>> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_CONFIGS :=\n>> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/ipu3\n>> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_CONFIGS :=\n>> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/vimc\n>> > +\n>> > +LIBCAMERA_BINS := \\\n>> > +     $($(M_TARGET_PREFIX)LIBCAMERA_BIN) \\\n>> > +     $($(M_TARGET_PREFIX)LIBCAMERA_HAL_BIN) \\\n>> > +     $($(M_TARGET_PREFIX)LIBCAMERA_BASE_BIN) \\\n>> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_BIN) \\\n>> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_BIN) \\\n>> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_BIN) \\\n>> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_BIN)\n>> > +\n>> > +MESON_GEN_NINJA := \\\n>> > +     cd $(MESON_OUT_DIR) && PATH=/usr/bin:/usr/local/bin:$$PATH meson\n>> ./build \\\n>> > +     --cross-file $(AOSP_ABSOLUTE_PATH)/$(MESON_GEN_DIR)/aosp_cross\n>>        \\\n>> > +     --buildtype=release\n>>         \\\n>> > +     -Dandroid=enabled\n>>         \\\n>> > +     -Dipas=$(subst $(space),$(comma),$(BOARD_LIBCAMERA_IPAS))\n>>         \\\n>> > +     -Dpipelines=$(subst\n>> $(space),$(comma),$(BOARD_LIBCAMERA_PIPELINES))      \\\n>> > +     -Dsysconfdir=/vendor/etc\n>>        \\\n>> > +     -Dtest=false\n>>        \\\n>> > +     -Dallow_unsigned_ipas_in_process=true\n>> > +\n>> > +MESON_BUILD := PATH=/usr/bin:/bin:/sbin:$$PATH ninja -C\n>> $(MESON_OUT_DIR)/build\n>> > +\n>> > +$(MESON_GEN_FILES_TARGET): MESON_CPU_FAMILY := $(subst\n>> arm64,aarch64,$(TARGET_$(M_TARGET_PREFIX)ARCH))\n>> > +\n>> > +define create-pkgconfig\n>> > +echo -e \"Name: $2\" \\\n>> > +     \"\\nDescription: $2\" \\\n>> > +     \"\\nVersion: $3\" > $1/$2.pc\n>> > +\n>> > +endef\n>> > +\n>> > +# Taken from build/make/core/binary.mk. We need this\n>> > +# to use definitions from build/make/core/definitions.mk\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_GLOBAL_C_INCLUDES :=\n>> $(my_target_global_c_includes)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_GLOBAL_C_SYSTEM_INCLUDES :=\n>> $(my_target_global_c_system_includes)\n>> > +\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CFLAGS :=\n>> $(my_target_global_cflags)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CONLYFLAGS :=\n>> $(my_target_global_conlyflags)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CPPFLAGS :=\n>> $(my_target_global_cppflags)\n>> > +\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_2ND_ARCH_VAR_PREFIX :=\n>> $(M_TARGET_PREFIX)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CC := $(my_cc)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LINKER := $(my_linker)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CXX := $(my_cxx)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CXX_LINK := $(my_cxx_link)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ASFLAGS := $(my_asflags)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CONLYFLAGS := $(my_conlyflags)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CFLAGS := $(my_cflags)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CPPFLAGS := $(my_cppflags)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CFLAGS_NO_OVERRIDE :=\n>> $(my_cflags_no_override)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CPPFLAGS_NO_OVERRIDE :=\n>> $(my_cppflags_no_override)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_RTTI_FLAG := $(LOCAL_RTTI_FLAG)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_DEBUG_CFLAGS := $(debug_cflags)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_C_INCLUDES := $(my_c_includes)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_IMPORTED_INCLUDES :=\n>> $(imported_includes)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LDFLAGS := $(my_ldflags)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LDLIBS := $(my_ldlibs)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_LDFLAGS :=\n>> $(my_target_global_ldflags)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TIDY_CHECKS := $(my_tidy_checks)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TIDY_FLAGS := $(my_tidy_flags)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ARFLAGS := $(my_arflags)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_SHARED_LIBRARIES :=\n>> $(built_shared_libraries)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_STATIC_LIBRARIES :=\n>> $(built_static_libraries)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_WHOLE_STATIC_LIBRARIES :=\n>> $(built_whole_libraries)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_OBJECTS := $(strip\n>> $(all_objects))\n>> > +\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ARM_CFLAGS :=\n>> $(normal_objects_cflags)\n>> > +\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_LIBCRT_BUILTINS :=\n>> $(my_target_libcrt_builtins)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_LIBATOMIC :=\n>> $(my_target_libatomic)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_CRTBEGIN_SO_O :=\n>> $(my_target_crtbegin_so_o)\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_CRTEND_SO_O :=\n>> $(my_target_crtend_so_o)\n>> > +##\n>> > +\n>> > +define m-lld-flags\n>> > +  -nostdlib -Wl,--gc-sections \\\n>> > +  $(PRIVATE_TARGET_CRTBEGIN_SO_O) \\\n>> > +  $(PRIVATE_ALL_OBJECTS) \\\n>> > +  -Wl,--whole-archive \\\n>> > +  $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \\\n>> > +  -Wl,--no-whole-archive \\\n>> > +  $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \\\n>> > +  $(PRIVATE_ALL_STATIC_LIBRARIES) \\\n>> > +  $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \\\n>> > +  $(if $(filter\n>> true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \\\n>> > +  $(PRIVATE_TARGET_LIBCRT_BUILTINS) \\\n>> > +  $(PRIVATE_TARGET_LIBATOMIC) \\\n>> > +  $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \\\n>> > +  $(PRIVATE_LDFLAGS) \\\n>> > +  $(PRIVATE_ALL_SHARED_LIBRARIES) \\\n>> > +  $(PRIVATE_TARGET_CRTEND_SO_O) \\\n>> > +  $(PRIVATE_LDLIBS)\n>> > +endef\n>> > +\n>> > +define m-lld-flags-cleaned\n>> > +  $(subst prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/, \\\n>> > +  $(subst out/,$(AOSP_ABSOLUTE_PATH)/out/,             \\\n>> > +  $(subst -Wl$(comma)--fatal-warnings,,                \\\n>> > +  $(subst -Wl$(comma)--no-undefined-version,,          \\\n>> > +  $(subst -Wl$(comma)--gc-sections,,                   \\\n>> > +  $(patsubst %dummy.o,,                                \\\n>> > +    $(m-lld-flags)))))))\n>> > +endef\n>> > +\n>> > +define m-cpp-flags\n>> > +  $(PRIVATE_TARGET_GLOBAL_CFLAGS) \\\n>> > +  $(PRIVATE_TARGET_GLOBAL_CPPFLAGS) \\\n>> > +  $(PRIVATE_ARM_CFLAGS) \\\n>> > +  $(PRIVATE_RTTI_FLAG) \\\n>> > +  $(PRIVATE_CFLAGS) \\\n>> > +  $(PRIVATE_CPPFLAGS) \\\n>> > +  $(PRIVATE_DEBUG_CFLAGS) \\\n>> > +  $(PRIVATE_CFLAGS_NO_OVERRIDE) \\\n>> > +  $(PRIVATE_CPPFLAGS_NO_OVERRIDE)\n>> > +endef\n>> > +\n>> > +define m-c-flags\n>> > +  $(PRIVATE_TARGET_GLOBAL_CFLAGS) \\\n>> > +  $(PRIVATE_TARGET_GLOBAL_CONLYFLAGS) \\\n>> > +  $(PRIVATE_ARM_CFLAGS) \\\n>> > +  $(PRIVATE_CFLAGS) \\\n>> > +  $(PRIVATE_CONLYFLAGS) \\\n>> > +  $(PRIVATE_DEBUG_CFLAGS) \\\n>> > +  $(PRIVATE_CFLAGS_NO_OVERRIDE)\n>> > +endef\n>> > +\n>> > +define filter-c-flags\n>> > +  $(subst -std=gnu++17,, \\\n>> > +  $(subst -fno-rtti,, \\\n>> > +  $(patsubst  -W%,, \\\n>> > +    $1)))\n>> > +endef\n>> > +\n>> > +define m-c-includes-common\n>> > +$(addprefix -I , $(PRIVATE_C_INCLUDES)) \\\n>> > +$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),,\\\n>> > +    $(addprefix -I ,\\\n>> > +        $(filter-out $(PRIVATE_C_INCLUDES), \\\n>> > +            $(PRIVATE_GLOBAL_C_INCLUDES))) \\\n>> > +    $(addprefix -isystem ,\\\n>> > +        $(filter-out $(PRIVATE_C_INCLUDES), \\\n>> > +            $(PRIVATE_GLOBAL_C_SYSTEM_INCLUDES))))\n>> > +endef\n>> > +\n>> > +ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 30; echo $$?), 0)\n>> > +# Android 11+\n>> > +define m-c-includes\n>> > +$(foreach i,$(PRIVATE_IMPORTED_INCLUDES),$(EXPORTS.$(i)))\\\n>> > +$(m-c-includes-common)\n>> > +endef\n>> > +define postprocess-includes\n>> > +endef\n>> > +else\n>> > +# Android 10,9\n>> > +$(MESON_GEN_FILES_TARGET): PRIVATE_IMPORT_INCLUDES :=\n>> $(import_includes)\n>> > +define postprocess-includes\n>> > +     echo \" $$(cat $(PRIVATE_IMPORT_INCLUDES)) \" >\n>> $(MESON_GEN_DIR)/import_includes && \\\n>> > +     sed -i  -e ':a;N;$$!ba;s/\\n/ /g'\n>> \\\n>> > +             -e 's# \\{2,\\}# #g'\n>> \\\n>> > +             -e 's# -isystem # -isystem#g'\n>>  \\\n>> > +             -e 's# -I # -I#g'\n>>  \\\n>> > +             -e 's# -I# -I$(AOSP_ABSOLUTE_PATH)/#g'\n>> \\\n>> > +             -e 's# -isystem# -isystem$(AOSP_ABSOLUTE_PATH)/#g'\n>> \\\n>> > +             -e \"s# #','#g\" $(MESON_GEN_DIR)/import_includes &&\n>> \\\n>> > +     sed -i \"s#<_IMPORT_INCLUDES>#$$(cat\n>> $(MESON_GEN_DIR)/import_includes)#g\" $(MESON_GEN_DIR)/aosp_cross\n>> > +endef\n>> > +define m-c-includes\n>> > +<_IMPORT_INCLUDES> $(m-c-includes-common)\n>> > +endef\n>> > +endif\n>> > +\n>> > +define m-c-abs-includes\n>> > +  $(subst $(space)-isystem,$(space)-isystem$(AOSP_ABSOLUTE_PATH)/, \\\n>> > +  $(subst $(space)-I, -I$(AOSP_ABSOLUTE_PATH)/, \\\n>> > +  $(subst $(space)-I$(space),$(space)-I, \\\n>> > +  $(subst $(space)-isystem$(space),$(space)-isystem, \\\n>> > +    $(strip $(m-c-includes))))))\n>> > +endef\n>> > +\n>> > +$(MESON_GEN_FILES_TARGET):\n>> MESON_GEN_PKGCONFIGS:=$(MESON_GEN_PKGCONFIGS)\n>> > +$(MESON_GEN_FILES_TARGET): MESON_GEN_DIR:=$(MESON_GEN_DIR)\n>> > +$(MESON_GEN_FILES_TARGET): $(sort $(shell find -L $(LIBCAMERA_TOP)\n>> -not -path '*/\\.*'))\n>> > +     mkdir -p $(dir $@)\n>> > +     echo -e \"[properties]\\n\"\n>>                                                         \\\n>> > +             \"c_args = [$(foreach flag, $(call\n>> filter-c-flags,$(m-c-flags) $(m-c-abs-includes)),'$(flag)', )'']\\n\"\n>>      \\\n>> > +             \"cpp_args = [$(foreach flag, $(call\n>> filter-c-flags,$(m-cpp-flags) $(m-c-abs-includes)),'$(flag)', )'']\\n\"\n>>    \\\n>> > +             \"c_link_args = [$(foreach flag,\n>> $(m-lld-flags-cleaned),'$(flag)',)'']\\n\"\n>>       \\\n>> > +             \"cpp_link_args = [$(foreach flag,\n>> $(m-lld-flags-cleaned),'$(flag)',)'']\\n\"\n>>     \\\n>> > +             \"needs_exe_wrapper = true\\n\"\n>>                                                         \\\n>> > +             \"[binaries]\\n\"\n>>                                                         \\\n>> > +             \"ar =\n>> '$(AOSP_ABSOLUTE_PATH)/$($($(M_TARGET_PREFIX))TARGET_AR)'\\n\"\n>>                                 \\\n>> > +             \"c = [$(foreach arg,$(PRIVATE_CC),'$(subst\n>> prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/,$(arg))',)'']\\n\"           \\\n>> > +             \"cpp = [$(foreach arg,$(PRIVATE_CXX),'$(subst\n>> prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/,$(arg))',)'']\\n\"        \\\n>> > +             \"c_ld = 'lld'\\n\"\n>>                                                         \\\n>> > +             \"cpp_ld = 'lld'\\n\\n\"\n>>                                                         \\\n>> > +             \"pkgconfig = ['env', 'PKG_CONFIG_LIBDIR=' +\n>> '$(AOSP_ABSOLUTE_PATH)/$(MESON_GEN_DIR)', '/usr/bin/pkg-config']\\n\\n\" \\\n>> > +             \"llvm-config = '/dev/null'\\n\"\n>>                                                          \\\n>> > +             \"[host_machine]\\n\"\n>>                                                         \\\n>> > +             \"system = 'linux'\\n\"\n>>                                                         \\\n>> > +             \"cpu_family = '$(MESON_CPU_FAMILY)'\\n\"\n>>                                                         \\\n>> > +             \"cpu = '$(MESON_CPU_FAMILY)'\\n\"\n>>                                                          \\\n>> > +             \"endian = 'little'\" > $(dir $@)/aosp_cross\n>> > +\n>> > +     #\n>> > +     $(foreach pkg, $(MESON_GEN_PKGCONFIGS), $(call\n>> create-pkgconfig,$(dir $@),$(word 1, $(subst :, ,$(pkg))),$(word 2, $(subst\n>> :, ,$(pkg)))))\n>> > +     touch $@\n>> > +\n>> > +$(MESON_OUT_DIR)/.build.timestamp: MESON_GEN_NINJA:=$(MESON_GEN_NINJA)\n>> > +$(MESON_OUT_DIR)/.build.timestamp: MESON_BUILD:=$(MESON_BUILD)\n>> > +$(MESON_OUT_DIR)/.build.timestamp: $(MESON_GEN_FILES_TARGET)\n>> $(link_deps)\n>> > +     rm -rf $(dir $@)\n>> > +     mkdir -p $(dir $@)\n>> > +     mkdir -p $(dir $@)/build\n>> > +     # Meson will update timestamps in sources directory, continuously\n>> retriggering the build\n>> > +     # even if nothing changed. Copy sources into intermediate dir to\n>> avoid this effect.\n>> > +     cp -r $(LIBCAMERA_TOP)/* $(dir $@)\n>> > +     $(MESON_GEN_NINJA)\n>> > +     $(MESON_BUILD)\n>> > +     touch $@\n>> > +\n>> > +$(MESON_OUT_DIR)/install/.install.timestamp:\n>> MESON_BUILD:=$(MESON_BUILD)\n>> > +$(MESON_OUT_DIR)/install/.install.timestamp:\n>> $(MESON_OUT_DIR)/.build.timestamp\n>> > +     rm -rf $(dir $@)\n>> > +     mkdir -p $(dir $@)\n>> > +     DESTDIR=$(AOSP_ABSOLUTE_PATH)/$(dir $@) $(MESON_BUILD) install\n>> > +     touch $@\n>> > +\n>> > +$(LIBCAMERA_BINS): $(MESON_OUT_DIR)/install/.install.timestamp\n>> > +     echo \"Build $@\"\n>> > +     touch $@\n>>\n>> --\n>> Regards,\n>>\n>> Laurent Pinchart\n>>\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 71356BD16B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 26 Oct 2022 03:05:53 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C15C662F46;\n\tWed, 26 Oct 2022 05:05:52 +0200 (CEST)","from mail-il1-x12c.google.com (mail-il1-x12c.google.com\n\t[IPv6:2607:f8b0:4864:20::12c])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 50BDF603CF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 Oct 2022 05:05:50 +0200 (CEST)","by mail-il1-x12c.google.com with SMTP id l6so8073970ilq.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 25 Oct 2022 20:05:50 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666753552;\n\tbh=QtSW3PKyEejh7/xJNAXWPb+ihE0uFN1r4APKWv4zUjk=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=Uz4h8/ndAteHVt38tff9Kq21xniksUY0bthBKm3Uv5qy/NV/0XC+E/3Z9tD3PgqfK\n\tcFKeQpB/LcwxhX1dpYX5bWSc6xq7RQV7cxP/9wbQOoE9Vvnb5m9CwVDSYk9Kj22Pjp\n\t6jrg8q2FET1bfxLq0JL0Gs7T/k8EBdGob0D4N0AZF1RlcZfKzUJPBLZr212BHs96T6\n\twGgJAUc3WQL4st8lmmNIcRbWXqcqiEsixMR0G5YzpRxfCvjYs6wbUKr4NlgtFZjY8B\n\tq7fSJdtYAJ4KM3ZM1sgYu/9IxqoQk/nUhvxOT/9lJnVZI0/LYP8ct6syK/9jVwXfMG\n\thrz5p+eEHzQQg==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=rothemail-net.20210112.gappssmtp.com; s=20210112;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=OiAQANrSmwldXAZjRvUSXD0bzr/+2kffJUpBxSg7/1s=;\n\tb=OTn/+27gnlNL5MxA8f11w5fdz4eKz+plIIq3y03k5hpx5+zSUgpdP+7OuOyjOl/HZT\n\t3JyRS9rfjrxiaJ4R5mmmHOuhwfCPN26dNLIetwkpWE4UVX3/a/QjoU2n86sNs1o5Iw3X\n\tADxCOO1Z7ixEbfYAe7wljwtN05+UAdRoxT5hnpPzhWNym2xksfIdlUmimcoqnY0Jx3xV\n\txRmbL1waze0Pks8GBYegmkPgCCVDGhCEqgH2uCLJZMcljjVJhUPExik3YNgX0nSJfn8n\n\t2TEK8Hi4a8r1mM4evhVsmtdCkq5lv/AYfcMR2Quqr6k1KMJNMAWTeDcmNhevmi9VaHQX\n\tVYtg=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected)\n\theader.d=rothemail-net.20210112.gappssmtp.com\n\theader.i=@rothemail-net.20210112.gappssmtp.com header.b=\"OTn/+27g\"; \n\tdkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=OiAQANrSmwldXAZjRvUSXD0bzr/+2kffJUpBxSg7/1s=;\n\tb=FI4jKjKc159HouRcVEFNvtDj4ioPuGmnjeEoWaAeYoS2KnJmoIN+L9k52y2w+Po5yp\n\tuwk9IUlhJxy+JmnTFhmE1ybHWYsM1aZUHHUEpUv3U5oCCe8/o4P+TZMM47nJn2wpsEm/\n\tLcrPtR2NcebsYHdsyg6L6Wws9DyOgUfHsF97Y/uyp3WvGNURGLUgI6wJH4OHATXaPwft\n\t8jXc0kg8RGwljZrRoz/HGqwYzJ6y8xjuvat0WPYqFvobF4seqtup65ZBW6xu/KWyuavK\n\tjBH6GAI6kphWn2SQMT4YNcTqg9MoD54LLml5h9zUf6FlTR9e5ggqg7OUON0Go5wx8/aN\n\tZEDA==","X-Gm-Message-State":"ACrzQf0DJ8hzq735/FTwvDr/RF+paY8SXhdFdFUc9n+oJOXAn03dxplT\n\tfadfYm3aCay+1eetf7AWyCD+i+gITchutKSjv8uWq3C3ixA1Iw==","X-Google-Smtp-Source":"AMsMyM5NYD2Bgj4ea+awusqwYJH8qmGMB/UsaVCSGs48eh52XLb2fj3Bp3TCn56992sZDVgnwUKIhhfJZ9HZjLVfqSo=","X-Received":"by 2002:a05:6e02:1bab:b0:2fa:2cfb:80e3 with SMTP id\n\tn11-20020a056e021bab00b002fa2cfb80e3mr24544984ili.24.1666753548751;\n\tTue, 25 Oct 2022 20:05:48 -0700 (PDT)","MIME-Version":"1.0","References":"<20221024055543.116040-1-nicholas@rothemail.net>\n\t<20221024055543.116040-10-nicholas@rothemail.net>\n\t<Y1coz2lb03qqCu30@pendragon.ideasonboard.com>\n\t<CAD2rFCrwdoHvTOnK9sORF35OB1z=w452HYd8Vn+VvAbLLhbBKQ@mail.gmail.com>","In-Reply-To":"<CAD2rFCrwdoHvTOnK9sORF35OB1z=w452HYd8Vn+VvAbLLhbBKQ@mail.gmail.com>","Date":"Tue, 25 Oct 2022 22:05:38 -0500","Message-ID":"<CAD2rFCrPqLRAuFj1mSTkUzL15TKckVhvKOfadTnqW1QVk8W31A@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>, \n\tKieran Bingham <kieran.bingham@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"00000000000033b4b105ebe74d51\"","Subject":"Re: [libcamera-devel] [PATCH 09/11] Adds Android makefiles to build\n\tlibcamera inline with AOSP.","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Nicholas Roth via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Nicholas Roth <nicholas@rothemail.net>","Cc":"Nicholas Roth via libcamera-devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25593,"web_url":"https://patchwork.libcamera.org/comment/25593/","msgid":"<166677580075.3974115.709677145521307073@Monstersaurus>","date":"2022-10-26T09:16:40","subject":"Re: [libcamera-devel] [PATCH 09/11] Adds Android makefiles to build\n\tlibcamera inline with AOSP.","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Nicholas Roth (2022-10-26 04:05:38)\n> +Kieran Bingham <kieran.bingham@ideasonboard.com> since Laurent is out.\n> \n> \n> On Tue, Oct 25, 2022 at 9:22 PM Nicholas Roth <nicholas@rothemail.net>\n> wrote:\n> \n> > > The two files list third party copyrights, could you please indicate in\n> > > the commit message where that comes from ? A link to a git tree with the\n> > > code you started from would be good.\n> > Happy to:\n> > https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/android/mesa3d_cross.mk.\n> > I'll make sure to include this in the commit message.\n> >\n> > > I assume this variable, as well as BOARD_LIBCAMERA_IPAS and\n> > > BOARD_LIBCAMERA_PIPELINES, need to be defined externally. It would be\n> > > nice to add some Android build documentation to the Documentation/\n> > > directory.\n> > As this review is already quite large, I've created Bug 164 to track this.\n> > For now, would it be possible to link to my doc that covers this\n> > https://docs.google.com/document/d/1Sly_VH3w6wFIdE72WXijQegoHZh8IxEnJ9m0hH7GodU/edit\n> > and reference Bug 164 in the commit message?\n\nI think that's OK for the short term, but we won't be likely to review\nthe document or process until it's posted to the list.\n\n(Perhaps you don't want it reviewed yet, so that's not a problem).\n\n> > >> +LOCAL_PATH := $(call my-dir)\n> > >> +LIBCAMERA_TOP := $(dir $(LOCAL_PATH))\n> > >> +LIBCAMERA_MESON_VERSION := .0.0.1\n> > > Is this something that can be provided by meson, to avoid hardcoding\n> > > version numbers in multiple places ? Or can the utils/gen-version.sh\n> > > script help ?\n> > I will investigate whether utils/gen-version.sh can help. I believe\n> > running shell scripts is deprecated, but my copy commands at the bottom of\n> > Android.mk do the trick, so it _might_ work, at least for now.\n> >\n> > > It would also be nice to avoid hardcoding the list of IPA modules (and\n> > > other files below), but I suppose that would be difficult ? Or could\n> > > 'meson install' be used to install the files to a directory that would\n> > > then be picked by the Android build system ?\n> > We already \"meson install\" the files to a known location. Those files have\n> > to be explicitly accessed, though, because Android needs to transform the\n> > .so files after they are built with Makefile targets. This is also why\n> > signature verification fundamentally does not work on Android.\n\nCan the signatures be resigned at a final stage after they are stripped?\n\n> >\n> > Thanks for your thoughtful responses.\n> >\n> > -Nicholas\n> >\n> > On Mon, Oct 24, 2022 at 7:08 PM Laurent Pinchart <\n> > laurent.pinchart@ideasonboard.com> wrote:\n> >\n> >> Hi Nicholas,\n> >>\n> >> Thank you for the patch.\n> >>\n> >> On Mon, Oct 24, 2022 at 12:55:41AM -0500, Nicholas Roth via\n> >> libcamera-devel wrote:\n> >> > From: Nicholas Roth <nicholas@rothemail.net>\n> >>\n> >> The two files list third party copyrights, could you please indicate in\n> >> the commit message where that comes from ? A link to a git tree with the\n> >> code you started from would be good.\n> >>\n> >> > ---\n> >> >  android/Android.mk     |  86 ++++++++++++\n> >> >  android/meson_cross.mk | 296 +++++++++++++++++++++++++++++++++++++++++\n> >> >  2 files changed, 382 insertions(+)\n> >> >  create mode 100644 android/Android.mk\n> >> >  create mode 100644 android/meson_cross.mk\n> >> >\n> >> > diff --git a/android/Android.mk b/android/Android.mk\n> >> > new file mode 100644\n> >> > index 00000000..ff0d1472\n> >> > --- /dev/null\n> >> > +++ b/android/Android.mk\n> >> > @@ -0,0 +1,86 @@\n> >> > +# SPDX-License-Identifier: Apache-2.0\n> >> > +#\n> >> > +# Copyright (C) 2021, GlobalLogic Ukraine\n> >> > +# Copyright (C) 2021, Roman Stratiienko (r.stratiienko@gmail.com)\n> >> > +#\n> >> > +# Android.mk - Android makefile\n> >> > +#\n> >> > +\n> >> > +ifneq ($(filter true, $(BOARD_LIBCAMERA_USES_MESON_BUILD)),)\n> >>\n> >> I assume this variable, as well as BOARD_LIBCAMERA_IPAS and\n> >> BOARD_LIBCAMERA_PIPELINES, need to be defined externally. It would be\n> >> nice to add some Android build documentation to the Documentation/\n> >> directory.\n> >>\n> >> > +\n> >> > +LOCAL_PATH := $(call my-dir)\n> >> > +LIBCAMERA_TOP := $(dir $(LOCAL_PATH))\n> >> > +LIBCAMERA_MESON_VERSION := .0.0.1\n> >>\n> >> Is this something that can be provided by meson, to avoid hardcoding\n> >> version numbers in multiple places ? Or can the utils/gen-version.sh\n> >> script help ?\n> >>\n> >> > +\n> >> > +include $(CLEAR_VARS)\n> >> > +\n> >> > +LOCAL_SHARED_LIBRARIES := libc libexif libjpeg libyuv_chromium libdl\n> >> libyaml\n> >> > +MESON_GEN_PKGCONFIGS := libexif libjpeg yaml-0.1 libyuv dl\n> >> > +\n> >> > +ifeq ($(TARGET_IS_64_BIT),true)\n> >> > +LOCAL_MULTILIB := 64\n> >> > +else\n> >> > +LOCAL_MULTILIB := 32\n> >> > +endif\n> >> > +include $(LOCAL_PATH)/meson_cross.mk\n> >> > +\n> >> > +ifdef TARGET_2ND_ARCH\n> >> > +LOCAL_MULTILIB := 32\n> >> > +include $(LOCAL_PATH)/meson_cross.mk\n> >> > +endif\n> >> > +\n> >> >\n> >> +#-------------------------------------------------------------------------------\n> >> > +\n> >> > +define libcamera-lib\n> >> > +LOCAL_MODULE_CLASS := SHARED_LIBRARIES\n> >> > +LOCAL_MODULE := $1\n> >> > +LOCAL_VENDOR_MODULE := true\n> >> > +LOCAL_MODULE_RELATIVE_PATH := $2\n> >> > +ifdef TARGET_2ND_ARCH\n> >> > +LOCAL_SRC_FILES_$(TARGET_ARCH) := $(call\n> >> relative_top_path,$(LOCAL_PATH))$($3)\n> >> > +LOCAL_SRC_FILES_$(TARGET_2ND_ARCH) := $(call\n> >> relative_top_path,$(LOCAL_PATH))$(2ND_$3)\n> >> > +LOCAL_MULTILIB := both\n> >> > +else\n> >> > +LOCAL_SRC_FILES := $(call relative_top_path,$(LOCAL_PATH))$($3)\n> >> > +endif\n> >> > +LOCAL_CHECK_ELF_FILES := false\n> >> > +LOCAL_MODULE_SUFFIX := .so$(${4})\n> >> > +include $(BUILD_PREBUILT)\n> >> > +include $(CLEAR_VARS)\n> >> > +endef\n> >> > +\n> >> > +__MY_SHARED_LIBRARIES := $(LOCAL_SHARED_LIBRARIES)\n> >> > +include $(CLEAR_VARS)\n> >> > +LOCAL_SHARED_LIBRARIES := $(__MY_SHARED_LIBRARIES)\n> >> > +\n> >> > +# Modules 'libcamera', produces '/vendor/lib{64}/libcamera.so'\n> >> > +$(eval $(call\n> >> libcamera-lib,libcamera,,LIBCAMERA_BIN,LIBCAMERA_MESON_VERSION))\n> >> > +# Modules 'libcamera-base', produces\n> >> '/vendor/lib{64}/libcamera-base.so'\n> >> > +$(eval $(call\n> >> libcamera-lib,libcamera-base,,LIBCAMERA_BASE_BIN,LIBCAMERA_MESON_VERSION))\n> >> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_rkisp1.so'\n> >> > +$(eval $(call libcamera-lib,ipa_rkisp1,,LIBCAMERA_IPA_RKISP1_BIN,))\n> >>\n> >> It would also be nice to avoid hardcoding the list of IPA modules (and\n> >> other files below), but I suppose that would be difficult ? Or could\n> >> 'meson install' be used to install the files to a directory that would\n> >> then be picked by the Android build system ?\n> >>\n> >> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_rpi.so'\n> >> > +$(eval $(call libcamera-lib,ipa_rpi,,LIBCAMERA_IPA_RASPBERRYPI_BIN,))\n> >> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_ipu3.so'\n> >> > +$(eval $(call libcamera-lib,ipa_ipu3,,LIBCAMERA_IPA_IPU3_BIN,))\n> >> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_vimc.so'\n> >> > +$(eval $(call libcamera-lib,ipa_vimc,,LIBCAMERA_IPA_VIMC_BIN,))\n> >> > +\n> >> > +# Modules 'camera.libcamera', produces '/vendor/lib{64}/hw/\n> >> camera.libcamera.so' HAL\n> >> > +$(eval $(call libcamera-lib,camera.libcamera,hw,LIBCAMERA_HAL_BIN,))\n> >> > +\n> >> > +LOCAL_SHARED_LIBRARIES += libcamera libcamera-base ipa_rkisp1 ipa_rpi\n> >> ipa_ipu3 ipa_vimc\n> >> > +LOCAL_REQUIRED_MODULES := libcamera libcamera-base ipa_rkisp1 ipa_rpi\n> >> ipa_ipu3 ipa_vimc\n> >> > +\n> >> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/rkisp1/)\n> >> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/rpi/)\n> >> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/ipu3/)\n> >> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/vimc/)\n> >> > +$(shell cp $(LIBCAMERA_IPA_RKISP1_CONFIGS)/*\n> >> $(TARGET_OUT_VENDOR_ETC)/rkisp1/)\n> >> > +$(shell cp $(LIBCAMERA_IPA_RASPBERRYPI_CONFIGS)/*\n> >> $(TARGET_OUT_VENDOR_ETC)/rpi/)\n> >> > +$(shell cp $(LIBCAMERA_IPA_IPU3_CONFIGS)/*\n> >> $(TARGET_OUT_VENDOR_ETC)/ipu3/)\n> >> > +$(shell cp $(LIBCAMERA_IPA_VIMC_CONFIGS)/*\n> >> $(TARGET_OUT_VENDOR_ETC)/vimc/)\n> >> > +\n> >> >\n> >> +#-------------------------------------------------------------------------------\n> >> > +\n> >> > +endif\n> >> > diff --git a/android/meson_cross.mk b/android/meson_cross.mk\n> >> > new file mode 100644\n> >> > index 00000000..bb1661cd\n> >> > --- /dev/null\n> >> > +++ b/android/meson_cross.mk\n> >> > @@ -0,0 +1,296 @@\n> >> > +# SPDX-License-Identifier: Apache-2.0\n> >> > +#\n> >> > +# Copyright (C) 2021, GlobalLogic Ukraine\n> >> > +# Copyright (C) 2021, Roman Stratiienko (r.stratiienko@gmail.com)\n> >> > +#\n> >> > +# meson_cross.mk - Android makefile\n> >> > +#\n> >> > +\n> >> > +# Turn \"dir1/dir2/dir3/dir4\" into \"../../../../\"\n\nI'm not yet sure where / why this is used - but does \"realpath\n--relative-to\" make sense here?\n\n(Not a requierment, just a curiosity).\n\n--\nKieran\n\n\n> >> > +define relative_top_path\n> >> > +$(eval __s:=) \\\n> >> > +$(foreach tmp,$(subst /,$(space),$1),$(eval __s:=$(__s)../)) \\\n> >> > +$(__s)\n> >> > +endef\n> >> > +\n> >> > +MY_PATH := $(call my-dir)\n> >> > +\n> >> > +AOSP_ABSOLUTE_PATH := $(realpath .)\n> >> > +\n> >> > +libcam_m_dummy_$(LOCAL_MULTILIB) :=\n> >> $(TARGET_OUT_INTERMEDIATES)/LIBCAM_DUMMY_$(LOCAL_MULTILIB)/dummy.c\n> >> > +\n> >> > +$(libcam_m_dummy_$(LOCAL_MULTILIB)):\n> >> > +     mkdir -p $(dir $@)\n> >> > +     touch $@\n> >> > +\n> >> > +LOCAL_SRC_FILES := $(call\n> >> relative_top_path,$(MY_PATH))$(libcam_m_dummy_$(LOCAL_MULTILIB))\n> >> > +LOCAL_VENDOR_MODULE := true\n> >> > +LOCAL_MODULE := libcam.dummy.$(LOCAL_MULTILIB)\n> >> > +\n> >> > +# Prepare intermediate variables by AOSP make/core internals\n> >> > +include $(BUILD_SHARED_LIBRARY)\n> >> > +\n> >> > +LOCAL_PATH := $(MY_PATH)\n> >> > +\n> >> > +link_deps := \\\n> >> > +     $(built_static_libraries) \\\n> >> > +     $(built_shared_libraries) \\\n> >> > +     $(built_whole_libraries) \\\n> >> > +     $(strip $(all_objects)) \\\n> >> > +     $(my_target_libatomic) \\\n> >> > +     $(my_target_libcrt_builtins) \\\n> >> > +     $(my_target_crtbegin_so_o) \\\n> >> > +     $(my_target_crtend_so_o)\n> >> > +\n> >> > +# Build using intermediate variables provided by AOSP make/core\n> >> internals\n> >> > +M_TARGET_PREFIX := $(my_2nd_arch_prefix)\n> >> > +\n> >> > +LIBCAMERA_LIB_DIR := lib$(subst 32,,$(LOCAL_MULTILIB))\n> >> > +\n> >> > +MESON_OUT_DIR                            :=\n> >> $($(M_TARGET_PREFIX)TARGET_OUT_INTERMEDIATES)/MESON_LIBCAMERA\n> >> > +MESON_GEN_DIR                            := $(MESON_OUT_DIR)_GEN\n> >> > +MESON_GEN_FILES_TARGET                   := $(MESON_GEN_DIR)/.timestamp\n> >> > +\n> >> > +$(M_TARGET_PREFIX)LIBCAMERA_BIN :=\n> >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera.so\n> >> > +$(M_TARGET_PREFIX)LIBCAMERA_HAL_BIN :=\n> >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera-hal.so\n> >> > +$(M_TARGET_PREFIX)LIBCAMERA_BASE_BIN :=\n> >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera-base.so\n> >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_BIN :=\n> >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_rkisp1.so\n> >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_BIN :=\n> >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_rpi.so\n> >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_BIN :=\n> >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_ipu3.so\n> >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_BIN :=\n> >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_vimc.so\n> >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_CONFIGS :=\n> >> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/rkisp1\n> >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_CONFIGS :=\n> >> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/raspberrypi\n> >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_CONFIGS :=\n> >> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/ipu3\n> >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_CONFIGS :=\n> >> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/vimc\n> >> > +\n> >> > +LIBCAMERA_BINS := \\\n> >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_BIN) \\\n> >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_HAL_BIN) \\\n> >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_BASE_BIN) \\\n> >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_BIN) \\\n> >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_BIN) \\\n> >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_BIN) \\\n> >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_BIN)\n> >> > +\n> >> > +MESON_GEN_NINJA := \\\n> >> > +     cd $(MESON_OUT_DIR) && PATH=/usr/bin:/usr/local/bin:$$PATH meson\n> >> ./build \\\n> >> > +     --cross-file $(AOSP_ABSOLUTE_PATH)/$(MESON_GEN_DIR)/aosp_cross\n> >>        \\\n> >> > +     --buildtype=release\n> >>         \\\n> >> > +     -Dandroid=enabled\n> >>         \\\n> >> > +     -Dipas=$(subst $(space),$(comma),$(BOARD_LIBCAMERA_IPAS))\n> >>         \\\n> >> > +     -Dpipelines=$(subst\n> >> $(space),$(comma),$(BOARD_LIBCAMERA_PIPELINES))      \\\n> >> > +     -Dsysconfdir=/vendor/etc\n> >>        \\\n> >> > +     -Dtest=false\n> >>        \\\n> >> > +     -Dallow_unsigned_ipas_in_process=true\n> >> > +\n> >> > +MESON_BUILD := PATH=/usr/bin:/bin:/sbin:$$PATH ninja -C\n> >> $(MESON_OUT_DIR)/build\n> >> > +\n> >> > +$(MESON_GEN_FILES_TARGET): MESON_CPU_FAMILY := $(subst\n> >> arm64,aarch64,$(TARGET_$(M_TARGET_PREFIX)ARCH))\n> >> > +\n> >> > +define create-pkgconfig\n> >> > +echo -e \"Name: $2\" \\\n> >> > +     \"\\nDescription: $2\" \\\n> >> > +     \"\\nVersion: $3\" > $1/$2.pc\n> >> > +\n> >> > +endef\n> >> > +\n> >> > +# Taken from build/make/core/binary.mk. We need this\n> >> > +# to use definitions from build/make/core/definitions.mk\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_GLOBAL_C_INCLUDES :=\n> >> $(my_target_global_c_includes)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_GLOBAL_C_SYSTEM_INCLUDES :=\n> >> $(my_target_global_c_system_includes)\n> >> > +\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CFLAGS :=\n> >> $(my_target_global_cflags)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CONLYFLAGS :=\n> >> $(my_target_global_conlyflags)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CPPFLAGS :=\n> >> $(my_target_global_cppflags)\n> >> > +\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_2ND_ARCH_VAR_PREFIX :=\n> >> $(M_TARGET_PREFIX)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CC := $(my_cc)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LINKER := $(my_linker)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CXX := $(my_cxx)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CXX_LINK := $(my_cxx_link)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ASFLAGS := $(my_asflags)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CONLYFLAGS := $(my_conlyflags)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CFLAGS := $(my_cflags)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CPPFLAGS := $(my_cppflags)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CFLAGS_NO_OVERRIDE :=\n> >> $(my_cflags_no_override)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CPPFLAGS_NO_OVERRIDE :=\n> >> $(my_cppflags_no_override)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_RTTI_FLAG := $(LOCAL_RTTI_FLAG)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_DEBUG_CFLAGS := $(debug_cflags)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_C_INCLUDES := $(my_c_includes)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_IMPORTED_INCLUDES :=\n> >> $(imported_includes)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LDFLAGS := $(my_ldflags)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LDLIBS := $(my_ldlibs)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_LDFLAGS :=\n> >> $(my_target_global_ldflags)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TIDY_CHECKS := $(my_tidy_checks)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TIDY_FLAGS := $(my_tidy_flags)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ARFLAGS := $(my_arflags)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_SHARED_LIBRARIES :=\n> >> $(built_shared_libraries)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_STATIC_LIBRARIES :=\n> >> $(built_static_libraries)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_WHOLE_STATIC_LIBRARIES :=\n> >> $(built_whole_libraries)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_OBJECTS := $(strip\n> >> $(all_objects))\n> >> > +\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ARM_CFLAGS :=\n> >> $(normal_objects_cflags)\n> >> > +\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_LIBCRT_BUILTINS :=\n> >> $(my_target_libcrt_builtins)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_LIBATOMIC :=\n> >> $(my_target_libatomic)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_CRTBEGIN_SO_O :=\n> >> $(my_target_crtbegin_so_o)\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_CRTEND_SO_O :=\n> >> $(my_target_crtend_so_o)\n> >> > +##\n> >> > +\n> >> > +define m-lld-flags\n> >> > +  -nostdlib -Wl,--gc-sections \\\n> >> > +  $(PRIVATE_TARGET_CRTBEGIN_SO_O) \\\n> >> > +  $(PRIVATE_ALL_OBJECTS) \\\n> >> > +  -Wl,--whole-archive \\\n> >> > +  $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \\\n> >> > +  -Wl,--no-whole-archive \\\n> >> > +  $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \\\n> >> > +  $(PRIVATE_ALL_STATIC_LIBRARIES) \\\n> >> > +  $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \\\n> >> > +  $(if $(filter\n> >> true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \\\n> >> > +  $(PRIVATE_TARGET_LIBCRT_BUILTINS) \\\n> >> > +  $(PRIVATE_TARGET_LIBATOMIC) \\\n> >> > +  $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \\\n> >> > +  $(PRIVATE_LDFLAGS) \\\n> >> > +  $(PRIVATE_ALL_SHARED_LIBRARIES) \\\n> >> > +  $(PRIVATE_TARGET_CRTEND_SO_O) \\\n> >> > +  $(PRIVATE_LDLIBS)\n> >> > +endef\n> >> > +\n> >> > +define m-lld-flags-cleaned\n> >> > +  $(subst prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/, \\\n> >> > +  $(subst out/,$(AOSP_ABSOLUTE_PATH)/out/,             \\\n> >> > +  $(subst -Wl$(comma)--fatal-warnings,,                \\\n> >> > +  $(subst -Wl$(comma)--no-undefined-version,,          \\\n> >> > +  $(subst -Wl$(comma)--gc-sections,,                   \\\n> >> > +  $(patsubst %dummy.o,,                                \\\n> >> > +    $(m-lld-flags)))))))\n> >> > +endef\n> >> > +\n> >> > +define m-cpp-flags\n> >> > +  $(PRIVATE_TARGET_GLOBAL_CFLAGS) \\\n> >> > +  $(PRIVATE_TARGET_GLOBAL_CPPFLAGS) \\\n> >> > +  $(PRIVATE_ARM_CFLAGS) \\\n> >> > +  $(PRIVATE_RTTI_FLAG) \\\n> >> > +  $(PRIVATE_CFLAGS) \\\n> >> > +  $(PRIVATE_CPPFLAGS) \\\n> >> > +  $(PRIVATE_DEBUG_CFLAGS) \\\n> >> > +  $(PRIVATE_CFLAGS_NO_OVERRIDE) \\\n> >> > +  $(PRIVATE_CPPFLAGS_NO_OVERRIDE)\n> >> > +endef\n> >> > +\n> >> > +define m-c-flags\n> >> > +  $(PRIVATE_TARGET_GLOBAL_CFLAGS) \\\n> >> > +  $(PRIVATE_TARGET_GLOBAL_CONLYFLAGS) \\\n> >> > +  $(PRIVATE_ARM_CFLAGS) \\\n> >> > +  $(PRIVATE_CFLAGS) \\\n> >> > +  $(PRIVATE_CONLYFLAGS) \\\n> >> > +  $(PRIVATE_DEBUG_CFLAGS) \\\n> >> > +  $(PRIVATE_CFLAGS_NO_OVERRIDE)\n> >> > +endef\n> >> > +\n> >> > +define filter-c-flags\n> >> > +  $(subst -std=gnu++17,, \\\n> >> > +  $(subst -fno-rtti,, \\\n> >> > +  $(patsubst  -W%,, \\\n> >> > +    $1)))\n> >> > +endef\n> >> > +\n> >> > +define m-c-includes-common\n> >> > +$(addprefix -I , $(PRIVATE_C_INCLUDES)) \\\n> >> > +$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),,\\\n> >> > +    $(addprefix -I ,\\\n> >> > +        $(filter-out $(PRIVATE_C_INCLUDES), \\\n> >> > +            $(PRIVATE_GLOBAL_C_INCLUDES))) \\\n> >> > +    $(addprefix -isystem ,\\\n> >> > +        $(filter-out $(PRIVATE_C_INCLUDES), \\\n> >> > +            $(PRIVATE_GLOBAL_C_SYSTEM_INCLUDES))))\n> >> > +endef\n> >> > +\n> >> > +ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 30; echo $$?), 0)\n> >> > +# Android 11+\n> >> > +define m-c-includes\n> >> > +$(foreach i,$(PRIVATE_IMPORTED_INCLUDES),$(EXPORTS.$(i)))\\\n> >> > +$(m-c-includes-common)\n> >> > +endef\n> >> > +define postprocess-includes\n> >> > +endef\n> >> > +else\n> >> > +# Android 10,9\n> >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_IMPORT_INCLUDES :=\n> >> $(import_includes)\n> >> > +define postprocess-includes\n> >> > +     echo \" $$(cat $(PRIVATE_IMPORT_INCLUDES)) \" >\n> >> $(MESON_GEN_DIR)/import_includes && \\\n> >> > +     sed -i  -e ':a;N;$$!ba;s/\\n/ /g'\n> >> \\\n> >> > +             -e 's# \\{2,\\}# #g'\n> >> \\\n> >> > +             -e 's# -isystem # -isystem#g'\n> >>  \\\n> >> > +             -e 's# -I # -I#g'\n> >>  \\\n> >> > +             -e 's# -I# -I$(AOSP_ABSOLUTE_PATH)/#g'\n> >> \\\n> >> > +             -e 's# -isystem# -isystem$(AOSP_ABSOLUTE_PATH)/#g'\n> >> \\\n> >> > +             -e \"s# #','#g\" $(MESON_GEN_DIR)/import_includes &&\n> >> \\\n> >> > +     sed -i \"s#<_IMPORT_INCLUDES>#$$(cat\n> >> $(MESON_GEN_DIR)/import_includes)#g\" $(MESON_GEN_DIR)/aosp_cross\n> >> > +endef\n> >> > +define m-c-includes\n> >> > +<_IMPORT_INCLUDES> $(m-c-includes-common)\n> >> > +endef\n> >> > +endif\n> >> > +\n> >> > +define m-c-abs-includes\n> >> > +  $(subst $(space)-isystem,$(space)-isystem$(AOSP_ABSOLUTE_PATH)/, \\\n> >> > +  $(subst $(space)-I, -I$(AOSP_ABSOLUTE_PATH)/, \\\n> >> > +  $(subst $(space)-I$(space),$(space)-I, \\\n> >> > +  $(subst $(space)-isystem$(space),$(space)-isystem, \\\n> >> > +    $(strip $(m-c-includes))))))\n> >> > +endef\n> >> > +\n> >> > +$(MESON_GEN_FILES_TARGET):\n> >> MESON_GEN_PKGCONFIGS:=$(MESON_GEN_PKGCONFIGS)\n> >> > +$(MESON_GEN_FILES_TARGET): MESON_GEN_DIR:=$(MESON_GEN_DIR)\n> >> > +$(MESON_GEN_FILES_TARGET): $(sort $(shell find -L $(LIBCAMERA_TOP)\n> >> -not -path '*/\\.*'))\n> >> > +     mkdir -p $(dir $@)\n> >> > +     echo -e \"[properties]\\n\"\n> >>                                                         \\\n> >> > +             \"c_args = [$(foreach flag, $(call\n> >> filter-c-flags,$(m-c-flags) $(m-c-abs-includes)),'$(flag)', )'']\\n\"\n> >>      \\\n> >> > +             \"cpp_args = [$(foreach flag, $(call\n> >> filter-c-flags,$(m-cpp-flags) $(m-c-abs-includes)),'$(flag)', )'']\\n\"\n> >>    \\\n> >> > +             \"c_link_args = [$(foreach flag,\n> >> $(m-lld-flags-cleaned),'$(flag)',)'']\\n\"\n> >>       \\\n> >> > +             \"cpp_link_args = [$(foreach flag,\n> >> $(m-lld-flags-cleaned),'$(flag)',)'']\\n\"\n> >>     \\\n> >> > +             \"needs_exe_wrapper = true\\n\"\n> >>                                                         \\\n> >> > +             \"[binaries]\\n\"\n> >>                                                         \\\n> >> > +             \"ar =\n> >> '$(AOSP_ABSOLUTE_PATH)/$($($(M_TARGET_PREFIX))TARGET_AR)'\\n\"\n> >>                                 \\\n> >> > +             \"c = [$(foreach arg,$(PRIVATE_CC),'$(subst\n> >> prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/,$(arg))',)'']\\n\"           \\\n> >> > +             \"cpp = [$(foreach arg,$(PRIVATE_CXX),'$(subst\n> >> prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/,$(arg))',)'']\\n\"        \\\n> >> > +             \"c_ld = 'lld'\\n\"\n> >>                                                         \\\n> >> > +             \"cpp_ld = 'lld'\\n\\n\"\n> >>                                                         \\\n> >> > +             \"pkgconfig = ['env', 'PKG_CONFIG_LIBDIR=' +\n> >> '$(AOSP_ABSOLUTE_PATH)/$(MESON_GEN_DIR)', '/usr/bin/pkg-config']\\n\\n\" \\\n> >> > +             \"llvm-config = '/dev/null'\\n\"\n> >>                                                          \\\n> >> > +             \"[host_machine]\\n\"\n> >>                                                         \\\n> >> > +             \"system = 'linux'\\n\"\n> >>                                                         \\\n> >> > +             \"cpu_family = '$(MESON_CPU_FAMILY)'\\n\"\n> >>                                                         \\\n> >> > +             \"cpu = '$(MESON_CPU_FAMILY)'\\n\"\n> >>                                                          \\\n> >> > +             \"endian = 'little'\" > $(dir $@)/aosp_cross\n> >> > +\n> >> > +     #\n> >> > +     $(foreach pkg, $(MESON_GEN_PKGCONFIGS), $(call\n> >> create-pkgconfig,$(dir $@),$(word 1, $(subst :, ,$(pkg))),$(word 2, $(subst\n> >> :, ,$(pkg)))))\n> >> > +     touch $@\n> >> > +\n> >> > +$(MESON_OUT_DIR)/.build.timestamp: MESON_GEN_NINJA:=$(MESON_GEN_NINJA)\n> >> > +$(MESON_OUT_DIR)/.build.timestamp: MESON_BUILD:=$(MESON_BUILD)\n> >> > +$(MESON_OUT_DIR)/.build.timestamp: $(MESON_GEN_FILES_TARGET)\n> >> $(link_deps)\n> >> > +     rm -rf $(dir $@)\n> >> > +     mkdir -p $(dir $@)\n> >> > +     mkdir -p $(dir $@)/build\n> >> > +     # Meson will update timestamps in sources directory, continuously\n> >> retriggering the build\n> >> > +     # even if nothing changed. Copy sources into intermediate dir to\n> >> avoid this effect.\n> >> > +     cp -r $(LIBCAMERA_TOP)/* $(dir $@)\n> >> > +     $(MESON_GEN_NINJA)\n> >> > +     $(MESON_BUILD)\n> >> > +     touch $@\n> >> > +\n> >> > +$(MESON_OUT_DIR)/install/.install.timestamp:\n> >> MESON_BUILD:=$(MESON_BUILD)\n> >> > +$(MESON_OUT_DIR)/install/.install.timestamp:\n> >> $(MESON_OUT_DIR)/.build.timestamp\n> >> > +     rm -rf $(dir $@)\n> >> > +     mkdir -p $(dir $@)\n> >> > +     DESTDIR=$(AOSP_ABSOLUTE_PATH)/$(dir $@) $(MESON_BUILD) install\n> >> > +     touch $@\n> >> > +\n> >> > +$(LIBCAMERA_BINS): $(MESON_OUT_DIR)/install/.install.timestamp\n> >> > +     echo \"Build $@\"\n> >> > +     touch $@\n> >>\n> >> --\n> >> Regards,\n> >>\n> >> Laurent Pinchart\n> >>\n> >","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 3E4F2BD16B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 26 Oct 2022 09:16:46 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5996962F50;\n\tWed, 26 Oct 2022 11:16:45 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8508962ED0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 Oct 2022 11:16:43 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 054EF4F8;\n\tWed, 26 Oct 2022 11:16:42 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666775805;\n\tbh=BNo/oPJcUY9kGZHYq499Bp78UnLeV/d/IZxb0PgfnnE=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=qV2zrW0fMBROOfrdISn++EHxIJwPFOwE3pQ+cB+ZXcjd8hyCmCpopE2mbTiIlxi3m\n\tJyj1/McNE3txadBdViFxlfeSAB0R2ckn3q3go/3lV/ZkcJ78Apjh8/LDPdpz8N67sW\n\tMoUfHz9uh3pLtMzeeo+9vzYIMXJcXg8yBzGcxRG39z9TFksQXCqlI+eL/MMv8PVOlw\n\t04kpH8Z38DX+gWnNTE6O8s9FAqzW1BqSrKFTEpDqRmxgE1RnWQfShCe2dF8OJsqadX\n\tFlhBIYJCcSER7NF+/wwXLKyCnwjY4+gwrEF68FbeCkmaic6J1Yf/B2H7POw3UgTpkH\n\tkTVNaVOkS6qmw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1666775803;\n\tbh=BNo/oPJcUY9kGZHYq499Bp78UnLeV/d/IZxb0PgfnnE=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=MzTuWvQDX6o3ceD9fgpnlrir7WDaQeziCZ6bQk/DNlAlvl9rEGuTf7YUefzbdINZ3\n\tHibCZvq4FOch7VRMCyzzPlDHKzKfOEh3ljKnaksFOqrI/8K+BUDn6aq/n9QDe5jEIb\n\tRl5BoKqKHrEhS4aKPA9+KXyjdTTPYVAUUMTc8eyg="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"MzTuWvQD\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<CAD2rFCrPqLRAuFj1mSTkUzL15TKckVhvKOfadTnqW1QVk8W31A@mail.gmail.com>","References":"<20221024055543.116040-1-nicholas@rothemail.net>\n\t<20221024055543.116040-10-nicholas@rothemail.net>\n\t<Y1coz2lb03qqCu30@pendragon.ideasonboard.com>\n\t<CAD2rFCrwdoHvTOnK9sORF35OB1z=w452HYd8Vn+VvAbLLhbBKQ@mail.gmail.com>\n\t<CAD2rFCrPqLRAuFj1mSTkUzL15TKckVhvKOfadTnqW1QVk8W31A@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tNicholas Roth <nicholas@rothemail.net>","Date":"Wed, 26 Oct 2022 10:16:40 +0100","Message-ID":"<166677580075.3974115.709677145521307073@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH 09/11] Adds Android makefiles to build\n\tlibcamera inline with AOSP.","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Nicholas Roth via libcamera-devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25606,"web_url":"https://patchwork.libcamera.org/comment/25606/","msgid":"<CAD2rFCpAwatM4xPX6ZXmKia_jwMSM3xOQpNQMLfRToRA1PayJQ@mail.gmail.com>","date":"2022-10-26T15:29:33","subject":"Re: [libcamera-devel] [PATCH 09/11] Adds Android makefiles to build\n\tlibcamera inline with AOSP.","submitter":{"id":137,"url":"https://patchwork.libcamera.org/api/people/137/","name":"Nicholas Roth","email":"nicholas@rothemail.net"},"content":"> (Perhaps you don't want it reviewed yet, so that's not a problem).\nThat's exactly correct!\n\n>Can the signatures be resigned at a final stage after they are stripped?\nThat happens deep in the bowels of Android's build system. There is no\ndocumented way to do this, but it may be theoretically possible, especially\nif distribution maintainers are willing to fork or patch the Android build\nsystem itself. I can imagine this might create a high maintenance burden\nthough. The high-level API people are supposed to use is:\n\ninclude $(CLEAR_VARS)\nLOCAL_MODULE := foo-prebuilt\nLOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so\nLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include\ninclude $(PREBUILT_SHARED_LIBRARY)\n\nfrom https://developer.android.com/ndk/guides/prebuilts.\n\nPREBUILT_SHARED_LIBRARY, or BUILD_PREBUILT as we use in our makefile, is\nwhat does the transformations. Maybe there's a clean way to influence its\nbehavior and I'm just not familiar enough with the Android make-based build\nsystem to know what it is, although my intuition is that this would be\nunlikely and perhaps considered undesirable by the Android engprod team.\n\n> I'm not yet sure where / why this is used - but does \"realpath\n> --relative-to\" make sense here?\nThis provides a relative path to the build directory IIRC (heading out to a\nmeeting right now).\n\n-Nicholas\n\n\nOn Wed, Oct 26, 2022 at 4:16 AM Kieran Bingham <\nkieran.bingham@ideasonboard.com> wrote:\n\n> Quoting Nicholas Roth (2022-10-26 04:05:38)\n> > +Kieran Bingham <kieran.bingham@ideasonboard.com> since Laurent is out.\n> >\n> >\n> > On Tue, Oct 25, 2022 at 9:22 PM Nicholas Roth <nicholas@rothemail.net>\n> > wrote:\n> >\n> > > > The two files list third party copyrights, could you please indicate\n> in\n> > > > the commit message where that comes from ? A link to a git tree with\n> the\n> > > > code you started from would be good.\n> > > Happy to:\n> > >\n> https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/android/mesa3d_cross.mk\n> .\n> > > I'll make sure to include this in the commit message.\n> > >\n> > > > I assume this variable, as well as BOARD_LIBCAMERA_IPAS and\n> > > > BOARD_LIBCAMERA_PIPELINES, need to be defined externally. It would be\n> > > > nice to add some Android build documentation to the Documentation/\n> > > > directory.\n> > > As this review is already quite large, I've created Bug 164 to track\n> this.\n> > > For now, would it be possible to link to my doc that covers this\n> > >\n> https://docs.google.com/document/d/1Sly_VH3w6wFIdE72WXijQegoHZh8IxEnJ9m0hH7GodU/edit\n> > > and reference Bug 164 in the commit message?\n>\n> I think that's OK for the short term, but we won't be likely to review\n> the document or process until it's posted to the list.\n>\n> (Perhaps you don't want it reviewed yet, so that's not a problem).\n>\n> > > >> +LOCAL_PATH := $(call my-dir)\n> > > >> +LIBCAMERA_TOP := $(dir $(LOCAL_PATH))\n> > > >> +LIBCAMERA_MESON_VERSION := .0.0.1\n> > > > Is this something that can be provided by meson, to avoid hardcoding\n> > > > version numbers in multiple places ? Or can the utils/gen-version.sh\n> > > > script help ?\n> > > I will investigate whether utils/gen-version.sh can help. I believe\n> > > running shell scripts is deprecated, but my copy commands at the\n> bottom of\n> > > Android.mk do the trick, so it _might_ work, at least for now.\n> > >\n> > > > It would also be nice to avoid hardcoding the list of IPA modules\n> (and\n> > > > other files below), but I suppose that would be difficult ? Or could\n> > > > 'meson install' be used to install the files to a directory that\n> would\n> > > > then be picked by the Android build system ?\n> > > We already \"meson install\" the files to a known location. Those files\n> have\n> > > to be explicitly accessed, though, because Android needs to transform\n> the\n> > > .so files after they are built with Makefile targets. This is also why\n> > > signature verification fundamentally does not work on Android.\n>\n> Can the signatures be resigned at a final stage after they are stripped?\n>\n> > >\n> > > Thanks for your thoughtful responses.\n> > >\n> > > -Nicholas\n> > >\n> > > On Mon, Oct 24, 2022 at 7:08 PM Laurent Pinchart <\n> > > laurent.pinchart@ideasonboard.com> wrote:\n> > >\n> > >> Hi Nicholas,\n> > >>\n> > >> Thank you for the patch.\n> > >>\n> > >> On Mon, Oct 24, 2022 at 12:55:41AM -0500, Nicholas Roth via\n> > >> libcamera-devel wrote:\n> > >> > From: Nicholas Roth <nicholas@rothemail.net>\n> > >>\n> > >> The two files list third party copyrights, could you please indicate\n> in\n> > >> the commit message where that comes from ? A link to a git tree with\n> the\n> > >> code you started from would be good.\n> > >>\n> > >> > ---\n> > >> >  android/Android.mk     |  86 ++++++++++++\n> > >> >  android/meson_cross.mk | 296\n> +++++++++++++++++++++++++++++++++++++++++\n> > >> >  2 files changed, 382 insertions(+)\n> > >> >  create mode 100644 android/Android.mk\n> > >> >  create mode 100644 android/meson_cross.mk\n> > >> >\n> > >> > diff --git a/android/Android.mk b/android/Android.mk\n> > >> > new file mode 100644\n> > >> > index 00000000..ff0d1472\n> > >> > --- /dev/null\n> > >> > +++ b/android/Android.mk\n> > >> > @@ -0,0 +1,86 @@\n> > >> > +# SPDX-License-Identifier: Apache-2.0\n> > >> > +#\n> > >> > +# Copyright (C) 2021, GlobalLogic Ukraine\n> > >> > +# Copyright (C) 2021, Roman Stratiienko (r.stratiienko@gmail.com)\n> > >> > +#\n> > >> > +# Android.mk - Android makefile\n> > >> > +#\n> > >> > +\n> > >> > +ifneq ($(filter true, $(BOARD_LIBCAMERA_USES_MESON_BUILD)),)\n> > >>\n> > >> I assume this variable, as well as BOARD_LIBCAMERA_IPAS and\n> > >> BOARD_LIBCAMERA_PIPELINES, need to be defined externally. It would be\n> > >> nice to add some Android build documentation to the Documentation/\n> > >> directory.\n> > >>\n> > >> > +\n> > >> > +LOCAL_PATH := $(call my-dir)\n> > >> > +LIBCAMERA_TOP := $(dir $(LOCAL_PATH))\n> > >> > +LIBCAMERA_MESON_VERSION := .0.0.1\n> > >>\n> > >> Is this something that can be provided by meson, to avoid hardcoding\n> > >> version numbers in multiple places ? Or can the utils/gen-version.sh\n> > >> script help ?\n> > >>\n> > >> > +\n> > >> > +include $(CLEAR_VARS)\n> > >> > +\n> > >> > +LOCAL_SHARED_LIBRARIES := libc libexif libjpeg libyuv_chromium\n> libdl\n> > >> libyaml\n> > >> > +MESON_GEN_PKGCONFIGS := libexif libjpeg yaml-0.1 libyuv dl\n> > >> > +\n> > >> > +ifeq ($(TARGET_IS_64_BIT),true)\n> > >> > +LOCAL_MULTILIB := 64\n> > >> > +else\n> > >> > +LOCAL_MULTILIB := 32\n> > >> > +endif\n> > >> > +include $(LOCAL_PATH)/meson_cross.mk\n> > >> > +\n> > >> > +ifdef TARGET_2ND_ARCH\n> > >> > +LOCAL_MULTILIB := 32\n> > >> > +include $(LOCAL_PATH)/meson_cross.mk\n> > >> > +endif\n> > >> > +\n> > >> >\n> > >>\n> +#-------------------------------------------------------------------------------\n> > >> > +\n> > >> > +define libcamera-lib\n> > >> > +LOCAL_MODULE_CLASS := SHARED_LIBRARIES\n> > >> > +LOCAL_MODULE := $1\n> > >> > +LOCAL_VENDOR_MODULE := true\n> > >> > +LOCAL_MODULE_RELATIVE_PATH := $2\n> > >> > +ifdef TARGET_2ND_ARCH\n> > >> > +LOCAL_SRC_FILES_$(TARGET_ARCH) := $(call\n> > >> relative_top_path,$(LOCAL_PATH))$($3)\n> > >> > +LOCAL_SRC_FILES_$(TARGET_2ND_ARCH) := $(call\n> > >> relative_top_path,$(LOCAL_PATH))$(2ND_$3)\n> > >> > +LOCAL_MULTILIB := both\n> > >> > +else\n> > >> > +LOCAL_SRC_FILES := $(call relative_top_path,$(LOCAL_PATH))$($3)\n> > >> > +endif\n> > >> > +LOCAL_CHECK_ELF_FILES := false\n> > >> > +LOCAL_MODULE_SUFFIX := .so$(${4})\n> > >> > +include $(BUILD_PREBUILT)\n> > >> > +include $(CLEAR_VARS)\n> > >> > +endef\n> > >> > +\n> > >> > +__MY_SHARED_LIBRARIES := $(LOCAL_SHARED_LIBRARIES)\n> > >> > +include $(CLEAR_VARS)\n> > >> > +LOCAL_SHARED_LIBRARIES := $(__MY_SHARED_LIBRARIES)\n> > >> > +\n> > >> > +# Modules 'libcamera', produces '/vendor/lib{64}/libcamera.so'\n> > >> > +$(eval $(call\n> > >> libcamera-lib,libcamera,,LIBCAMERA_BIN,LIBCAMERA_MESON_VERSION))\n> > >> > +# Modules 'libcamera-base', produces\n> > >> '/vendor/lib{64}/libcamera-base.so'\n> > >> > +$(eval $(call\n> > >>\n> libcamera-lib,libcamera-base,,LIBCAMERA_BASE_BIN,LIBCAMERA_MESON_VERSION))\n> > >> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_rkisp1.so'\n> > >> > +$(eval $(call libcamera-lib,ipa_rkisp1,,LIBCAMERA_IPA_RKISP1_BIN,))\n> > >>\n> > >> It would also be nice to avoid hardcoding the list of IPA modules (and\n> > >> other files below), but I suppose that would be difficult ? Or could\n> > >> 'meson install' be used to install the files to a directory that would\n> > >> then be picked by the Android build system ?\n> > >>\n> > >> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_rpi.so'\n> > >> > +$(eval $(call\n> libcamera-lib,ipa_rpi,,LIBCAMERA_IPA_RASPBERRYPI_BIN,))\n> > >> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_ipu3.so'\n> > >> > +$(eval $(call libcamera-lib,ipa_ipu3,,LIBCAMERA_IPA_IPU3_BIN,))\n> > >> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_vimc.so'\n> > >> > +$(eval $(call libcamera-lib,ipa_vimc,,LIBCAMERA_IPA_VIMC_BIN,))\n> > >> > +\n> > >> > +# Modules 'camera.libcamera', produces '/vendor/lib{64}/hw/\n> > >> camera.libcamera.so' HAL\n> > >> > +$(eval $(call\n> libcamera-lib,camera.libcamera,hw,LIBCAMERA_HAL_BIN,))\n> > >> > +\n> > >> > +LOCAL_SHARED_LIBRARIES += libcamera libcamera-base ipa_rkisp1\n> ipa_rpi\n> > >> ipa_ipu3 ipa_vimc\n> > >> > +LOCAL_REQUIRED_MODULES := libcamera libcamera-base ipa_rkisp1\n> ipa_rpi\n> > >> ipa_ipu3 ipa_vimc\n> > >> > +\n> > >> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/rkisp1/)\n> > >> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/rpi/)\n> > >> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/ipu3/)\n> > >> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/vimc/)\n> > >> > +$(shell cp $(LIBCAMERA_IPA_RKISP1_CONFIGS)/*\n> > >> $(TARGET_OUT_VENDOR_ETC)/rkisp1/)\n> > >> > +$(shell cp $(LIBCAMERA_IPA_RASPBERRYPI_CONFIGS)/*\n> > >> $(TARGET_OUT_VENDOR_ETC)/rpi/)\n> > >> > +$(shell cp $(LIBCAMERA_IPA_IPU3_CONFIGS)/*\n> > >> $(TARGET_OUT_VENDOR_ETC)/ipu3/)\n> > >> > +$(shell cp $(LIBCAMERA_IPA_VIMC_CONFIGS)/*\n> > >> $(TARGET_OUT_VENDOR_ETC)/vimc/)\n> > >> > +\n> > >> >\n> > >>\n> +#-------------------------------------------------------------------------------\n> > >> > +\n> > >> > +endif\n> > >> > diff --git a/android/meson_cross.mk b/android/meson_cross.mk\n> > >> > new file mode 100644\n> > >> > index 00000000..bb1661cd\n> > >> > --- /dev/null\n> > >> > +++ b/android/meson_cross.mk\n> > >> > @@ -0,0 +1,296 @@\n> > >> > +# SPDX-License-Identifier: Apache-2.0\n> > >> > +#\n> > >> > +# Copyright (C) 2021, GlobalLogic Ukraine\n> > >> > +# Copyright (C) 2021, Roman Stratiienko (r.stratiienko@gmail.com)\n> > >> > +#\n> > >> > +# meson_cross.mk - Android makefile\n> > >> > +#\n> > >> > +\n> > >> > +# Turn \"dir1/dir2/dir3/dir4\" into \"../../../../\"\n>\n> I'm not yet sure where / why this is used - but does \"realpath\n> --relative-to\" make sense here?\n>\n> (Not a requierment, just a curiosity).\n>\n> --\n> Kieran\n>\n>\n> > >> > +define relative_top_path\n> > >> > +$(eval __s:=) \\\n> > >> > +$(foreach tmp,$(subst /,$(space),$1),$(eval __s:=$(__s)../)) \\\n> > >> > +$(__s)\n> > >> > +endef\n> > >> > +\n> > >> > +MY_PATH := $(call my-dir)\n> > >> > +\n> > >> > +AOSP_ABSOLUTE_PATH := $(realpath .)\n> > >> > +\n> > >> > +libcam_m_dummy_$(LOCAL_MULTILIB) :=\n> > >> $(TARGET_OUT_INTERMEDIATES)/LIBCAM_DUMMY_$(LOCAL_MULTILIB)/dummy.c\n> > >> > +\n> > >> > +$(libcam_m_dummy_$(LOCAL_MULTILIB)):\n> > >> > +     mkdir -p $(dir $@)\n> > >> > +     touch $@\n> > >> > +\n> > >> > +LOCAL_SRC_FILES := $(call\n> > >> relative_top_path,$(MY_PATH))$(libcam_m_dummy_$(LOCAL_MULTILIB))\n> > >> > +LOCAL_VENDOR_MODULE := true\n> > >> > +LOCAL_MODULE := libcam.dummy.$(LOCAL_MULTILIB)\n> > >> > +\n> > >> > +# Prepare intermediate variables by AOSP make/core internals\n> > >> > +include $(BUILD_SHARED_LIBRARY)\n> > >> > +\n> > >> > +LOCAL_PATH := $(MY_PATH)\n> > >> > +\n> > >> > +link_deps := \\\n> > >> > +     $(built_static_libraries) \\\n> > >> > +     $(built_shared_libraries) \\\n> > >> > +     $(built_whole_libraries) \\\n> > >> > +     $(strip $(all_objects)) \\\n> > >> > +     $(my_target_libatomic) \\\n> > >> > +     $(my_target_libcrt_builtins) \\\n> > >> > +     $(my_target_crtbegin_so_o) \\\n> > >> > +     $(my_target_crtend_so_o)\n> > >> > +\n> > >> > +# Build using intermediate variables provided by AOSP make/core\n> > >> internals\n> > >> > +M_TARGET_PREFIX := $(my_2nd_arch_prefix)\n> > >> > +\n> > >> > +LIBCAMERA_LIB_DIR := lib$(subst 32,,$(LOCAL_MULTILIB))\n> > >> > +\n> > >> > +MESON_OUT_DIR                            :=\n> > >> $($(M_TARGET_PREFIX)TARGET_OUT_INTERMEDIATES)/MESON_LIBCAMERA\n> > >> > +MESON_GEN_DIR                            := $(MESON_OUT_DIR)_GEN\n> > >> > +MESON_GEN_FILES_TARGET                   :=\n> $(MESON_GEN_DIR)/.timestamp\n> > >> > +\n> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_BIN :=\n> > >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera.so\n> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_HAL_BIN :=\n> > >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera-hal.so\n> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_BASE_BIN :=\n> > >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera-base.so\n> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_BIN :=\n> > >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_rkisp1.so\n> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_BIN :=\n> > >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_rpi.so\n> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_BIN :=\n> > >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_ipu3.so\n> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_BIN :=\n> > >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_vimc.so\n> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_CONFIGS :=\n> > >> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/rkisp1\n> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_CONFIGS :=\n> > >> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/raspberrypi\n> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_CONFIGS :=\n> > >> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/ipu3\n> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_CONFIGS :=\n> > >> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/vimc\n> > >> > +\n> > >> > +LIBCAMERA_BINS := \\\n> > >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_BIN) \\\n> > >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_HAL_BIN) \\\n> > >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_BASE_BIN) \\\n> > >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_BIN) \\\n> > >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_BIN) \\\n> > >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_BIN) \\\n> > >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_BIN)\n> > >> > +\n> > >> > +MESON_GEN_NINJA := \\\n> > >> > +     cd $(MESON_OUT_DIR) && PATH=/usr/bin:/usr/local/bin:$$PATH\n> meson\n> > >> ./build \\\n> > >> > +     --cross-file $(AOSP_ABSOLUTE_PATH)/$(MESON_GEN_DIR)/aosp_cross\n> > >>        \\\n> > >> > +     --buildtype=release\n> > >>         \\\n> > >> > +     -Dandroid=enabled\n> > >>         \\\n> > >> > +     -Dipas=$(subst $(space),$(comma),$(BOARD_LIBCAMERA_IPAS))\n> > >>         \\\n> > >> > +     -Dpipelines=$(subst\n> > >> $(space),$(comma),$(BOARD_LIBCAMERA_PIPELINES))      \\\n> > >> > +     -Dsysconfdir=/vendor/etc\n> > >>        \\\n> > >> > +     -Dtest=false\n> > >>        \\\n> > >> > +     -Dallow_unsigned_ipas_in_process=true\n> > >> > +\n> > >> > +MESON_BUILD := PATH=/usr/bin:/bin:/sbin:$$PATH ninja -C\n> > >> $(MESON_OUT_DIR)/build\n> > >> > +\n> > >> > +$(MESON_GEN_FILES_TARGET): MESON_CPU_FAMILY := $(subst\n> > >> arm64,aarch64,$(TARGET_$(M_TARGET_PREFIX)ARCH))\n> > >> > +\n> > >> > +define create-pkgconfig\n> > >> > +echo -e \"Name: $2\" \\\n> > >> > +     \"\\nDescription: $2\" \\\n> > >> > +     \"\\nVersion: $3\" > $1/$2.pc\n> > >> > +\n> > >> > +endef\n> > >> > +\n> > >> > +# Taken from build/make/core/binary.mk. We need this\n> > >> > +# to use definitions from build/make/core/definitions.mk\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_GLOBAL_C_INCLUDES :=\n> > >> $(my_target_global_c_includes)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_GLOBAL_C_SYSTEM_INCLUDES :=\n> > >> $(my_target_global_c_system_includes)\n> > >> > +\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CFLAGS :=\n> > >> $(my_target_global_cflags)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CONLYFLAGS :=\n> > >> $(my_target_global_conlyflags)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CPPFLAGS :=\n> > >> $(my_target_global_cppflags)\n> > >> > +\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_2ND_ARCH_VAR_PREFIX :=\n> > >> $(M_TARGET_PREFIX)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CC := $(my_cc)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LINKER := $(my_linker)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CXX := $(my_cxx)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CXX_LINK := $(my_cxx_link)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ASFLAGS := $(my_asflags)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CONLYFLAGS := $(my_conlyflags)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CFLAGS := $(my_cflags)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CPPFLAGS := $(my_cppflags)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CFLAGS_NO_OVERRIDE :=\n> > >> $(my_cflags_no_override)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CPPFLAGS_NO_OVERRIDE :=\n> > >> $(my_cppflags_no_override)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_RTTI_FLAG := $(LOCAL_RTTI_FLAG)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_DEBUG_CFLAGS := $(debug_cflags)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_C_INCLUDES := $(my_c_includes)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_IMPORTED_INCLUDES :=\n> > >> $(imported_includes)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LDFLAGS := $(my_ldflags)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LDLIBS := $(my_ldlibs)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_LDFLAGS :=\n> > >> $(my_target_global_ldflags)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TIDY_CHECKS := $(my_tidy_checks)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TIDY_FLAGS := $(my_tidy_flags)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ARFLAGS := $(my_arflags)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_SHARED_LIBRARIES :=\n> > >> $(built_shared_libraries)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_STATIC_LIBRARIES :=\n> > >> $(built_static_libraries)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_WHOLE_STATIC_LIBRARIES :=\n> > >> $(built_whole_libraries)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_OBJECTS := $(strip\n> > >> $(all_objects))\n> > >> > +\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ARM_CFLAGS :=\n> > >> $(normal_objects_cflags)\n> > >> > +\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_LIBCRT_BUILTINS :=\n> > >> $(my_target_libcrt_builtins)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_LIBATOMIC :=\n> > >> $(my_target_libatomic)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_CRTBEGIN_SO_O :=\n> > >> $(my_target_crtbegin_so_o)\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_CRTEND_SO_O :=\n> > >> $(my_target_crtend_so_o)\n> > >> > +##\n> > >> > +\n> > >> > +define m-lld-flags\n> > >> > +  -nostdlib -Wl,--gc-sections \\\n> > >> > +  $(PRIVATE_TARGET_CRTBEGIN_SO_O) \\\n> > >> > +  $(PRIVATE_ALL_OBJECTS) \\\n> > >> > +  -Wl,--whole-archive \\\n> > >> > +  $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \\\n> > >> > +  -Wl,--no-whole-archive \\\n> > >> > +  $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group)\n> \\\n> > >> > +  $(PRIVATE_ALL_STATIC_LIBRARIES) \\\n> > >> > +  $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \\\n> > >> > +  $(if $(filter\n> > >> true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \\\n> > >> > +  $(PRIVATE_TARGET_LIBCRT_BUILTINS) \\\n> > >> > +  $(PRIVATE_TARGET_LIBATOMIC) \\\n> > >> > +  $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \\\n> > >> > +  $(PRIVATE_LDFLAGS) \\\n> > >> > +  $(PRIVATE_ALL_SHARED_LIBRARIES) \\\n> > >> > +  $(PRIVATE_TARGET_CRTEND_SO_O) \\\n> > >> > +  $(PRIVATE_LDLIBS)\n> > >> > +endef\n> > >> > +\n> > >> > +define m-lld-flags-cleaned\n> > >> > +  $(subst prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/, \\\n> > >> > +  $(subst out/,$(AOSP_ABSOLUTE_PATH)/out/,             \\\n> > >> > +  $(subst -Wl$(comma)--fatal-warnings,,                \\\n> > >> > +  $(subst -Wl$(comma)--no-undefined-version,,          \\\n> > >> > +  $(subst -Wl$(comma)--gc-sections,,                   \\\n> > >> > +  $(patsubst %dummy.o,,                                \\\n> > >> > +    $(m-lld-flags)))))))\n> > >> > +endef\n> > >> > +\n> > >> > +define m-cpp-flags\n> > >> > +  $(PRIVATE_TARGET_GLOBAL_CFLAGS) \\\n> > >> > +  $(PRIVATE_TARGET_GLOBAL_CPPFLAGS) \\\n> > >> > +  $(PRIVATE_ARM_CFLAGS) \\\n> > >> > +  $(PRIVATE_RTTI_FLAG) \\\n> > >> > +  $(PRIVATE_CFLAGS) \\\n> > >> > +  $(PRIVATE_CPPFLAGS) \\\n> > >> > +  $(PRIVATE_DEBUG_CFLAGS) \\\n> > >> > +  $(PRIVATE_CFLAGS_NO_OVERRIDE) \\\n> > >> > +  $(PRIVATE_CPPFLAGS_NO_OVERRIDE)\n> > >> > +endef\n> > >> > +\n> > >> > +define m-c-flags\n> > >> > +  $(PRIVATE_TARGET_GLOBAL_CFLAGS) \\\n> > >> > +  $(PRIVATE_TARGET_GLOBAL_CONLYFLAGS) \\\n> > >> > +  $(PRIVATE_ARM_CFLAGS) \\\n> > >> > +  $(PRIVATE_CFLAGS) \\\n> > >> > +  $(PRIVATE_CONLYFLAGS) \\\n> > >> > +  $(PRIVATE_DEBUG_CFLAGS) \\\n> > >> > +  $(PRIVATE_CFLAGS_NO_OVERRIDE)\n> > >> > +endef\n> > >> > +\n> > >> > +define filter-c-flags\n> > >> > +  $(subst -std=gnu++17,, \\\n> > >> > +  $(subst -fno-rtti,, \\\n> > >> > +  $(patsubst  -W%,, \\\n> > >> > +    $1)))\n> > >> > +endef\n> > >> > +\n> > >> > +define m-c-includes-common\n> > >> > +$(addprefix -I , $(PRIVATE_C_INCLUDES)) \\\n> > >> > +$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),,\\\n> > >> > +    $(addprefix -I ,\\\n> > >> > +        $(filter-out $(PRIVATE_C_INCLUDES), \\\n> > >> > +            $(PRIVATE_GLOBAL_C_INCLUDES))) \\\n> > >> > +    $(addprefix -isystem ,\\\n> > >> > +        $(filter-out $(PRIVATE_C_INCLUDES), \\\n> > >> > +            $(PRIVATE_GLOBAL_C_SYSTEM_INCLUDES))))\n> > >> > +endef\n> > >> > +\n> > >> > +ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 30; echo $$?), 0)\n> > >> > +# Android 11+\n> > >> > +define m-c-includes\n> > >> > +$(foreach i,$(PRIVATE_IMPORTED_INCLUDES),$(EXPORTS.$(i)))\\\n> > >> > +$(m-c-includes-common)\n> > >> > +endef\n> > >> > +define postprocess-includes\n> > >> > +endef\n> > >> > +else\n> > >> > +# Android 10,9\n> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_IMPORT_INCLUDES :=\n> > >> $(import_includes)\n> > >> > +define postprocess-includes\n> > >> > +     echo \" $$(cat $(PRIVATE_IMPORT_INCLUDES)) \" >\n> > >> $(MESON_GEN_DIR)/import_includes && \\\n> > >> > +     sed -i  -e ':a;N;$$!ba;s/\\n/ /g'\n> > >> \\\n> > >> > +             -e 's# \\{2,\\}# #g'\n> > >> \\\n> > >> > +             -e 's# -isystem # -isystem#g'\n> > >>  \\\n> > >> > +             -e 's# -I # -I#g'\n> > >>  \\\n> > >> > +             -e 's# -I# -I$(AOSP_ABSOLUTE_PATH)/#g'\n> > >> \\\n> > >> > +             -e 's# -isystem# -isystem$(AOSP_ABSOLUTE_PATH)/#g'\n> > >> \\\n> > >> > +             -e \"s# #','#g\" $(MESON_GEN_DIR)/import_includes &&\n> > >> \\\n> > >> > +     sed -i \"s#<_IMPORT_INCLUDES>#$$(cat\n> > >> $(MESON_GEN_DIR)/import_includes)#g\" $(MESON_GEN_DIR)/aosp_cross\n> > >> > +endef\n> > >> > +define m-c-includes\n> > >> > +<_IMPORT_INCLUDES> $(m-c-includes-common)\n> > >> > +endef\n> > >> > +endif\n> > >> > +\n> > >> > +define m-c-abs-includes\n> > >> > +  $(subst $(space)-isystem,$(space)-isystem$(AOSP_ABSOLUTE_PATH)/,\n> \\\n> > >> > +  $(subst $(space)-I, -I$(AOSP_ABSOLUTE_PATH)/, \\\n> > >> > +  $(subst $(space)-I$(space),$(space)-I, \\\n> > >> > +  $(subst $(space)-isystem$(space),$(space)-isystem, \\\n> > >> > +    $(strip $(m-c-includes))))))\n> > >> > +endef\n> > >> > +\n> > >> > +$(MESON_GEN_FILES_TARGET):\n> > >> MESON_GEN_PKGCONFIGS:=$(MESON_GEN_PKGCONFIGS)\n> > >> > +$(MESON_GEN_FILES_TARGET): MESON_GEN_DIR:=$(MESON_GEN_DIR)\n> > >> > +$(MESON_GEN_FILES_TARGET): $(sort $(shell find -L $(LIBCAMERA_TOP)\n> > >> -not -path '*/\\.*'))\n> > >> > +     mkdir -p $(dir $@)\n> > >> > +     echo -e \"[properties]\\n\"\n> > >>                                                         \\\n> > >> > +             \"c_args = [$(foreach flag, $(call\n> > >> filter-c-flags,$(m-c-flags) $(m-c-abs-includes)),'$(flag)', )'']\\n\"\n> > >>      \\\n> > >> > +             \"cpp_args = [$(foreach flag, $(call\n> > >> filter-c-flags,$(m-cpp-flags) $(m-c-abs-includes)),'$(flag)', )'']\\n\"\n> > >>    \\\n> > >> > +             \"c_link_args = [$(foreach flag,\n> > >> $(m-lld-flags-cleaned),'$(flag)',)'']\\n\"\n> > >>       \\\n> > >> > +             \"cpp_link_args = [$(foreach flag,\n> > >> $(m-lld-flags-cleaned),'$(flag)',)'']\\n\"\n> > >>     \\\n> > >> > +             \"needs_exe_wrapper = true\\n\"\n> > >>                                                         \\\n> > >> > +             \"[binaries]\\n\"\n> > >>                                                         \\\n> > >> > +             \"ar =\n> > >> '$(AOSP_ABSOLUTE_PATH)/$($($(M_TARGET_PREFIX))TARGET_AR)'\\n\"\n> > >>                                 \\\n> > >> > +             \"c = [$(foreach arg,$(PRIVATE_CC),'$(subst\n> > >> prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/,$(arg))',)'']\\n\"\n>  \\\n> > >> > +             \"cpp = [$(foreach arg,$(PRIVATE_CXX),'$(subst\n> > >> prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/,$(arg))',)'']\\n\"        \\\n> > >> > +             \"c_ld = 'lld'\\n\"\n> > >>                                                         \\\n> > >> > +             \"cpp_ld = 'lld'\\n\\n\"\n> > >>                                                         \\\n> > >> > +             \"pkgconfig = ['env', 'PKG_CONFIG_LIBDIR=' +\n> > >> '$(AOSP_ABSOLUTE_PATH)/$(MESON_GEN_DIR)', '/usr/bin/pkg-config']\\n\\n\"\n> \\\n> > >> > +             \"llvm-config = '/dev/null'\\n\"\n> > >>                                                          \\\n> > >> > +             \"[host_machine]\\n\"\n> > >>                                                         \\\n> > >> > +             \"system = 'linux'\\n\"\n> > >>                                                         \\\n> > >> > +             \"cpu_family = '$(MESON_CPU_FAMILY)'\\n\"\n> > >>                                                         \\\n> > >> > +             \"cpu = '$(MESON_CPU_FAMILY)'\\n\"\n> > >>                                                          \\\n> > >> > +             \"endian = 'little'\" > $(dir $@)/aosp_cross\n> > >> > +\n> > >> > +     #\n> > >> > +     $(foreach pkg, $(MESON_GEN_PKGCONFIGS), $(call\n> > >> create-pkgconfig,$(dir $@),$(word 1, $(subst :, ,$(pkg))),$(word 2,\n> $(subst\n> > >> :, ,$(pkg)))))\n> > >> > +     touch $@\n> > >> > +\n> > >> > +$(MESON_OUT_DIR)/.build.timestamp:\n> MESON_GEN_NINJA:=$(MESON_GEN_NINJA)\n> > >> > +$(MESON_OUT_DIR)/.build.timestamp: MESON_BUILD:=$(MESON_BUILD)\n> > >> > +$(MESON_OUT_DIR)/.build.timestamp: $(MESON_GEN_FILES_TARGET)\n> > >> $(link_deps)\n> > >> > +     rm -rf $(dir $@)\n> > >> > +     mkdir -p $(dir $@)\n> > >> > +     mkdir -p $(dir $@)/build\n> > >> > +     # Meson will update timestamps in sources directory,\n> continuously\n> > >> retriggering the build\n> > >> > +     # even if nothing changed. Copy sources into intermediate dir\n> to\n> > >> avoid this effect.\n> > >> > +     cp -r $(LIBCAMERA_TOP)/* $(dir $@)\n> > >> > +     $(MESON_GEN_NINJA)\n> > >> > +     $(MESON_BUILD)\n> > >> > +     touch $@\n> > >> > +\n> > >> > +$(MESON_OUT_DIR)/install/.install.timestamp:\n> > >> MESON_BUILD:=$(MESON_BUILD)\n> > >> > +$(MESON_OUT_DIR)/install/.install.timestamp:\n> > >> $(MESON_OUT_DIR)/.build.timestamp\n> > >> > +     rm -rf $(dir $@)\n> > >> > +     mkdir -p $(dir $@)\n> > >> > +     DESTDIR=$(AOSP_ABSOLUTE_PATH)/$(dir $@) $(MESON_BUILD) install\n> > >> > +     touch $@\n> > >> > +\n> > >> > +$(LIBCAMERA_BINS): $(MESON_OUT_DIR)/install/.install.timestamp\n> > >> > +     echo \"Build $@\"\n> > >> > +     touch $@\n> > >>\n> > >> --\n> > >> Regards,\n> > >>\n> > >> Laurent Pinchart\n> > >>\n> > >\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id CAEB0BD16B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 26 Oct 2022 15:29:48 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1E16562F5C;\n\tWed, 26 Oct 2022 17:29:48 +0200 (CEST)","from mail-il1-x135.google.com (mail-il1-x135.google.com\n\t[IPv6:2607:f8b0:4864:20::135])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 082AB61F4B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 Oct 2022 17:29:46 +0200 (CEST)","by mail-il1-x135.google.com with SMTP id h18so551764ilq.9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 Oct 2022 08:29:45 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666798188;\n\tbh=BUpEg8ZnIoiZ9UP2aM6DuOyFPmgzHEE0XVX1ghfUvYM=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=bFlt553zBsiLNSHMV8P8zhnwmIzSE6mtcCKwcAkRFl84St8YM9LKg0WkSIqUO1Xz+\n\th5Rx629PInd4d25X4erJEmN96fW26HKkHH3iJtkZQH618KGPKLpUtfQWnl/N+3JuDc\n\tkHUsci4j0mhlH5NO1NauJUX+Z8GwbpHVOrxzV7F0+g2fXS8qn06aArkxuXUfMBg1Ox\n\tryA0zmfmdhzcYMibH1VmY2MZTvClChBhCbkZQafEMWz3dLVBJN0QutJ1yvJIQV8xeB\n\tLhFjUsEg9DB0QOzsMncDGtwPjY8myFgYhxoDBpQ0peU1zFGX4QOfHoj0XYEnRNHa79\n\tqS4tg3wXdUULg==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=rothemail-net.20210112.gappssmtp.com; s=20210112;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=fD4+WX2qnN433URKzSOtZAJ7nqbS9KeYL4xoGSNn91U=;\n\tb=dhkTnt1bqtrWMjDfBB4z92+odq1VCdzmTR82RCNRWUfkkH2OpqjlXhAwT5vjLa1Tnq\n\tmaHvAhMRW0sYI+Dp/klzv8QHC+aoFOQUPINeUMT0ayHoWrUYQcfILJ663BoZj3f1cmNu\n\tb/pl8gE2hAQ6IqMa9DqLHMzsu25P7o79Peq67JXJ33WrigCgu3Sa4u9Hbv+cI1UyYEXs\n\txprTi2x+dzocA5uWCKwdgyAtPWrons/aEFn4fVaeOPpC7EjYutE+WY+GUDNCVWOXJ+bA\n\tQSX5yW31H3MR2gjONC8j9ce4UmyS2+fKa2ipT1sG8HqEVNxdsksZYiZiB+q1RemX3FMy\n\t5fxw=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected)\n\theader.d=rothemail-net.20210112.gappssmtp.com\n\theader.i=@rothemail-net.20210112.gappssmtp.com header.b=\"dhkTnt1b\"; \n\tdkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=fD4+WX2qnN433URKzSOtZAJ7nqbS9KeYL4xoGSNn91U=;\n\tb=f/dir+oaVZXoWCPNs7TvtFDKmvlEKdMvHEmSog7bz9TEt2RX5aleaVU2WRPRQB0HHi\n\t4zi5s3LexSatPFMhQ1lceiA7lXFvw7zhvQ8HPtidJ37fmD4DSS2y7jTGhWcirYiXuCJa\n\tesOE3hLJsq2xJwPJetMRbRu3cWPTjBJEc1C1on/c/5W0WokYov889gu8MlAsoM9P4HqY\n\tNpajL8XoJ18AIbjy9GYHDn6wTMSey9KILz+9p0euUcgmoX+Oy2Imlyc2/aEMzLbjdMxj\n\tC0TH+Q6GdRmcCiLsYKMdAQqwmU/rRhop0k/XIjxZfe2dpmvKgPh9YeVN+cDNkR+N/qL0\n\tcE7g==","X-Gm-Message-State":"ACrzQf37X7A3yuAIGyXMRKcK1Qq8p6SdLkV309g9bVC4DMHmfKKkQPaI\n\tsbOO99huEeX5Q/3eygpmKX9pZIuN1A6d9vcXgi8wawaDJMdni7Gz","X-Google-Smtp-Source":"AMsMyM4oD9mBysucXiZFqmLeakIglKnzr3K4TRlYZyUGM09zD4fhzIgHrVknH5IwaNsKljltzDl+FQa3DtOLGIEdziM=","X-Received":"by 2002:a05:6e02:1c42:b0:300:56a5:adf6 with SMTP id\n\td2-20020a056e021c4200b0030056a5adf6mr3905103ilg.53.1666798184234;\n\tWed, 26 Oct 2022 08:29:44 -0700 (PDT)","MIME-Version":"1.0","References":"<20221024055543.116040-1-nicholas@rothemail.net>\n\t<20221024055543.116040-10-nicholas@rothemail.net>\n\t<Y1coz2lb03qqCu30@pendragon.ideasonboard.com>\n\t<CAD2rFCrwdoHvTOnK9sORF35OB1z=w452HYd8Vn+VvAbLLhbBKQ@mail.gmail.com>\n\t<CAD2rFCrPqLRAuFj1mSTkUzL15TKckVhvKOfadTnqW1QVk8W31A@mail.gmail.com>\n\t<166677580075.3974115.709677145521307073@Monstersaurus>","In-Reply-To":"<166677580075.3974115.709677145521307073@Monstersaurus>","Date":"Wed, 26 Oct 2022 10:29:33 -0500","Message-ID":"<CAD2rFCpAwatM4xPX6ZXmKia_jwMSM3xOQpNQMLfRToRA1PayJQ@mail.gmail.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"000000000000af195905ebf1b184\"","Subject":"Re: [libcamera-devel] [PATCH 09/11] Adds Android makefiles to build\n\tlibcamera inline with AOSP.","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Nicholas Roth via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Nicholas Roth <nicholas@rothemail.net>","Cc":"Nicholas Roth via libcamera-devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25619,"web_url":"https://patchwork.libcamera.org/comment/25619/","msgid":"<CAD2rFCr2bWmcivf49=JMQ7P3ZjQLKtYt5sD_c7e7Pg6QG8JLUw@mail.gmail.com>","date":"2022-10-27T05:58:48","subject":"Re: [libcamera-devel] [PATCH 09/11] Adds Android makefiles to build\n\tlibcamera inline with AOSP.","submitter":{"id":137,"url":"https://patchwork.libcamera.org/api/people/137/","name":"Nicholas Roth","email":"nicholas@rothemail.net"},"content":"> I'm not yet sure where / why this is used - but does \"realpath\n> --relative-to\" make sense here?\n\nI just grepped for this in the code, and I'm not sure what you mean by\nthis. AOSP_ABSOLUTE_PATH -- the path to AOSP -- was the only thing I could\nfind. Why would we want a relative path instead?\n\nOn Wed, Oct 26, 2022 at 10:29 AM Nicholas Roth <nicholas@rothemail.net>\nwrote:\n\n> > (Perhaps you don't want it reviewed yet, so that's not a problem).\n> That's exactly correct!\n>\n> >Can the signatures be resigned at a final stage after they are stripped?\n> That happens deep in the bowels of Android's build system. There is no\n> documented way to do this, but it may be theoretically possible, especially\n> if distribution maintainers are willing to fork or patch the Android build\n> system itself. I can imagine this might create a high maintenance burden\n> though. The high-level API people are supposed to use is:\n>\n> include $(CLEAR_VARS)\n> LOCAL_MODULE := foo-prebuilt\n> LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so\n> LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include\n> include $(PREBUILT_SHARED_LIBRARY)\n>\n> from https://developer.android.com/ndk/guides/prebuilts.\n>\n> PREBUILT_SHARED_LIBRARY, or BUILD_PREBUILT as we use in our makefile, is\n> what does the transformations. Maybe there's a clean way to influence its\n> behavior and I'm just not familiar enough with the Android make-based build\n> system to know what it is, although my intuition is that this would be\n> unlikely and perhaps considered undesirable by the Android engprod team.\n>\n> > I'm not yet sure where / why this is used - but does \"realpath\n> > --relative-to\" make sense here?\n> This provides a relative path to the build directory IIRC (heading out to\n> a meeting right now).\n>\n> -Nicholas\n>\n>\n> On Wed, Oct 26, 2022 at 4:16 AM Kieran Bingham <\n> kieran.bingham@ideasonboard.com> wrote:\n>\n>> Quoting Nicholas Roth (2022-10-26 04:05:38)\n>> > +Kieran Bingham <kieran.bingham@ideasonboard.com> since Laurent is out.\n>> >\n>> >\n>> > On Tue, Oct 25, 2022 at 9:22 PM Nicholas Roth <nicholas@rothemail.net>\n>> > wrote:\n>> >\n>> > > > The two files list third party copyrights, could you please\n>> indicate in\n>> > > > the commit message where that comes from ? A link to a git tree\n>> with the\n>> > > > code you started from would be good.\n>> > > Happy to:\n>> > >\n>> https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/android/mesa3d_cross.mk\n>> .\n>> > > I'll make sure to include this in the commit message.\n>> > >\n>> > > > I assume this variable, as well as BOARD_LIBCAMERA_IPAS and\n>> > > > BOARD_LIBCAMERA_PIPELINES, need to be defined externally. It would\n>> be\n>> > > > nice to add some Android build documentation to the Documentation/\n>> > > > directory.\n>> > > As this review is already quite large, I've created Bug 164 to track\n>> this.\n>> > > For now, would it be possible to link to my doc that covers this\n>> > >\n>> https://docs.google.com/document/d/1Sly_VH3w6wFIdE72WXijQegoHZh8IxEnJ9m0hH7GodU/edit\n>> > > and reference Bug 164 in the commit message?\n>>\n>> I think that's OK for the short term, but we won't be likely to review\n>> the document or process until it's posted to the list.\n>>\n>> (Perhaps you don't want it reviewed yet, so that's not a problem).\n>>\n>> > > >> +LOCAL_PATH := $(call my-dir)\n>> > > >> +LIBCAMERA_TOP := $(dir $(LOCAL_PATH))\n>> > > >> +LIBCAMERA_MESON_VERSION := .0.0.1\n>> > > > Is this something that can be provided by meson, to avoid hardcoding\n>> > > > version numbers in multiple places ? Or can the utils/gen-version.sh\n>> > > > script help ?\n>> > > I will investigate whether utils/gen-version.sh can help. I believe\n>> > > running shell scripts is deprecated, but my copy commands at the\n>> bottom of\n>> > > Android.mk do the trick, so it _might_ work, at least for now.\n>> > >\n>> > > > It would also be nice to avoid hardcoding the list of IPA modules\n>> (and\n>> > > > other files below), but I suppose that would be difficult ? Or could\n>> > > > 'meson install' be used to install the files to a directory that\n>> would\n>> > > > then be picked by the Android build system ?\n>> > > We already \"meson install\" the files to a known location. Those files\n>> have\n>> > > to be explicitly accessed, though, because Android needs to transform\n>> the\n>> > > .so files after they are built with Makefile targets. This is also why\n>> > > signature verification fundamentally does not work on Android.\n>>\n>> Can the signatures be resigned at a final stage after they are stripped?\n>>\n>> > >\n>> > > Thanks for your thoughtful responses.\n>> > >\n>> > > -Nicholas\n>> > >\n>> > > On Mon, Oct 24, 2022 at 7:08 PM Laurent Pinchart <\n>> > > laurent.pinchart@ideasonboard.com> wrote:\n>> > >\n>> > >> Hi Nicholas,\n>> > >>\n>> > >> Thank you for the patch.\n>> > >>\n>> > >> On Mon, Oct 24, 2022 at 12:55:41AM -0500, Nicholas Roth via\n>> > >> libcamera-devel wrote:\n>> > >> > From: Nicholas Roth <nicholas@rothemail.net>\n>> > >>\n>> > >> The two files list third party copyrights, could you please indicate\n>> in\n>> > >> the commit message where that comes from ? A link to a git tree with\n>> the\n>> > >> code you started from would be good.\n>> > >>\n>> > >> > ---\n>> > >> >  android/Android.mk     |  86 ++++++++++++\n>> > >> >  android/meson_cross.mk | 296\n>> +++++++++++++++++++++++++++++++++++++++++\n>> > >> >  2 files changed, 382 insertions(+)\n>> > >> >  create mode 100644 android/Android.mk\n>> > >> >  create mode 100644 android/meson_cross.mk\n>> > >> >\n>> > >> > diff --git a/android/Android.mk b/android/Android.mk\n>> > >> > new file mode 100644\n>> > >> > index 00000000..ff0d1472\n>> > >> > --- /dev/null\n>> > >> > +++ b/android/Android.mk\n>> > >> > @@ -0,0 +1,86 @@\n>> > >> > +# SPDX-License-Identifier: Apache-2.0\n>> > >> > +#\n>> > >> > +# Copyright (C) 2021, GlobalLogic Ukraine\n>> > >> > +# Copyright (C) 2021, Roman Stratiienko (r.stratiienko@gmail.com)\n>> > >> > +#\n>> > >> > +# Android.mk - Android makefile\n>> > >> > +#\n>> > >> > +\n>> > >> > +ifneq ($(filter true, $(BOARD_LIBCAMERA_USES_MESON_BUILD)),)\n>> > >>\n>> > >> I assume this variable, as well as BOARD_LIBCAMERA_IPAS and\n>> > >> BOARD_LIBCAMERA_PIPELINES, need to be defined externally. It would be\n>> > >> nice to add some Android build documentation to the Documentation/\n>> > >> directory.\n>> > >>\n>> > >> > +\n>> > >> > +LOCAL_PATH := $(call my-dir)\n>> > >> > +LIBCAMERA_TOP := $(dir $(LOCAL_PATH))\n>> > >> > +LIBCAMERA_MESON_VERSION := .0.0.1\n>> > >>\n>> > >> Is this something that can be provided by meson, to avoid hardcoding\n>> > >> version numbers in multiple places ? Or can the utils/gen-version.sh\n>> > >> script help ?\n>> > >>\n>> > >> > +\n>> > >> > +include $(CLEAR_VARS)\n>> > >> > +\n>> > >> > +LOCAL_SHARED_LIBRARIES := libc libexif libjpeg libyuv_chromium\n>> libdl\n>> > >> libyaml\n>> > >> > +MESON_GEN_PKGCONFIGS := libexif libjpeg yaml-0.1 libyuv dl\n>> > >> > +\n>> > >> > +ifeq ($(TARGET_IS_64_BIT),true)\n>> > >> > +LOCAL_MULTILIB := 64\n>> > >> > +else\n>> > >> > +LOCAL_MULTILIB := 32\n>> > >> > +endif\n>> > >> > +include $(LOCAL_PATH)/meson_cross.mk\n>> > >> > +\n>> > >> > +ifdef TARGET_2ND_ARCH\n>> > >> > +LOCAL_MULTILIB := 32\n>> > >> > +include $(LOCAL_PATH)/meson_cross.mk\n>> > >> > +endif\n>> > >> > +\n>> > >> >\n>> > >>\n>> +#-------------------------------------------------------------------------------\n>> > >> > +\n>> > >> > +define libcamera-lib\n>> > >> > +LOCAL_MODULE_CLASS := SHARED_LIBRARIES\n>> > >> > +LOCAL_MODULE := $1\n>> > >> > +LOCAL_VENDOR_MODULE := true\n>> > >> > +LOCAL_MODULE_RELATIVE_PATH := $2\n>> > >> > +ifdef TARGET_2ND_ARCH\n>> > >> > +LOCAL_SRC_FILES_$(TARGET_ARCH) := $(call\n>> > >> relative_top_path,$(LOCAL_PATH))$($3)\n>> > >> > +LOCAL_SRC_FILES_$(TARGET_2ND_ARCH) := $(call\n>> > >> relative_top_path,$(LOCAL_PATH))$(2ND_$3)\n>> > >> > +LOCAL_MULTILIB := both\n>> > >> > +else\n>> > >> > +LOCAL_SRC_FILES := $(call relative_top_path,$(LOCAL_PATH))$($3)\n>> > >> > +endif\n>> > >> > +LOCAL_CHECK_ELF_FILES := false\n>> > >> > +LOCAL_MODULE_SUFFIX := .so$(${4})\n>> > >> > +include $(BUILD_PREBUILT)\n>> > >> > +include $(CLEAR_VARS)\n>> > >> > +endef\n>> > >> > +\n>> > >> > +__MY_SHARED_LIBRARIES := $(LOCAL_SHARED_LIBRARIES)\n>> > >> > +include $(CLEAR_VARS)\n>> > >> > +LOCAL_SHARED_LIBRARIES := $(__MY_SHARED_LIBRARIES)\n>> > >> > +\n>> > >> > +# Modules 'libcamera', produces '/vendor/lib{64}/libcamera.so'\n>> > >> > +$(eval $(call\n>> > >> libcamera-lib,libcamera,,LIBCAMERA_BIN,LIBCAMERA_MESON_VERSION))\n>> > >> > +# Modules 'libcamera-base', produces\n>> > >> '/vendor/lib{64}/libcamera-base.so'\n>> > >> > +$(eval $(call\n>> > >>\n>> libcamera-lib,libcamera-base,,LIBCAMERA_BASE_BIN,LIBCAMERA_MESON_VERSION))\n>> > >> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_rkisp1.so'\n>> > >> > +$(eval $(call\n>> libcamera-lib,ipa_rkisp1,,LIBCAMERA_IPA_RKISP1_BIN,))\n>> > >>\n>> > >> It would also be nice to avoid hardcoding the list of IPA modules\n>> (and\n>> > >> other files below), but I suppose that would be difficult ? Or could\n>> > >> 'meson install' be used to install the files to a directory that\n>> would\n>> > >> then be picked by the Android build system ?\n>> > >>\n>> > >> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_rpi.so'\n>> > >> > +$(eval $(call\n>> libcamera-lib,ipa_rpi,,LIBCAMERA_IPA_RASPBERRYPI_BIN,))\n>> > >> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_ipu3.so'\n>> > >> > +$(eval $(call libcamera-lib,ipa_ipu3,,LIBCAMERA_IPA_IPU3_BIN,))\n>> > >> > +# Modules 'ipa_rkisp1', produces '/vendor/lib{64}/ipa_vimc.so'\n>> > >> > +$(eval $(call libcamera-lib,ipa_vimc,,LIBCAMERA_IPA_VIMC_BIN,))\n>> > >> > +\n>> > >> > +# Modules 'camera.libcamera', produces '/vendor/lib{64}/hw/\n>> > >> camera.libcamera.so' HAL\n>> > >> > +$(eval $(call\n>> libcamera-lib,camera.libcamera,hw,LIBCAMERA_HAL_BIN,))\n>> > >> > +\n>> > >> > +LOCAL_SHARED_LIBRARIES += libcamera libcamera-base ipa_rkisp1\n>> ipa_rpi\n>> > >> ipa_ipu3 ipa_vimc\n>> > >> > +LOCAL_REQUIRED_MODULES := libcamera libcamera-base ipa_rkisp1\n>> ipa_rpi\n>> > >> ipa_ipu3 ipa_vimc\n>> > >> > +\n>> > >> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/rkisp1/)\n>> > >> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/rpi/)\n>> > >> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/ipu3/)\n>> > >> > +$(shell mkdir -p $(TARGET_OUT_VENDOR_ETC)/vimc/)\n>> > >> > +$(shell cp $(LIBCAMERA_IPA_RKISP1_CONFIGS)/*\n>> > >> $(TARGET_OUT_VENDOR_ETC)/rkisp1/)\n>> > >> > +$(shell cp $(LIBCAMERA_IPA_RASPBERRYPI_CONFIGS)/*\n>> > >> $(TARGET_OUT_VENDOR_ETC)/rpi/)\n>> > >> > +$(shell cp $(LIBCAMERA_IPA_IPU3_CONFIGS)/*\n>> > >> $(TARGET_OUT_VENDOR_ETC)/ipu3/)\n>> > >> > +$(shell cp $(LIBCAMERA_IPA_VIMC_CONFIGS)/*\n>> > >> $(TARGET_OUT_VENDOR_ETC)/vimc/)\n>> > >> > +\n>> > >> >\n>> > >>\n>> +#-------------------------------------------------------------------------------\n>> > >> > +\n>> > >> > +endif\n>> > >> > diff --git a/android/meson_cross.mk b/android/meson_cross.mk\n>> > >> > new file mode 100644\n>> > >> > index 00000000..bb1661cd\n>> > >> > --- /dev/null\n>> > >> > +++ b/android/meson_cross.mk\n>> > >> > @@ -0,0 +1,296 @@\n>> > >> > +# SPDX-License-Identifier: Apache-2.0\n>> > >> > +#\n>> > >> > +# Copyright (C) 2021, GlobalLogic Ukraine\n>> > >> > +# Copyright (C) 2021, Roman Stratiienko (r.stratiienko@gmail.com)\n>> > >> > +#\n>> > >> > +# meson_cross.mk - Android makefile\n>> > >> > +#\n>> > >> > +\n>> > >> > +# Turn \"dir1/dir2/dir3/dir4\" into \"../../../../\"\n>>\n>> I'm not yet sure where / why this is used - but does \"realpath\n>> --relative-to\" make sense here?\n>>\n>> (Not a requierment, just a curiosity).\n>>\n>> --\n>> Kieran\n>>\n>>\n>> > >> > +define relative_top_path\n>> > >> > +$(eval __s:=) \\\n>> > >> > +$(foreach tmp,$(subst /,$(space),$1),$(eval __s:=$(__s)../)) \\\n>> > >> > +$(__s)\n>> > >> > +endef\n>> > >> > +\n>> > >> > +MY_PATH := $(call my-dir)\n>> > >> > +\n>> > >> > +AOSP_ABSOLUTE_PATH := $(realpath .)\n>> > >> > +\n>> > >> > +libcam_m_dummy_$(LOCAL_MULTILIB) :=\n>> > >> $(TARGET_OUT_INTERMEDIATES)/LIBCAM_DUMMY_$(LOCAL_MULTILIB)/dummy.c\n>> > >> > +\n>> > >> > +$(libcam_m_dummy_$(LOCAL_MULTILIB)):\n>> > >> > +     mkdir -p $(dir $@)\n>> > >> > +     touch $@\n>> > >> > +\n>> > >> > +LOCAL_SRC_FILES := $(call\n>> > >> relative_top_path,$(MY_PATH))$(libcam_m_dummy_$(LOCAL_MULTILIB))\n>> > >> > +LOCAL_VENDOR_MODULE := true\n>> > >> > +LOCAL_MODULE := libcam.dummy.$(LOCAL_MULTILIB)\n>> > >> > +\n>> > >> > +# Prepare intermediate variables by AOSP make/core internals\n>> > >> > +include $(BUILD_SHARED_LIBRARY)\n>> > >> > +\n>> > >> > +LOCAL_PATH := $(MY_PATH)\n>> > >> > +\n>> > >> > +link_deps := \\\n>> > >> > +     $(built_static_libraries) \\\n>> > >> > +     $(built_shared_libraries) \\\n>> > >> > +     $(built_whole_libraries) \\\n>> > >> > +     $(strip $(all_objects)) \\\n>> > >> > +     $(my_target_libatomic) \\\n>> > >> > +     $(my_target_libcrt_builtins) \\\n>> > >> > +     $(my_target_crtbegin_so_o) \\\n>> > >> > +     $(my_target_crtend_so_o)\n>> > >> > +\n>> > >> > +# Build using intermediate variables provided by AOSP make/core\n>> > >> internals\n>> > >> > +M_TARGET_PREFIX := $(my_2nd_arch_prefix)\n>> > >> > +\n>> > >> > +LIBCAMERA_LIB_DIR := lib$(subst 32,,$(LOCAL_MULTILIB))\n>> > >> > +\n>> > >> > +MESON_OUT_DIR                            :=\n>> > >> $($(M_TARGET_PREFIX)TARGET_OUT_INTERMEDIATES)/MESON_LIBCAMERA\n>> > >> > +MESON_GEN_DIR                            := $(MESON_OUT_DIR)_GEN\n>> > >> > +MESON_GEN_FILES_TARGET                   :=\n>> $(MESON_GEN_DIR)/.timestamp\n>> > >> > +\n>> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_BIN :=\n>> > >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera.so\n>> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_HAL_BIN :=\n>> > >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera-hal.so\n>> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_BASE_BIN :=\n>> > >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera-base.so\n>> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_BIN :=\n>> > >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_rkisp1.so\n>> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_BIN :=\n>> > >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_rpi.so\n>> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_BIN :=\n>> > >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_ipu3.so\n>> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_BIN :=\n>> > >> $(MESON_OUT_DIR)/install/usr/local/lib/libcamera/ipa_vimc.so\n>> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_CONFIGS :=\n>> > >> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/rkisp1\n>> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_CONFIGS :=\n>> > >> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/raspberrypi\n>> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_CONFIGS :=\n>> > >> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/ipu3\n>> > >> > +$(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_CONFIGS :=\n>> > >> $(MESON_OUT_DIR)/install/usr/local/share/libcamera/ipa/vimc\n>> > >> > +\n>> > >> > +LIBCAMERA_BINS := \\\n>> > >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_BIN) \\\n>> > >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_HAL_BIN) \\\n>> > >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_BASE_BIN) \\\n>> > >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_RKISP1_BIN) \\\n>> > >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_RASPBERRYPI_BIN) \\\n>> > >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_IPU3_BIN) \\\n>> > >> > +     $($(M_TARGET_PREFIX)LIBCAMERA_IPA_VIMC_BIN)\n>> > >> > +\n>> > >> > +MESON_GEN_NINJA := \\\n>> > >> > +     cd $(MESON_OUT_DIR) && PATH=/usr/bin:/usr/local/bin:$$PATH\n>> meson\n>> > >> ./build \\\n>> > >> > +     --cross-file\n>> $(AOSP_ABSOLUTE_PATH)/$(MESON_GEN_DIR)/aosp_cross\n>> > >>        \\\n>> > >> > +     --buildtype=release\n>> > >>         \\\n>> > >> > +     -Dandroid=enabled\n>> > >>         \\\n>> > >> > +     -Dipas=$(subst $(space),$(comma),$(BOARD_LIBCAMERA_IPAS))\n>> > >>         \\\n>> > >> > +     -Dpipelines=$(subst\n>> > >> $(space),$(comma),$(BOARD_LIBCAMERA_PIPELINES))      \\\n>> > >> > +     -Dsysconfdir=/vendor/etc\n>> > >>        \\\n>> > >> > +     -Dtest=false\n>> > >>        \\\n>> > >> > +     -Dallow_unsigned_ipas_in_process=true\n>> > >> > +\n>> > >> > +MESON_BUILD := PATH=/usr/bin:/bin:/sbin:$$PATH ninja -C\n>> > >> $(MESON_OUT_DIR)/build\n>> > >> > +\n>> > >> > +$(MESON_GEN_FILES_TARGET): MESON_CPU_FAMILY := $(subst\n>> > >> arm64,aarch64,$(TARGET_$(M_TARGET_PREFIX)ARCH))\n>> > >> > +\n>> > >> > +define create-pkgconfig\n>> > >> > +echo -e \"Name: $2\" \\\n>> > >> > +     \"\\nDescription: $2\" \\\n>> > >> > +     \"\\nVersion: $3\" > $1/$2.pc\n>> > >> > +\n>> > >> > +endef\n>> > >> > +\n>> > >> > +# Taken from build/make/core/binary.mk. We need this\n>> > >> > +# to use definitions from build/make/core/definitions.mk\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_GLOBAL_C_INCLUDES :=\n>> > >> $(my_target_global_c_includes)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_GLOBAL_C_SYSTEM_INCLUDES :=\n>> > >> $(my_target_global_c_system_includes)\n>> > >> > +\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CFLAGS :=\n>> > >> $(my_target_global_cflags)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CONLYFLAGS :=\n>> > >> $(my_target_global_conlyflags)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_CPPFLAGS :=\n>> > >> $(my_target_global_cppflags)\n>> > >> > +\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_2ND_ARCH_VAR_PREFIX :=\n>> > >> $(M_TARGET_PREFIX)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CC := $(my_cc)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LINKER := $(my_linker)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CXX := $(my_cxx)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CXX_LINK := $(my_cxx_link)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ASFLAGS := $(my_asflags)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CONLYFLAGS := $(my_conlyflags)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CFLAGS := $(my_cflags)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CPPFLAGS := $(my_cppflags)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CFLAGS_NO_OVERRIDE :=\n>> > >> $(my_cflags_no_override)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_CPPFLAGS_NO_OVERRIDE :=\n>> > >> $(my_cppflags_no_override)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_RTTI_FLAG := $(LOCAL_RTTI_FLAG)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_DEBUG_CFLAGS := $(debug_cflags)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_C_INCLUDES := $(my_c_includes)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_IMPORTED_INCLUDES :=\n>> > >> $(imported_includes)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LDFLAGS := $(my_ldflags)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_LDLIBS := $(my_ldlibs)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_GLOBAL_LDFLAGS :=\n>> > >> $(my_target_global_ldflags)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TIDY_CHECKS :=\n>> $(my_tidy_checks)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TIDY_FLAGS := $(my_tidy_flags)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ARFLAGS := $(my_arflags)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_SHARED_LIBRARIES :=\n>> > >> $(built_shared_libraries)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_STATIC_LIBRARIES :=\n>> > >> $(built_static_libraries)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_WHOLE_STATIC_LIBRARIES :=\n>> > >> $(built_whole_libraries)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ALL_OBJECTS := $(strip\n>> > >> $(all_objects))\n>> > >> > +\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_ARM_CFLAGS :=\n>> > >> $(normal_objects_cflags)\n>> > >> > +\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_LIBCRT_BUILTINS :=\n>> > >> $(my_target_libcrt_builtins)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_LIBATOMIC :=\n>> > >> $(my_target_libatomic)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_CRTBEGIN_SO_O :=\n>> > >> $(my_target_crtbegin_so_o)\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_TARGET_CRTEND_SO_O :=\n>> > >> $(my_target_crtend_so_o)\n>> > >> > +##\n>> > >> > +\n>> > >> > +define m-lld-flags\n>> > >> > +  -nostdlib -Wl,--gc-sections \\\n>> > >> > +  $(PRIVATE_TARGET_CRTBEGIN_SO_O) \\\n>> > >> > +  $(PRIVATE_ALL_OBJECTS) \\\n>> > >> > +  -Wl,--whole-archive \\\n>> > >> > +  $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \\\n>> > >> > +  -Wl,--no-whole-archive \\\n>> > >> > +  $(if\n>> $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \\\n>> > >> > +  $(PRIVATE_ALL_STATIC_LIBRARIES) \\\n>> > >> > +  $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \\\n>> > >> > +  $(if $(filter\n>> > >> true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \\\n>> > >> > +  $(PRIVATE_TARGET_LIBCRT_BUILTINS) \\\n>> > >> > +  $(PRIVATE_TARGET_LIBATOMIC) \\\n>> > >> > +  $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \\\n>> > >> > +  $(PRIVATE_LDFLAGS) \\\n>> > >> > +  $(PRIVATE_ALL_SHARED_LIBRARIES) \\\n>> > >> > +  $(PRIVATE_TARGET_CRTEND_SO_O) \\\n>> > >> > +  $(PRIVATE_LDLIBS)\n>> > >> > +endef\n>> > >> > +\n>> > >> > +define m-lld-flags-cleaned\n>> > >> > +  $(subst prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/, \\\n>> > >> > +  $(subst out/,$(AOSP_ABSOLUTE_PATH)/out/,             \\\n>> > >> > +  $(subst -Wl$(comma)--fatal-warnings,,                \\\n>> > >> > +  $(subst -Wl$(comma)--no-undefined-version,,          \\\n>> > >> > +  $(subst -Wl$(comma)--gc-sections,,                   \\\n>> > >> > +  $(patsubst %dummy.o,,                                \\\n>> > >> > +    $(m-lld-flags)))))))\n>> > >> > +endef\n>> > >> > +\n>> > >> > +define m-cpp-flags\n>> > >> > +  $(PRIVATE_TARGET_GLOBAL_CFLAGS) \\\n>> > >> > +  $(PRIVATE_TARGET_GLOBAL_CPPFLAGS) \\\n>> > >> > +  $(PRIVATE_ARM_CFLAGS) \\\n>> > >> > +  $(PRIVATE_RTTI_FLAG) \\\n>> > >> > +  $(PRIVATE_CFLAGS) \\\n>> > >> > +  $(PRIVATE_CPPFLAGS) \\\n>> > >> > +  $(PRIVATE_DEBUG_CFLAGS) \\\n>> > >> > +  $(PRIVATE_CFLAGS_NO_OVERRIDE) \\\n>> > >> > +  $(PRIVATE_CPPFLAGS_NO_OVERRIDE)\n>> > >> > +endef\n>> > >> > +\n>> > >> > +define m-c-flags\n>> > >> > +  $(PRIVATE_TARGET_GLOBAL_CFLAGS) \\\n>> > >> > +  $(PRIVATE_TARGET_GLOBAL_CONLYFLAGS) \\\n>> > >> > +  $(PRIVATE_ARM_CFLAGS) \\\n>> > >> > +  $(PRIVATE_CFLAGS) \\\n>> > >> > +  $(PRIVATE_CONLYFLAGS) \\\n>> > >> > +  $(PRIVATE_DEBUG_CFLAGS) \\\n>> > >> > +  $(PRIVATE_CFLAGS_NO_OVERRIDE)\n>> > >> > +endef\n>> > >> > +\n>> > >> > +define filter-c-flags\n>> > >> > +  $(subst -std=gnu++17,, \\\n>> > >> > +  $(subst -fno-rtti,, \\\n>> > >> > +  $(patsubst  -W%,, \\\n>> > >> > +    $1)))\n>> > >> > +endef\n>> > >> > +\n>> > >> > +define m-c-includes-common\n>> > >> > +$(addprefix -I , $(PRIVATE_C_INCLUDES)) \\\n>> > >> > +$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),,\\\n>> > >> > +    $(addprefix -I ,\\\n>> > >> > +        $(filter-out $(PRIVATE_C_INCLUDES), \\\n>> > >> > +            $(PRIVATE_GLOBAL_C_INCLUDES))) \\\n>> > >> > +    $(addprefix -isystem ,\\\n>> > >> > +        $(filter-out $(PRIVATE_C_INCLUDES), \\\n>> > >> > +            $(PRIVATE_GLOBAL_C_SYSTEM_INCLUDES))))\n>> > >> > +endef\n>> > >> > +\n>> > >> > +ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 30; echo $$?), 0)\n>> > >> > +# Android 11+\n>> > >> > +define m-c-includes\n>> > >> > +$(foreach i,$(PRIVATE_IMPORTED_INCLUDES),$(EXPORTS.$(i)))\\\n>> > >> > +$(m-c-includes-common)\n>> > >> > +endef\n>> > >> > +define postprocess-includes\n>> > >> > +endef\n>> > >> > +else\n>> > >> > +# Android 10,9\n>> > >> > +$(MESON_GEN_FILES_TARGET): PRIVATE_IMPORT_INCLUDES :=\n>> > >> $(import_includes)\n>> > >> > +define postprocess-includes\n>> > >> > +     echo \" $$(cat $(PRIVATE_IMPORT_INCLUDES)) \" >\n>> > >> $(MESON_GEN_DIR)/import_includes && \\\n>> > >> > +     sed -i  -e ':a;N;$$!ba;s/\\n/ /g'\n>> > >> \\\n>> > >> > +             -e 's# \\{2,\\}# #g'\n>> > >> \\\n>> > >> > +             -e 's# -isystem # -isystem#g'\n>> > >>  \\\n>> > >> > +             -e 's# -I # -I#g'\n>> > >>  \\\n>> > >> > +             -e 's# -I# -I$(AOSP_ABSOLUTE_PATH)/#g'\n>> > >> \\\n>> > >> > +             -e 's# -isystem# -isystem$(AOSP_ABSOLUTE_PATH)/#g'\n>> > >> \\\n>> > >> > +             -e \"s# #','#g\" $(MESON_GEN_DIR)/import_includes &&\n>> > >> \\\n>> > >> > +     sed -i \"s#<_IMPORT_INCLUDES>#$$(cat\n>> > >> $(MESON_GEN_DIR)/import_includes)#g\" $(MESON_GEN_DIR)/aosp_cross\n>> > >> > +endef\n>> > >> > +define m-c-includes\n>> > >> > +<_IMPORT_INCLUDES> $(m-c-includes-common)\n>> > >> > +endef\n>> > >> > +endif\n>> > >> > +\n>> > >> > +define m-c-abs-includes\n>> > >> > +  $(subst\n>> $(space)-isystem,$(space)-isystem$(AOSP_ABSOLUTE_PATH)/, \\\n>> > >> > +  $(subst $(space)-I, -I$(AOSP_ABSOLUTE_PATH)/, \\\n>> > >> > +  $(subst $(space)-I$(space),$(space)-I, \\\n>> > >> > +  $(subst $(space)-isystem$(space),$(space)-isystem, \\\n>> > >> > +    $(strip $(m-c-includes))))))\n>> > >> > +endef\n>> > >> > +\n>> > >> > +$(MESON_GEN_FILES_TARGET):\n>> > >> MESON_GEN_PKGCONFIGS:=$(MESON_GEN_PKGCONFIGS)\n>> > >> > +$(MESON_GEN_FILES_TARGET): MESON_GEN_DIR:=$(MESON_GEN_DIR)\n>> > >> > +$(MESON_GEN_FILES_TARGET): $(sort $(shell find -L $(LIBCAMERA_TOP)\n>> > >> -not -path '*/\\.*'))\n>> > >> > +     mkdir -p $(dir $@)\n>> > >> > +     echo -e \"[properties]\\n\"\n>> > >>                                                         \\\n>> > >> > +             \"c_args = [$(foreach flag, $(call\n>> > >> filter-c-flags,$(m-c-flags) $(m-c-abs-includes)),'$(flag)', )'']\\n\"\n>> > >>      \\\n>> > >> > +             \"cpp_args = [$(foreach flag, $(call\n>> > >> filter-c-flags,$(m-cpp-flags) $(m-c-abs-includes)),'$(flag)', )'']\\n\"\n>> > >>    \\\n>> > >> > +             \"c_link_args = [$(foreach flag,\n>> > >> $(m-lld-flags-cleaned),'$(flag)',)'']\\n\"\n>> > >>       \\\n>> > >> > +             \"cpp_link_args = [$(foreach flag,\n>> > >> $(m-lld-flags-cleaned),'$(flag)',)'']\\n\"\n>> > >>     \\\n>> > >> > +             \"needs_exe_wrapper = true\\n\"\n>> > >>                                                         \\\n>> > >> > +             \"[binaries]\\n\"\n>> > >>                                                         \\\n>> > >> > +             \"ar =\n>> > >> '$(AOSP_ABSOLUTE_PATH)/$($($(M_TARGET_PREFIX))TARGET_AR)'\\n\"\n>> > >>                                 \\\n>> > >> > +             \"c = [$(foreach arg,$(PRIVATE_CC),'$(subst\n>> > >> prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/,$(arg))',)'']\\n\"\n>>    \\\n>> > >> > +             \"cpp = [$(foreach arg,$(PRIVATE_CXX),'$(subst\n>> > >> prebuilts/,$(AOSP_ABSOLUTE_PATH)/prebuilts/,$(arg))',)'']\\n\"        \\\n>> > >> > +             \"c_ld = 'lld'\\n\"\n>> > >>                                                         \\\n>> > >> > +             \"cpp_ld = 'lld'\\n\\n\"\n>> > >>                                                         \\\n>> > >> > +             \"pkgconfig = ['env', 'PKG_CONFIG_LIBDIR=' +\n>> > >> '$(AOSP_ABSOLUTE_PATH)/$(MESON_GEN_DIR)',\n>> '/usr/bin/pkg-config']\\n\\n\" \\\n>> > >> > +             \"llvm-config = '/dev/null'\\n\"\n>> > >>                                                          \\\n>> > >> > +             \"[host_machine]\\n\"\n>> > >>                                                         \\\n>> > >> > +             \"system = 'linux'\\n\"\n>> > >>                                                         \\\n>> > >> > +             \"cpu_family = '$(MESON_CPU_FAMILY)'\\n\"\n>> > >>                                                         \\\n>> > >> > +             \"cpu = '$(MESON_CPU_FAMILY)'\\n\"\n>> > >>                                                          \\\n>> > >> > +             \"endian = 'little'\" > $(dir $@)/aosp_cross\n>> > >> > +\n>> > >> > +     #\n>> > >> > +     $(foreach pkg, $(MESON_GEN_PKGCONFIGS), $(call\n>> > >> create-pkgconfig,$(dir $@),$(word 1, $(subst :, ,$(pkg))),$(word 2,\n>> $(subst\n>> > >> :, ,$(pkg)))))\n>> > >> > +     touch $@\n>> > >> > +\n>> > >> > +$(MESON_OUT_DIR)/.build.timestamp:\n>> MESON_GEN_NINJA:=$(MESON_GEN_NINJA)\n>> > >> > +$(MESON_OUT_DIR)/.build.timestamp: MESON_BUILD:=$(MESON_BUILD)\n>> > >> > +$(MESON_OUT_DIR)/.build.timestamp: $(MESON_GEN_FILES_TARGET)\n>> > >> $(link_deps)\n>> > >> > +     rm -rf $(dir $@)\n>> > >> > +     mkdir -p $(dir $@)\n>> > >> > +     mkdir -p $(dir $@)/build\n>> > >> > +     # Meson will update timestamps in sources directory,\n>> continuously\n>> > >> retriggering the build\n>> > >> > +     # even if nothing changed. Copy sources into intermediate\n>> dir to\n>> > >> avoid this effect.\n>> > >> > +     cp -r $(LIBCAMERA_TOP)/* $(dir $@)\n>> > >> > +     $(MESON_GEN_NINJA)\n>> > >> > +     $(MESON_BUILD)\n>> > >> > +     touch $@\n>> > >> > +\n>> > >> > +$(MESON_OUT_DIR)/install/.install.timestamp:\n>> > >> MESON_BUILD:=$(MESON_BUILD)\n>> > >> > +$(MESON_OUT_DIR)/install/.install.timestamp:\n>> > >> $(MESON_OUT_DIR)/.build.timestamp\n>> > >> > +     rm -rf $(dir $@)\n>> > >> > +     mkdir -p $(dir $@)\n>> > >> > +     DESTDIR=$(AOSP_ABSOLUTE_PATH)/$(dir $@) $(MESON_BUILD)\n>> install\n>> > >> > +     touch $@\n>> > >> > +\n>> > >> > +$(LIBCAMERA_BINS): $(MESON_OUT_DIR)/install/.install.timestamp\n>> > >> > +     echo \"Build $@\"\n>> > >> > +     touch $@\n>> > >>\n>> > >> --\n>> > >> Regards,\n>> > >>\n>> > >> Laurent Pinchart\n>> > >>\n>> > >\n>>\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id E5F28BD16B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 27 Oct 2022 05:59:02 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 57FD062F6D;\n\tThu, 27 Oct 2022 07:59:02 +0200 (CEST)","from mail-io1-xd2f.google.com (mail-io1-xd2f.google.com\n\t[IPv6:2607:f8b0:4864:20::d2f])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A770A61F4A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 27 Oct 2022 07:59:00 +0200 (CEST)","by mail-io1-xd2f.google.com with SMTP id p141so576200iod.6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 Oct 2022 22:59:00 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666850342;\n\tbh=JMAwScfglNVguuUX5Zy19GmAf2USK9SPyxYNmUixHHY=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=LE5Bfva+JQYqp/3wOustVrrlM+7VDWemFbgDuFFpbmPuvocohNWAyuIWoS3nxF7Qz\n\tpGGmT8DaQaU4wFjVjXAVvG+NgM11kJaMmJ9l6jIDfQZaFM4DFpqOigI+4SuEsIun18\n\tNr83orLvpn/Pe/hjxVMWtUewrws+T2CB18lEc5RXNQ4xgxq70xW5zca8iEwvvSl2HZ\n\tiue+arnAa/I4sUW043U8zM1IN+drDydwT9FQ9LrOTqcih4s3D5/mQuVDyXN1Wl4A8U\n\tyKMJ32j+69L5cARE0P/71Ce7f2zvG4IGljiDCx7EtMwuGfDnYk2h6kJo2IMnofCbM4\n\tw2GnM/Z5R+pdg==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=rothemail-net.20210112.gappssmtp.com; s=20210112;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=fpAj5H0Tees2i248Z1NfzRfssCtD6BBjntFnLc2KE/0=;\n\tb=2rH+R7t15Yy1xbnoUse2igeUSwWeh1g9xayKBs41pQwia3HNy2ZUlXv34Vstp9zUZq\n\teP320XiRX8vagIBArWaeJ8lbuNfqemqScHVIh3+02FcDUGFv83HktYszf1V9b8WtngBk\n\talOfhlgnAr9bPDSZ0VeCfAlpd0yQF3Alc/cgwvuPcvqK2FSwbwW1bD6k+WGrYUe9ccLz\n\txDxKitMCHoFMAi53NSNvio3akpHCZgC9QKi03pDSGqkFFG8KtLxbIYoRXY0TfLeKdWTO\n\tOGt0V3XQrCwISgOma7gTqSa5wnEHHcACyjC/5XDiUmvDQyGlTVrTcejaUPxjGHalt3Tx\n\tgwOA=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected)\n\theader.d=rothemail-net.20210112.gappssmtp.com\n\theader.i=@rothemail-net.20210112.gappssmtp.com header.b=\"2rH+R7t1\"; \n\tdkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=fpAj5H0Tees2i248Z1NfzRfssCtD6BBjntFnLc2KE/0=;\n\tb=ja8ebXWkrMZXjpNty88kqXSRG23cp9qwiVW4Bw+XlscanM2q+kPELSdSiKE/HJEjNx\n\tCgrJXAhB5X/17MXlL2OGNJ7McF6wJFjHhYrxgLGLen4TidS8hgBRznRrY0aPLTcsbLPT\n\t3ZtRYXc0AaDsbOhPiclkOF+ceIfkCdG/uKwqcl1LGBzXPCJrX8OGYUxikETNlt0PwJmc\n\tuSzuCD6bwG07sSo07iAG5o1cPPxecS0/lR0K6+exXVYPva9P0rTd/mdpcQT8Nz4+Vr8p\n\tzppOg7RrEKwswgO7+faGmh5eIISdTIK6gAEqLoaqcS2AWH8vxI/tBiiHcyTzMizvVAKn\n\td4Xg==","X-Gm-Message-State":"ACrzQf1fpEtQaZRQAz9LPVxgIRhum6LzT1ydPfumNGxDj8l3Kh7ZQZQZ\n\tb8yQmmL9QNCz1y2qjb7nWiyAkQVkJhpHdhzH7LwPKQtFuZYpPayk","X-Google-Smtp-Source":"AMsMyM5sMYbi0T7sAFuCe7VY2/XXZ5ZMyarPGDsy6fflm//watV0RnElFi6J/fzt0qBHyo7TQnT09cSWhLiE/jq0Acg=","X-Received":"by 2002:a05:6638:2613:b0:364:7c5:81dc with SMTP id\n\tm19-20020a056638261300b0036407c581dcmr28180741jat.225.1666850339147;\n\tWed, 26 Oct 2022 22:58:59 -0700 (PDT)","MIME-Version":"1.0","References":"<20221024055543.116040-1-nicholas@rothemail.net>\n\t<20221024055543.116040-10-nicholas@rothemail.net>\n\t<Y1coz2lb03qqCu30@pendragon.ideasonboard.com>\n\t<CAD2rFCrwdoHvTOnK9sORF35OB1z=w452HYd8Vn+VvAbLLhbBKQ@mail.gmail.com>\n\t<CAD2rFCrPqLRAuFj1mSTkUzL15TKckVhvKOfadTnqW1QVk8W31A@mail.gmail.com>\n\t<166677580075.3974115.709677145521307073@Monstersaurus>\n\t<CAD2rFCpAwatM4xPX6ZXmKia_jwMSM3xOQpNQMLfRToRA1PayJQ@mail.gmail.com>","In-Reply-To":"<CAD2rFCpAwatM4xPX6ZXmKia_jwMSM3xOQpNQMLfRToRA1PayJQ@mail.gmail.com>","Date":"Thu, 27 Oct 2022 00:58:48 -0500","Message-ID":"<CAD2rFCr2bWmcivf49=JMQ7P3ZjQLKtYt5sD_c7e7Pg6QG8JLUw@mail.gmail.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"0000000000005be90d05ebfdd6f5\"","Subject":"Re: [libcamera-devel] [PATCH 09/11] Adds Android makefiles to build\n\tlibcamera inline with AOSP.","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Nicholas Roth via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Nicholas Roth <nicholas@rothemail.net>","Cc":"Nicholas Roth via libcamera-devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]