mkdir include && run aidl-cpp

Result of:
$mkdir include
$aidl-cpp foo/IFoo.aidl include/ IFoo.cpp
diff --git a/aidl/IFoo.cpp b/aidl/IFoo.cpp
new file mode 100644
index 0000000..3184f01
--- /dev/null
+++ b/aidl/IFoo.cpp
@@ -0,0 +1,107 @@
+#include <foo/IFoo.h>
+#include <foo/BpFoo.h>
+
+namespace foo {
+
+IMPLEMENT_META_INTERFACE(Foo, "foo.IFoo")
+
+}  // namespace foo
+#include <foo/BpFoo.h>
+#include <binder/Parcel.h>
+
+namespace foo {
+
+BpFoo::BpFoo(const ::android::sp<::android::IBinder>& _aidl_impl)
+    : BpInterface<IFoo>(_aidl_impl){
+}
+
+::android::binder::Status BpFoo::add(int32_t a, int32_t b, int32_t* _aidl_return) {
+::android::Parcel _aidl_data;
+::android::Parcel _aidl_reply;
+::android::status_t _aidl_ret_status = ::android::OK;
+::android::binder::Status _aidl_status;
+_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
+if (((_aidl_ret_status) != (::android::OK))) {
+goto _aidl_error;
+}
+_aidl_ret_status = _aidl_data.writeInt32(a);
+if (((_aidl_ret_status) != (::android::OK))) {
+goto _aidl_error;
+}
+_aidl_ret_status = _aidl_data.writeInt32(b);
+if (((_aidl_ret_status) != (::android::OK))) {
+goto _aidl_error;
+}
+_aidl_ret_status = remote()->transact(IFoo::ADD, _aidl_data, &_aidl_reply);
+if (((_aidl_ret_status) != (::android::OK))) {
+goto _aidl_error;
+}
+_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
+if (((_aidl_ret_status) != (::android::OK))) {
+goto _aidl_error;
+}
+if (!_aidl_status.isOk()) {
+return _aidl_status;
+}
+_aidl_ret_status = _aidl_reply.readInt32(_aidl_return);
+if (((_aidl_ret_status) != (::android::OK))) {
+goto _aidl_error;
+}
+_aidl_error:
+_aidl_status.setFromStatusT(_aidl_ret_status);
+return _aidl_status;
+}
+
+}  // namespace foo
+#include <foo/BnFoo.h>
+#include <binder/Parcel.h>
+
+namespace foo {
+
+::android::status_t BnFoo::onTransact(uint32_t _aidl_code, const ::android::Parcel& _aidl_data, ::android::Parcel* _aidl_reply, uint32_t _aidl_flags) {
+::android::status_t _aidl_ret_status = ::android::OK;
+switch (_aidl_code) {
+case Call::ADD:
+{
+int32_t in_a;
+int32_t in_b;
+int32_t _aidl_return;
+if (!(_aidl_data.checkInterface(this))) {
+_aidl_ret_status = ::android::BAD_TYPE;
+break;
+}
+_aidl_ret_status = _aidl_data.readInt32(&in_a);
+if (((_aidl_ret_status) != (::android::OK))) {
+break;
+}
+_aidl_ret_status = _aidl_data.readInt32(&in_b);
+if (((_aidl_ret_status) != (::android::OK))) {
+break;
+}
+::android::binder::Status _aidl_status(add(in_a, in_b, &_aidl_return));
+_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
+if (((_aidl_ret_status) != (::android::OK))) {
+break;
+}
+if (!_aidl_status.isOk()) {
+break;
+}
+_aidl_ret_status = _aidl_reply->writeInt32(_aidl_return);
+if (((_aidl_ret_status) != (::android::OK))) {
+break;
+}
+}
+break;
+default:
+{
+_aidl_ret_status = ::android::BBinder::onTransact(_aidl_code, _aidl_data, _aidl_reply, _aidl_flags);
+}
+break;
+}
+if (_aidl_ret_status == ::android::UNEXPECTED_NULL) {
+_aidl_ret_status = ::android::binder::Status::fromExceptionCode(::android::binder::Status::EX_NULL_POINTER).writeToParcel(_aidl_reply);
+}
+return _aidl_ret_status;
+}
+
+}  // namespace foo
diff --git a/aidl/include/foo/BnFoo.h b/aidl/include/foo/BnFoo.h
new file mode 100644
index 0000000..f4130e4
--- /dev/null
+++ b/aidl/include/foo/BnFoo.h
@@ -0,0 +1,16 @@
+#ifndef AIDL_GENERATED_FOO_BN_FOO_H_
+#define AIDL_GENERATED_FOO_BN_FOO_H_
+
+#include <binder/IInterface.h>
+#include <foo/IFoo.h>
+
+namespace foo {
+
+class BnFoo : public ::android::BnInterface<IFoo> {
+public:
+::android::status_t onTransact(uint32_t _aidl_code, const ::android::Parcel& _aidl_data, ::android::Parcel* _aidl_reply, uint32_t _aidl_flags = 0) override;
+};  // class BnFoo
+
+}  // namespace foo
+
+#endif  // AIDL_GENERATED_FOO_BN_FOO_H_
diff --git a/aidl/include/foo/BpFoo.h b/aidl/include/foo/BpFoo.h
new file mode 100644
index 0000000..d84da8a
--- /dev/null
+++ b/aidl/include/foo/BpFoo.h
@@ -0,0 +1,20 @@
+#ifndef AIDL_GENERATED_FOO_BP_FOO_H_
+#define AIDL_GENERATED_FOO_BP_FOO_H_
+
+#include <binder/IBinder.h>
+#include <binder/IInterface.h>
+#include <utils/Errors.h>
+#include <foo/IFoo.h>
+
+namespace foo {
+
+class BpFoo : public ::android::BpInterface<IFoo> {
+public:
+explicit BpFoo(const ::android::sp<::android::IBinder>& _aidl_impl);
+virtual ~BpFoo() = default;
+::android::binder::Status add(int32_t a, int32_t b, int32_t* _aidl_return) override;
+};  // class BpFoo
+
+}  // namespace foo
+
+#endif  // AIDL_GENERATED_FOO_BP_FOO_H_
diff --git a/aidl/include/foo/IFoo.h b/aidl/include/foo/IFoo.h
new file mode 100644
index 0000000..a25dd28
--- /dev/null
+++ b/aidl/include/foo/IFoo.h
@@ -0,0 +1,23 @@
+#ifndef AIDL_GENERATED_FOO_I_FOO_H_
+#define AIDL_GENERATED_FOO_I_FOO_H_
+
+#include <binder/IBinder.h>
+#include <binder/IInterface.h>
+#include <binder/Status.h>
+#include <cstdint>
+#include <utils/StrongPointer.h>
+
+namespace foo {
+
+class IFoo : public ::android::IInterface {
+public:
+DECLARE_META_INTERFACE(Foo)
+virtual ::android::binder::Status add(int32_t a, int32_t b, int32_t* _aidl_return) = 0;
+enum Call {
+  ADD = ::android::IBinder::FIRST_CALL_TRANSACTION + 0,
+};
+};  // class IFoo
+
+}  // namespace foo
+
+#endif  // AIDL_GENERATED_FOO_I_FOO_H_