diff mbox

Raspberry Pi - WiringPi Library Package

Message ID 1373519960-6212-1-git-send-email-g@maral.me
State Superseded
Headers show

Commit Message

Guillermo A . Amaral July 11, 2013, 5:19 a.m. UTC
From: "Guillermo A. Amaral" <g@maral.me>


Signed-off-by: Guillermo A. Amaral <g@maral.me>
---
 package/Config.in                                 |   1 +
 package/wiringpi/Config.in                        |   8 ++
 package/wiringpi/wiringpi-CLOEXEC-undefined.patch |  29 +++++
 package/wiringpi/wiringpi-cmake-support.patch     | 122 ++++++++++++++++++++++
 package/wiringpi/wiringpi.mk                      |  14 +++
 5 files changed, 174 insertions(+)
 create mode 100644 package/wiringpi/Config.in
 create mode 100644 package/wiringpi/wiringpi-CLOEXEC-undefined.patch
 create mode 100644 package/wiringpi/wiringpi-cmake-support.patch
 create mode 100644 package/wiringpi/wiringpi.mk

Comments

Baruch Siach July 11, 2013, 5:33 a.m. UTC | #1
Hi Guillermo,

On Wed, Jul 10, 2013 at 10:19:20PM -0700, Guillermo A. Amaral wrote:
> From: "Guillermo A. Amaral" <g@maral.me>
> 
> 
> Signed-off-by: Guillermo A. Amaral <g@maral.me>
> ---

[...]

> diff --git a/package/wiringpi/wiringpi-CLOEXEC-undefined.patch 
> b/package/wiringpi/wiringpi-CLOEXEC-undefined.patch
> new file mode 100644
> index 0000000..ca0ed99
> --- /dev/null
> +++ b/package/wiringpi/wiringpi-CLOEXEC-undefined.patch
> @@ -0,0 +1,29 @@
> +From 728b2634cbf661e5303b1e8cb791b909ad4e907c Mon Sep 17 00:00:00 2001
> +From: "Guillermo A. Amaral" <g@maral.me>
> +Date: Wed, 10 Jul 2013 22:05:12 -0700
> +Subject: [PATCH] Declare O_CLOEXEC on systems with an older kernel and/or
> + glibc.
> +
> +Signed-off-by: Guillermo A. Amaral <g@maral.me>
> +---
> + wiringPi/wiringPi.c | 4 ++++
> + 1 file changed, 4 insertions(+)
> +
> +diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c
> +index ba61d9f..2ee23b9 100644
> +--- a/wiringPi/wiringPi.c
> ++++ b/wiringPi/wiringPi.c
> +@@ -77,6 +77,10 @@
> + #define	FALSE	(1==2)
> + #endif
> + 
> ++#ifndef O_CLOEXEC
> ++#define O_CLOEXEC 0

Are you sure? I see

#define O_CLOEXEC      02000000

in include/uapi/asm-generic/fcntl.h.

baruch

