将主机特定的* .c / *。h添加到autotool的项目中

时间:2015-01-29 03:19:49

标签: c linux android-ndk autotools

我正在尝试使用Android NDK交叉编译库。我收到错误是因为NDK的linux/quota.h未按照库的预期实现quotactl()manpage)。

Android内核实现quotactl()作为系统调用,因此我的计划是创建一个简单函数,只使用quotactl()syscall()转发到__NR_quotactl

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。因为这是特定于主机的更改,所以我希望它对automake文件透明,这意味着将其添加到configure.ac文件中。

我可以在configure.ac中的交换机块中添加特定于Android的autoconf代码:

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()的组件的源列表中。

1 个答案:

答案 0 :(得分:2)

首先,定义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:如果您仍想使用条件源集而不是使用ifdef包装内容,这很容易做到。只需关注the doc,然后将linux替换为android