ifneq ($(KERNELRELEASE),) obj-m:=DriverFramework.o else KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: make -C $(KDIR) M=$(PWD) modules clean: make -C $(KDIR) M=$(PWD) clean endif
时间: 2024-04-27 10:19:38 浏览: 111
这段代码是什么意思呢?
这是一个 Makefile 文件,用于编译 Linux 内核模块。
第一行的 ifneq 表示如果 KERNELRELEASE 变量已经定义了,就执行下面的 obj-m 命令,否则执行下面的 KDIR 和 PWD 命令。
如果 KERNELRELEASE 已经定义了,说明这个 Makefile 是被内核源码树中的 Makefile 调用的,这时候要编译内核模块,所以要执行 obj-m 命令来生成目标文件。
如果 KERNELRELEASE 没有被定义,说明这个 Makefile 是被用户手动调用的,这时候要编译内核模块,所以要执行 KDIR 和 PWD 命令来设置内核源码树的路径和当前路径。然后执行 make 命令来编译内核模块。
最后,如果用户执行了 make clean 命令,就会执行 make 命令中的 clean 命令来清除编译生成的文件。
相关问题
LOCAL_PATH := $(my-dir) include $(CLEAR_VARS) LOCAL_MODULE := dangbei LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_PATH := $(TARGET_OUT_ODM)/bundled_persist-app LOCAL_SRC_FILES := $(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := PRESIGNED LOCAL_DEX_PREOPT := false LOCAL_ENFORCE_USES_LIBRARIES := false LOCAL_MODULE_TAGS := optional LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_JNI_SHARED_LIBRARIES_ABI := arm MY_LOCAL_PREBUILT_JNI_LIBS := \ lib/arm/libeuthenia-lib.so\ lib/arm/libjcore290.so\ MY_APP_LIB_PATH := $(TARGET_OUT_ODM)/bundled_persist-app/$(LOCAL_MODULE)/lib/$(LOCAL_JNI_SHARED_LIBRARIES_ABI) ifneq ($(LOCAL_JNI_SHARED_LIBRARIES_ABI), None) $(warning MY_APP_LIB_PATH=$(MY_APP_LIB_PATH)) LOCAL_POST_INSTALL_CMD := mkdir -p $(MY_APP_LIB_PATH) $(foreach lib, $(MY_LOCAL_PREBUILT_JNI_LIBS), ; cp -f $(LOCAL_PATH)/$(lib) $(MY_APP_LIB_PATH)/$(notdir $(lib))) endif include $(BUILD_PREBUILT)
这是一个 Android.mk 文件,用于编译一个名为 "dangbei" 的应用程序,并将其安装到系统的 "bundled_persist-app" 目录中。该应用程序使用了三个共享库:libeuthenia-lib.so、libjcore290.so 和一个未知的库。在安装应用程序时,这些库将被复制到 "dangbei" 应用程序的 "lib/arm" 目录下。
ifneq ($(shell umask):$(CURDIR):$(O),$(REQ_UMASK):$(CANONICAL_CURDIR):$(CANONICAL_O)) .PHONY: _all $(MAKECMDGOALS)
这段代码是一个 Makefile 中的条件语句和规则定义。
1. `$(shell umask):$(CURDIR):$(O)`:这里使用了 `shell` 函数来执行 shell 命令 `umask`,获取当前的文件权限掩码。`$(CURDIR)` 是内置变量,表示当前目录的路径。`$(O)` 是一个变量,表示构建目录的路径。将这三个值拼接成一个字符串。
2. `$(REQ_UMASK):$(CANONICAL_CURDIR):$(CANONICAL_O)`:`$(REQ_UMASK)` 是一个变量,表示所需的文件权限掩码。`$(CANONICAL_CURDIR)` 和 `$(CANONICAL_O)` 是其他变量,表示规范化后的当前目录和构建目录的路径。将这三个值拼接成一个字符串。
3. `ifneq ($(shell umask):$(CURDIR):$(O),$(REQ_UMASK):$(CANONICAL_CURDIR):$(CANONICAL_O))`:这个条件语句比较两个拼接后的字符串是否相等。如果不相等,则条件满足。
4. `.PHONY: _all $(MAKECMDGOALS)`:这是一个规则定义,`.PHONY` 声明了伪目标,表示 `_all` 和 `$(MAKECMDGOALS)` 是伪目标(不对应实际的文件),而不是真正的文件或规则。这样,在执行这两个伪目标时,不会检查它们对应的文件是否存在或是否需要更新。
综上所述,这段代码的作用是在特定条件下定义了两个伪目标 `_all` 和 `$(MAKECMDGOALS)`。条件是比较当前的文件权限掩码、当前目录和构建目录与所需的文件权限掩码、规范化后的当前目录和构建目录是否相等。如果不相等,则执行伪目标时不会进行文件存在性检查。
阅读全文