> ++#endif
> ++
> + // Environment Variables
> + 
> + #define	ENV_DEBUG	"WIRINGPI_DEBUG"
> +--
Guillermo A . Amaral July 11, 2013, 6 a.m. UTC | #2
On Thu, Jul 11, 2013 at 08:33:59AM +0300, Baruch Siach wrote:
> Hi Guillermo,
> 
> On Wed, Jul 10, 2013 at 10:19:20PM -0700, Guillermo A. Amaral wrote:
> > From: "Guillermo A. Amaral" <g@maral.me>
> > 
> > 
> > Signed-off-by: Guillermo A. Amaral <g@maral.me>
> > ---
> 
> [...]
> 
> > diff --git a/package/wiringpi/wiringpi-CLOEXEC-undefined.patch 
> > b/package/wiringpi/wiringpi-CLOEXEC-undefined.patch
> > new file mode 100644
> > index 0000000..ca0ed99
> > --- /dev/null
> > +++ b/package/wiringpi/wiringpi-CLOEXEC-undefined.patch
> > @@ -0,0 +1,29 @@
> > +From 728b2634cbf661e5303b1e8cb791b909ad4e907c Mon Sep 17 00:00:00 2001
> > +From: "Guillermo A. Amaral" <g@maral.me>
> > +Date: Wed, 10 Jul 2013 22:05:12 -0700
> > +Subject: [PATCH] Declare O_CLOEXEC on systems with an older kernel and/or
> > + glibc.
> > +
> > +Signed-off-by: Guillermo A. Amaral <g@maral.me>
> > +---
> > + wiringPi/wiringPi.c | 4 ++++
> > + 1 file changed, 4 insertions(+)
> > +
> > +diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c
> > +index ba61d9f..2ee23b9 100644
> > +--- a/wiringPi/wiringPi.c
> > ++++ b/wiringPi/wiringPi.c
> > +@@ -77,6 +77,10 @@
> > + #define	FALSE	(1==2)
> > + #endif
> > + 
> > ++#ifndef O_CLOEXEC
> > ++#define O_CLOEXEC 0
> 
> Are you sure? I see
> 
> #define O_CLOEXEC      02000000
> 
> in include/uapi/asm-generic/fcntl.h.
> 

Hi baruch,

Usage of O_CLOEXEC in wiringPi was added very recently, it started failing
after that. I hear it still works if you're using glibc though (I haven't
tested it).

Here's the output if you remove the patch:

	/development/test/build/wiringpi-02a3bd8d8f2ae5c873e63875a8faef5b627f9db6/wiringPi/wiringPi.c: In function ‘wiringPiSetup’:
	/development/test/build/wiringpi-02a3bd8d8f2ae5c873e63875a8faef5b627f9db6/wiringPi/wiringPi.c:1544:49: error: ‘O_CLOEXEC’ undeclared (first use in this function)
	/development/test/build/wiringpi-02a3bd8d8f2ae5c873e63875a8faef5b627f9db6/wiringPi/wiringPi.c:1544:49: note: each undeclared identifier is reported only once for each function it appears in
	make[2]: *** [wiringPi/CMakeFiles/wiringPi.dir/wiringPi.c.o] Error 1
	make[1]: *** [wiringPi/CMakeFiles/wiringPi.dir/all] Error 2
	make: *** [all] Error 2

Cheers,
G
Baruch Siach July 11, 2013, 6:04 a.m. UTC | #3
Hi Guillermo,

On Wed, Jul 10, 2013 at 11:00:08PM -0700, Guillermo A. Amaral wrote:
> On Thu, Jul 11, 2013 at 08:33:59AM +0300, Baruch Siach wrote:
> > On Wed, Jul 10, 2013 at 10:19:20PM -0700, Guillermo A. Amaral wrote:
> > > From: "Guillermo A. Amaral" <g@maral.me>
> > > 
> > > 
> > > Signed-off-by: Guillermo A. Amaral <g@maral.me>
> > > ---

[...]

> > > ++#ifndef O_CLOEXEC
> > > ++#define O_CLOEXEC 0
> > 
> > Are you sure? I see
> > 
> > #define O_CLOEXEC      02000000
> > 
> > in include/uapi/asm-generic/fcntl.h.
> > 
> 
> Hi baruch,
> 
> Usage of O_CLOEXEC in wiringPi was added very recently, it started failing
> after that. I hear it still works if you're using glibc though (I haven't
> tested it).
> 
> Here's the output if you remove the patch:
> 
> 	/development/test/build/wiringpi-02a3bd8d8f2ae5c873e63875a8faef5b627f9db6/wiringPi/wiringPi.c: In function ‘wiringPiSetup’:
> 	/development/test/build/wiringpi-02a3bd8d8f2ae5c873e63875a8faef5b627f9db6/wiringPi/wiringPi.c:1544:49: error: ‘O_CLOEXEC’ undeclared (first use in this function)
> 	/development/test/build/wiringpi-02a3bd8d8f2ae5c873e63875a8faef5b627f9db6/wiringPi/wiringPi.c:1544:49: note: each undeclared identifier is reported only once for each function it appears in
> 	make[2]: *** [wiringPi/CMakeFiles/wiringPi.dir/wiringPi.c.o] Error 1
> 	make[1]: *** [wiringPi/CMakeFiles/wiringPi.dir/all] Error 2
> 	make: *** [all] Error 2

