将特定于主机的*.c/*.h添加到autotool';教育项目

将特定于主机的*.c/*.h添加到autotool';教育项目,c,linux,android-ndk,autotools,C,Linux,Android Ndk,Autotools,我正在尝试使用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,

我正在尝试使用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.c
添加到每个构建目标中,并且仅当构建用于android主机时才包含我的
quota.h
文件?我的目标是让这个黑客尽可能独立于项目的其他部分


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

首先,定义
ANDROID
宏是多余的。如果您使用的是Android NDK,那么gcc和clang都已经定义了
\uuuuu Android\uuuu

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

\ifdef\uu ANDROID__
#包括“配额.h”
#包括
int quotactl(int cmd,常量字符*特殊,int id,caddr_t addr){
系统调用(编号、命令、特殊、id、地址);
}
#endif/*.\uu安卓系统*/

UPD:如果您仍然希望使用条件源集而不是使用ifdef包装内容,那么这很容易做到。只需按照
linux
替换为
android

对不起,如果我误解了,但是您能澄清一下:如果android(linux)内核实现了
quotactl
,您需要特殊的代码来利用它。如果它是另一个操作系统,您只需要为
quotactl
?某种类型的文件创建存根。Android内核(至少有3个现有版本)肯定实现了
quotactl()
,但NDK没有提供声明。其他操作系统也可以,因为它们使用的标准头声明函数和实现它的东西(可能是libc)。我的计划是,当构建用于android主机时,在我自己的实现中编译,在内核中使用
syscall()
+1 for
\uuuu android
调用
quotactl()
。似乎有条件地编译整个源文件比使用
#ifdef
更干净,我已经更新了这个问题。此外,没有一个通用的源列表,是否有一种idomatic方法可以使用autotools将其添加到所有目标?如果您仍然希望使用条件源集而不是使用ifdef包装内容,这很容易做到。只需遵循doc:并将
linux
替换为
android
。太好了,谢谢!如果你想在你的回答中加上这个,我会接受的
case $host_os in

   *mingw32*)
     ...
     ;;

  *darwin*)
    ...
    ;;

   *android*)
    have_android="yes"
    # something...
    ;;

esac