将特定于主机的 *.c/*.h 添加到自动工具项目中



我正在尝试使用Android NDK交叉编译一个库。我收到错误,因为 NDK 的linux/quota.h没有按照库的预期实现quotactl()(手册页)。

Android 内核将quotactl()实现为系统调用,所以我的计划是创建一个存根函数,该函数使用 __NR_quotactl 简单地将quotactl()转发给syscall()

quota.h:
#include <linux/quota.h>
int quotactl(int cmd, const char *special, int id, caddr_t addr);
quota.c:
#include "quota.h"
#include <sys/syscall.h>
int quotactl(int cmd, const char *special, int id, caddr_t addr) {
    syscall(__NR_quotactl, cmd, special, id, addr);
}

(为简洁起见,quota.h省略了包含保护)

我正在交叉编译的库使用autoconf,libtools和automake。由于这是特定于主机的更改,因此我希望它对自动制作文件透明,这意味着将其添加到configure.ac文件中。

我可以在 configure.ac 中已经在开关块中添加特定于 android 的自动确认代码:

case $host_os in
   *mingw32*)
     ...
     ;;
  *darwin*)
    ...
    ;;
   *android*)
    have_android="yes"
    # something...
    ;;
esac

有没有一种惯用的、干净的、自动工具的方法来将我的quota.c添加到每个构建目标,并仅在构建适用于 android 主机时才包含我的quota.h文件? 我的目标是让这个黑客尽可能独立于项目的其余部分。

我计划在根项目目录中添加一个compat/android/sys目录并将它们放在那里。然后我可以通过 gcc 的 -I 标志包含它,并将quota.c添加到需要quotactl()的组件的来源列表中。

首先,定义ANDROID宏是多余的。如果您使用的是 Android NDK,则 gcc 和 clang 都已经定义了__ANDROID__宏。

其次,实现所需目标的最简单方法是将 quota.c 添加到通用源列表中,但使用 ifdef 包装其内容:

#ifdef __ANDROID__
#include "quota.h"
#include <sys/syscall.h>
int quotactl(int cmd, const char *special, int id, caddr_t addr) {
    syscall(__NR_quotactl, cmd, special, id, addr);
}
#endif /* __ANDROID__ */

UPD:如果您仍然想使用条件源集而不是使用 ifdefs 包装内容,这很容易做到。只需按照文档进行操作,linux替换为 android .

最新更新