I didn't say you should remove this patch, just use the correct value. Setting 
O_CLOEXEC to 0 makes it effectively a no-op. Is this intended?

baruch
Guillermo A . Amaral July 11, 2013, 6:38 a.m. UTC | #4
On Thu, Jul 11, 2013 at 09:04:19AM +0300, Baruch Siach wrote:
> Hi Guillermo,
> 
> On Wed, Jul 10, 2013 at 11:00:08PM -0700, Guillermo A. Amaral wrote:
> > On Thu, Jul 11, 2013 at 08:33:59AM +0300, Baruch Siach wrote:
> > > On Wed, Jul 10, 2013 at 10:19:20PM -0700, Guillermo A. Amaral wrote:
> > > > From: "Guillermo A. Amaral" <g@maral.me>
> > > > 
> > > > 
> > > > Signed-off-by: Guillermo A. Amaral <g@maral.me>
> > > > ---
> 
> [...]
> 
> > > > ++#ifndef O_CLOEXEC
> > > > ++#define O_CLOEXEC 0
> > > 
> > > Are you sure? I see
> > > 
> > > #define O_CLOEXEC      02000000
> > > 
> > > in include/uapi/asm-generic/fcntl.h.
> > > 
> > 
> > Hi baruch,
> > 
> > Usage of O_CLOEXEC in wiringPi was added very recently, it started failing
> > after that. I hear it still works if you're using glibc though (I haven't
> > tested it).
> > 
> > Here's the output if you remove the patch:
> > 
> > 	/development/test/build/wiringpi-02a3bd8d8f2ae5c873e63875a8faef5b627f9db6/wiringPi/wiringPi.c: In function ‘wiringPiSetup’:
> > 	/development/test/build/wiringpi-02a3bd8d8f2ae5c873e63875a8faef5b627f9db6/wiringPi/wiringPi.c:1544:49: error: ‘O_CLOEXEC’ undeclared (first use in this function)
> > 	/development/test/build/wiringpi-02a3bd8d8f2ae5c873e63875a8faef5b627f9db6/wiringPi/wiringPi.c:1544:49: note: each undeclared identifier is reported only once for each function it appears in
> > 	make[2]: *** [wiringPi/CMakeFiles/wiringPi.dir/wiringPi.c.o] Error 1
> > 	make[1]: *** [wiringPi/CMakeFiles/wiringPi.dir/all] Error 2
> > 	make: *** [all] Error 2
> 
> I didn't say you should remove this patch, just use the correct value. Setting 
> O_CLOEXEC to 0 makes it effectively a no-op. Is this intended?

Sorry baruch,

I thought you where asking it if was required. -.-'

I searched around for alternative ways around the issue when I first
encountered it, it seemed no-oping it would be most portable/safest approach.

Since, if it's not defined, it might be for a reason, the outcome of setting
it to 02000000 would also be unknown.

G
Carsten Schoenert July 11, 2013, 7:42 a.m. UTC | #5
Hello Guillermo,

Am 11.07.2013 08:38, schrieb Guillermo A. Amaral:
> I searched around for alternative ways around the issue when I first
> encountered it, it seemed no-oping it would be most portable/safest approach.

The O_CLOEXEC variable was introduced in 2.6.23.

