From 6a6e9d22b338bb2c290b7c7fd0ae434ad13232d9 Mon Sep 17 00:00:00 2001
From: Paul Elder <paul.elder@ideasonboard.com>
Date: Tue, 26 Jun 2018 23:22:25 +0900
Subject: lib: Compile custom glob() implementation for Android

The Android C library doesn't provide the glob() function which we use
in the configfs code. Add conditional compilation to cmake such that a
local copy of glob is automatically compiled if glob isn't provided.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 CMakeLists.txt            |  7 +++++++
 include/config.h.in       |  9 +++++++++
 include/glob.h            | 20 ++++++++++++++++++++
 lib/CMakeLists.txt        |  2 ++
 lib/compat/CMakeLists.txt | 12 ++++++++++++
 5 files changed, 50 insertions(+)
 create mode 100644 include/config.h.in
 create mode 100644 include/glob.h
 create mode 100644 lib/compat/CMakeLists.txt

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 79b78c4..29ab2c1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,7 +4,14 @@ set(CMAKE_BUILD_TYPE Release)
 
 #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wno-unused-parameter -Werror")
 
+include_directories(${CMAKE_BINARY_DIR}/generated)
+
 add_subdirectory(lib)
+
+# Generate config.h
+configure_file(${CMAKE_SOURCE_DIR}/include/config.h.in
+	       ${CMAKE_BINARY_DIR}/generated/config.h)
+
 add_executable(uvc-gadget main.c)
 target_link_libraries(uvc-gadget uvcgadget)
 install(TARGETS uvc-gadget DESTINATION bin)
diff --git a/include/config.h.in b/include/config.h.in
new file mode 100644
index 0000000..c968271
--- /dev/null
+++ b/include/config.h.in
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#ifndef __UVC_GADGET_CONFIG_H__
+#define __UVC_GADGET_CONFIG_H__
+
+#cmakedefine HAVE_DIRENT_H	@HAVE_DIRENT_H@
+#cmakedefine HAVE_GLOB		@HAVE_GLOB@
+
+#endif
diff --git a/include/glob.h b/include/glob.h
new file mode 100644
index 0000000..d3ddcff
--- /dev/null
+++ b/include/glob.h
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * glob() compatibility
+ *
+ * Copyright (C) 2018 Laurent Pinchart
+ *
+ * Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+ */
+#ifndef __UVC_GADGET_GLOB_H__
+#define __UVC_GADGET_GLOB_H__
+
+#include "config.h"
+
+#ifdef HAVE_GLOB
+#include_next <glob.h>
+#else
+#include "compat/glob.h"
+#endif
+
+#endif /* __UVC_GADGET_GLOB_H__ */
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index ca08fd7..eacfb9c 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -1,6 +1,8 @@
 file(GLOB SOURCES "*.c" "*.h")
 file(GLOB HEADERS "../include/uvcgadget/*.h")
 
+add_subdirectory(compat)
+
 add_library(uvcgadget ${SOURCES})
 
 set_target_properties(uvcgadget PROPERTIES PUBLIC_HEADER "${HEADERS}")
diff --git a/lib/compat/CMakeLists.txt b/lib/compat/CMakeLists.txt
new file mode 100644
index 0000000..5fd6db4
--- /dev/null
+++ b/lib/compat/CMakeLists.txt
@@ -0,0 +1,12 @@
+include(CheckFunctionExists)
+include(CheckIncludeFile)
+
+check_include_file(dirent.h HAVE_DIRENT_H)
+
+check_function_exists(glob HAVE_GLOB)
+if(NOT HAVE_GLOB)
+	set(SOURCES "${SOURCES}"
+	    "${CMAKE_CURRENT_SOURCE_DIR}/glob.c"
+	    "${CMAKE_SOURCE_DIR}/include/compat/glob.h"
+	    PARENT_SCOPE)
+endif()
-- 
cgit v1.2.3