>        O_CLOEXEC (Since Linux 2.6.23)
>               Enable the close-on-exec flag for the new file descriptor.
>               Specifying this flag permits a program to avoid additional
>               fcntl(2) F_SETFD operations to set the FD_CLOEXEC flag.
>               Additionally, use of this flag is essential in some
>               multithreaded programs since using a separate fcntl(2) F_SETFD
>               operation to set the FD_CLOEXEC flag does not suffice to avoid
>               race conditions where one thread opens a file descriptor at
>               the same time as another thread does a fork(2) plus execve(2).

So if you use a kernel less then 2.6.23 it make no sense to define
O_CLOEXEC to whatever you want, the kernel doesn't know this. And in the
opposite you can't defined it to some different then already defined for
O_CLOEXEC.

The function 'open' can also used without the 3rd parameter.

So I think you have to check which kernel version is used and build a
patch which does something like

#ifdef KERNEL_VER < 2_6_23
  if ((fd = open ("/dev/mem", O_RDWR | O_SYNC) ) < 0)
#else
  if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0)
#endif

The guys from linux-wireless do a lot of this to get the wireless
package working om different kernel versions.

Regards
Carsten
Guillermo A . Amaral July 11, 2013, 5:55 p.m. UTC | #6
Howdy Carsten,

On Thu, Jul 11, 2013 at 09:42:28AM +0200, Carsten Schoenert wrote:
> Hello Guillermo,
> 
> Am 11.07.2013 08:38, schrieb Guillermo A. Amaral:
> > I searched around for alternative ways around the issue when I first
> > encountered it, it seemed no-oping it would be most portable/safest approach.
> 
> The O_CLOEXEC variable was introduced in 2.6.23.
> 
> >        O_CLOEXEC (Since Linux 2.6.23)
> >               Enable the close-on-exec flag for the new file descriptor.
> >               Specifying this flag permits a program to avoid additional
> >               fcntl(2) F_SETFD operations to set the FD_CLOEXEC flag.
> >               Additionally, use of this flag is essential in some
> >               multithreaded programs since using a separate fcntl(2) F_SETFD
> >               operation to set the FD_CLOEXEC flag does not suffice to avoid
> >               race conditions where one thread opens a file descriptor at
> >               the same time as another thread does a fork(2) plus execve(2).
> 
> So if you use a kernel less then 2.6.23 it make no sense to definess then 2.6.23 it make no sense to define
> O_CLOEXEC to whatever you want, the kernel doesn't know this. And in the
> opposite you can't defined it to some different then already defined for
> O_CLOEXEC.
>
> The function 'open' can also used without the 3rd parameter.
> 
> So I think you have to check which kernel version is used and build a
> patch which does something like
> 
> #ifdef KERNEL_VER < 2_6_23
>   if ((fd = open ("/dev/mem", O_RDWR | O_SYNC) ) < 0)
> #else
>   if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0)
> #endif
>
> The guys from linux-wireless do a lot of this to get the wireless
> package working om dif

The Raspberry Pi doesn't go down to 2.6.y, the oldest supported version is
3.2.27. :)

So there should be no need to do the kernel check, since the package is RPi
specific.

The problem here was that O_CLOEXEC was not defined with the default uclibc
and older versions of glibc.

Cheers,
G
Baruch Siach July 11, 2013, 6:06 p.m. UTC | #7
Hi Guillermo,

On Thu, Jul 11, 2013 at 10:55:30AM -0700, Guillermo Amaral wrote:
> The Raspberry Pi doesn't go down to 2.6.y, the oldest supported version is
> 3.2.27. :)

If this is the case, then there is no reason to make O_CLOEXEC a no-op.

> So there should be no need to do the kernel check, since the package is RPi
> specific.
> 
> The problem here was that O_CLOEXEC was not defined with the default uclibc
> and older versions of glibc.

The O_CLOEXEC define comes with the kernel headers used to build the 
toolchain, not from the C library.

baruch
Guillermo A . Amaral July 11, 2013, 6:22 p.m. UTC | #8
Hey Baruch,

On Thu, Jul 11, 2013 at 09:06:03PM +0300, Baruch Siach wrote:
> Hi Guillermo,
> 
> On Thu, Jul 11, 2013 at 10:55:30AM -0700, Guillermo Amaral wrote:
> > The Raspberry Pi doesn't go down to 2.6.y, the oldest supported version is
> > 3.2.27. :)
> 
> If this is the case, then there is no reason to make O_CLOEXEC a no-op.
> 
> > So there should be no need to do the kernel check, since the package is RPi
> > specific.
> > 
> > The problem here was that O_CLOEXEC was not defined with the default uclibc
> > and older versions of glibc.
> 
> The O_CLOEXEC define comes with the kernel headers used to build the 
> toolchain, not from the C library.
> 

I didn't say it didn't. I'll clarify, if __USE_GNU and/or __USE_XOPEN2K8 don't
get defined at some point O_CLOEXEC is not getting defined. My guess is that
they get defined by *libc, feel free to correct me if I'm wrong.

G
Baruch Siach July 12, 2013, 3:24 a.m. UTC | #9
Hi Guillermo,

On Thu, Jul 11, 2013 at 11:22:58AM -0700, Guillermo Amaral wrote:
> On Thu, Jul 11, 2013 at 09:06:03PM +0300, Baruch Siach wrote:
> > On Thu, Jul 11, 2013 at 10:55:30AM -0700, Guillermo Amaral wrote:
> > > The Raspberry Pi doesn't go down to 2.6.y, the oldest supported version is
> > > 3.2.27. :)
> > 
> > If this is the case, then there is no reason to make O_CLOEXEC a no-op.
> > 
> > > So there should be no need to do the kernel check, since the package is RPi
> > > specific.
> > > 
> > > The problem here was that O_CLOEXEC was not defined with the default uclibc
> > > and older versions of glibc.
> > 
> > The O_CLOEXEC define comes with the kernel headers used to build the 
> > toolchain, not from the C library.
> 
> I didn't say it didn't. I'll clarify, if __USE_GNU and/or __USE_XOPEN2K8 don't
> get defined at some point O_CLOEXEC is not getting defined. My guess is that
> they get defined by *libc, feel free to correct me if I'm wrong.

The code below builds just fine on my machine:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void func(void) { open("f", O_RDWR | O_CLOEXEC); }

baruch
Guillermo A . Amaral July 12, 2013, 4:30 a.m. UTC | #10
Howdy Baruch,

On Fri, Jul 12, 2013 at 06:24:30AM +0300, Baruch Siach wrote:
> Hi Guillermo,
> 
> On Thu, Jul 11, 2013 at 11:22:58AM -0700, Guillermo Amaral wrote:
> > On Thu, Jul 11, 2013 at 09:06:03PM +0300, Baruch Siach wrote:
> > > On Thu, Jul 11, 2013 at 10:55:30AM -0700, Guillermo Amaral wrote:
> > > > The Raspberry Pi doesn't go down to 2.6.y, the oldest supported version is
> > > > 3.2.27. :)
> > > 
> > > If this is the case, then there is no reason to make O_CLOEXEC a no-op.
> > > 
> > > > So there should be no need to do the kernel check, since the package is RPi
> > > > specific.
> > > > 
> > > > The problem here was that O_CLOEXEC was not defined with the default uclibc
> > > > and older versions of glibc.
> > > 
> > > The O_CLOEXEC define comes with the kernel headers used to build the 
> > > toolchain, not from the C library.
> > 
> > I didn't say it didn't. I'll clarify, if __USE_GNU and/or __USE_XOPEN2K8 don't
> > get defined at some point O_CLOEXEC is not getting defined. My guess is that
> > they get defined by *libc, feel free to correct me if I'm wrong.
> 
> The code below builds just fine on my machine:
> 
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>
> 
> void func(void) { open("f", O_RDWR | O_CLOEXEC); }

Congratulations, I'm very proud. Have a beer on me! (B)

G

P.S.

$ host/usr/bin/arm-linux-gcc -c x.c
x.c: In function ‘func’:
x.c:5:38: error: ‘O_CLOEXEC’ undeclared (first use in this function)
x.c:5:38: note: each undeclared identifier is reported only once for each
function it appears in

$ cat x.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void func(void) { open("f", O_RDWR | O_CLOEXEC); }
Baruch Siach July 12, 2013, 6:47 a.m. UTC | #11
Hi Guillermo,
On Thu, Jul 11, 2013 at 09:30:56PM -0700, Guillermo Amaral wrote:
> On Fri, Jul 12, 2013 at 06:24:30AM +0300, Baruch Siach wrote:
> > On Thu, Jul 11, 2013 at 11:22:58AM -0700, Guillermo Amaral wrote:
> > > On Thu, Jul 11, 2013 at 09:06:03PM +0300, Baruch Siach wrote:
> > > > On Thu, Jul 11, 2013 at 10:55:30AM -0700, Guillermo Amaral wrote:
> > > > > The Raspberry Pi doesn't go down to 2.6.y, the oldest supported version is
> > > > > 3.2.27. :)
> > > > 
> > > > If this is the case, then there is no reason to make O_CLOEXEC a no-op.
> > > > 
> > > > > So there should be no need to do the kernel check, since the package is RPi
> > > > > specific.
> > > > > 
> > > > > The problem here was that O_CLOEXEC was not defined with the default uclibc
> > > > > and older versions of glibc.
> > > > 
> > > > The O_CLOEXEC define comes with the kernel headers used to build the 
> > > > toolchain, not from the C library.
> > > 
> > > I didn't say it didn't. I'll clarify, if __USE_GNU and/or __USE_XOPEN2K8 don't
> > > get defined at some point O_CLOEXEC is not getting defined. My guess is that
> > > they get defined by *libc, feel free to correct me if I'm wrong.
> > 
> > The code below builds just fine on my machine:
> > 
> > #include <sys/types.h>
> > #include <sys/stat.h>
> > #include <fcntl.h>
> > 
> > void func(void) { open("f", O_RDWR | O_CLOEXEC); }
> 
> Congratulations, I'm very proud. Have a beer on me! (B)
> 
> G
> 
> P.S.
> 
> $ host/usr/bin/arm-linux-gcc -c x.c
> x.c: In function ‘func’:
> x.c:5:38: error: ‘O_CLOEXEC’ undeclared (first use in this function)
> x.c:5:38: note: each undeclared identifier is reported only once for each
> function it appears in
> 
> $ cat x.c
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>
> 
> void func(void) { open("f", O_RDWR | O_CLOEXEC); }

And does defining __USE_GNU and/or __USE_XOPEN2K8 improves the situation?

My point is that the existence of O_CLOEXEC at build time is determined by the 
version of the kernel headers in the toolchain. At run time, O_CLOEXEC is 
effective when the running kernel supports it. The toolchain you are using is 
based on on old kernel headers, so you need to define O_CLOEXEC yourself, 
which is fine. The kernel running on a Raspberry Pi should always be recent 
enough to support O_CLOEXEC. So the right solution, in my opinion, is to 
define O_CLOEXEC to its real value.

baruch
diff mbox

Patch

diff --git a/package/Config.in b/package/Config.in
index 3186bb7..2824904 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -303,6 +303,7 @@  source "package/usb_modeswitch_data/Config.in"
 source "package/usbmount/Config.in"
 source "package/usbutils/Config.in"
 source "package/wipe/Config.in"
+source "package/wiringpi/Config.in"
 source "package/w_scan/Config.in"
 endmenu
 
diff --git a/package/wiringpi/Config.in b/package/wiringpi/Config.in
new file mode 100644
index 0000000..f368bf7
--- /dev/null
+++ b/package/wiringpi/Config.in
@@ -0,0 +1,8 @@ 
+config BR2_PACKAGE_WIRINGPI
+	bool "wiringpi"
+	depends on BR2_arm
+	help
+	  GPIO Interface library for the Raspberry Pi.
+
+	  http://wiringpi.com/
+
diff --git a/package/wiringpi/wiringpi-CLOEXEC-undefined.patch b/package/wiringpi/wiringpi-CLOEXEC-undefined.patch
new file mode 100644
index 0000000..ca0ed99
--- /dev/null
+++ b/package/wiringpi/wiringpi-CLOEXEC-undefined.patch
@@ -0,0 +1,29 @@ 
+From 728b2634cbf661e5303b1e8cb791b909ad4e907c Mon Sep 17 00:00:00 2001
+From: "Guillermo A. Amaral" <g@maral.me>
+Date: Wed, 10 Jul 2013 22:05:12 -0700
+Subject: [PATCH] Declare O_CLOEXEC on systems with an older kernel and/or
+ glibc.
+
+Signed-off-by: Guillermo A. Amaral <g@maral.me>
+---
+ wiringPi/wiringPi.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c
+index ba61d9f..2ee23b9 100644
+--- a/wiringPi/wiringPi.c
++++ b/wiringPi/wiringPi.c
+@@ -77,6 +77,10 @@
+ #define	FALSE	(1==2)
+ #endif
+ 
++#ifndef O_CLOEXEC
++#define O_CLOEXEC 0
++#endif
++
+ // Environment Variables
+ 
+ #define	ENV_DEBUG	"WIRINGPI_DEBUG"
+-- 
+1.8.1.5
+
diff --git a/package/wiringpi/wiringpi-cmake-support.patch b/package/wiringpi/wiringpi-cmake-support.patch
new file mode 100644
index 0000000..05ccd72
--- /dev/null
+++ b/package/wiringpi/wiringpi-cmake-support.patch
@@ -0,0 +1,122 @@ 
+From 8feae03a9b77f4a4504d00423d70d318ee08296a Mon Sep 17 00:00:00 2001
+From: "Guillermo A. Amaral" <g@maral.me>
+Date: Wed, 10 Jul 2013 22:02:44 -0700
+Subject: [PATCH] CMake support for WiringPi
+
+
+Signed-off-by: Guillermo A. Amaral <g@maral.me>
+---
+ CMakeLists.txt          |  9 +++++++++
+ devLib/CMakeLists.txt   | 27 +++++++++++++++++++++++++++
+ gpio/CMakeLists.txt     | 20 ++++++++++++++++++++
+ wiringPi/CMakeLists.txt | 21 +++++++++++++++++++++
+ 4 files changed, 77 insertions(+)
+ create mode 100644 CMakeLists.txt
+ create mode 100644 devLib/CMakeLists.txt
+ create mode 100644 gpio/CMakeLists.txt
+ create mode 100644 wiringPi/CMakeLists.txt
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+new file mode 100644
+index 0000000..324ccff
+--- /dev/null
++++ b/CMakeLists.txt
+@@ -0,0 +1,9 @@
++cmake_minimum_required(VERSION 2.8)
++
++project(wiringPi)
++
++set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared objects")
++
++add_subdirectory(wiringPi)
++add_subdirectory(devLib)
++add_subdirectory(gpio)
+diff --git a/devLib/CMakeLists.txt b/devLib/CMakeLists.txt
+new file mode 100644
+index 0000000..6a7199d
+--- /dev/null
++++ b/devLib/CMakeLists.txt
+@@ -0,0 +1,27 @@
++set(CMAKE_INCLUDE_CURRENT_DIR ON)
++
++set(devLib_SOVERSION "2.0")
++set(devLib_CFLAGS "-Wformat=2 -Winline")
++
++file(GLOB devLib_SRCS *.c)
++file(GLOB devLib_HDRS *.h)
++list(REMOVE_ITEM devLib_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/piFaceOld.c)
++
++find_library(PTHREAD_LIBRARY pthread)
++
++include_directories("../wiringPi")
++
++add_library(wiringPiDev ${devLib_SRCS})
++target_link_libraries(wiringPiDev ${PTHREAD_LIBRARY})
++set_target_properties(wiringPiDev PROPERTIES COMPILE_FLAGS ${devLib_CFLAGS})
++set_target_properties(wiringPiDev PROPERTIES SOVERSION ${devLib_SOVERSION})
++
++install(TARGETS wiringPiDev
++        LIBRARY DESTINATION lib COMPONENT target
++        ARCHIVE DESTINATION lib COMPONENT staging
++)
++
++install(FILES ${devLib_HDRS}
++        DESTINATION include/wiringPi COMPONENT staging
++)
++
+diff --git a/gpio/CMakeLists.txt b/gpio/CMakeLists.txt
+new file mode 100644
+index 0000000..a39e511
+--- /dev/null
++++ b/gpio/CMakeLists.txt
+@@ -0,0 +1,20 @@
++set(CMAKE_INCLUDE_CURRENT_DIR ON)
++
++set(gpio_CFLAGS "-Wformat=2 -Winline")
++
++file(GLOB gpio_SRCS *.c)
++
++include_directories("../wiringPi")
++include_directories("../devLib")
++
++find_library(M_LIBRARY m)
++find_library(PTHREAD_LIBRARY pthread)
++
++add_executable(gpio ${gpio_SRCS})
++target_link_libraries(gpio ${M_LIBRARY} ${PTHREAD_LIBRARY} wiringPi wiringPiDev)
++set_target_properties(gpio PROPERTIES COMPILE_FLAGS ${gpio_CFLAGS})
++
++install(TARGETS gpio
++        RUNTIME DESTINATION bin COMPONENT target
++)
++
+diff --git a/wiringPi/CMakeLists.txt b/wiringPi/CMakeLists.txt
+new file mode 100644
+index 0000000..e54eaf6
+--- /dev/null
++++ b/wiringPi/CMakeLists.txt
+@@ -0,0 +1,21 @@
++set(CMAKE_INCLUDE_CURRENT_DIR ON)
++
++set(wiringPi_SOVERSION "2.0")
++set(wiringPi_CFLAGS "-Wformat=2 -Winline")
++
++file(GLOB wiringPi_SRCS *.c)
++file(GLOB wiringPi_HDRS *.h)
++
++add_library(wiringPi ${wiringPi_SRCS})
++set_target_properties(wiringPi PROPERTIES COMPILE_FLAGS ${wiringPi_CFLAGS})
++set_target_properties(wiringPi PROPERTIES SOVERSION ${wiringPi_SOVERSION})
++
++install(TARGETS wiringPi
++        LIBRARY DESTINATION lib COMPONENT target
++        ARCHIVE DESTINATION lib COMPONENT staging
++)
++
++install(FILES ${wiringPi_HDRS}
++        DESTINATION include/wiringPi COMPONENT staging
++)
++
+-- 
+1.8.1.5
+
diff --git a/package/wiringpi/wiringpi.mk b/package/wiringpi/wiringpi.mk
new file mode 100644
index 0000000..4341f49
--- /dev/null
+++ b/package/wiringpi/wiringpi.mk
@@ -0,0 +1,14 @@ 
+#############################################################
+#
+# wiringpi
+#
+#############################################################
+
+WIRINGPI_VERSION = 02a3bd8d8f2ae5c873e63875a8faef5b627f9db6
+WIRINGPI_SITE = git://git.drogon.net/wiringPi
+WIRINGPI_LICENSE = LGPLv3+
+WIRINGPI_LICENSE_FILES = COPYING.LESSER
+WIRINGPI_INSTALL_STAGING = YES
+WIRINGPI_CONF_OPT = -DCMAKE_BUILD_TYPE=Release
+
+$(eval $(cmake-package))