Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

libuvc on Windows #12

Open
sureshjoshi opened this issue Feb 6, 2015 · 61 comments
Open

libuvc on Windows #12

sureshjoshi opened this issue Feb 6, 2015 · 61 comments

Comments

@sureshjoshi
Copy link

Has anyone successfully streamed webcam images from this library on Windows?

I've done the necessary porting to make it compile, and installed WinUSB drivers (as per libusb), but claiming the interface when I want to stream returns an ERROR_NOT_SUPPORTED and if I hack to pick an interface that claims correctly, I get an ERROR_PIPE.

This is a Logitech C270 camera, running the example.cpp and test.cpp, and works perfectly on Linux using the same computer.

Thanks!
-SJ

@Timmmm
Copy link

Timmmm commented Jun 8, 2015

There are probably two issues:

  1. When you plug in a UVC webcam on Windows it installs Windows' native UVC driver. libusb requires a WinUSB-compatible driver interface on Windows so that doesn't work.
  2. You should be able to remove the drivers Windows automatically installs (via the Device Manager) and install a WinUSB-compatible one - the easiest way is using Zadig - libusb supports all three driver backends that Zadig will install (libusbK, WinUSB and libusb-win32). These drivers all expose the WinUSB API.

If you're wondering the difference, WinUSB is the official microsoft "generic" USB driver, libusbK is an open source implementation of WinUSB, and I'm not sure about libusb-win32. This page has some comparisons.

Anyway, the second problem is that libusb doesn't support isochronous transfers on Windows (which I assume UVC uses). Although the libusbk backend does support isochronous transfers, the libusb library ignores that and treats all WinUSB-compatible backends equally. However I asked about this on the mailing list and there are two possible solutions.

Solution one is to use a modified version of libusb that directly supports libusbk and therefore allows isochronous endpoints.

Solution two is to use yet another USB driver - UsbDk which supports isochronous transfers (and is also easier to install than the others). There is another modified version of libusb that supports this backend.

For my own project I am going to try solution two as I think it will lead to a nicer user experience. By the way I did notice some things about "filter drivers" which may mean you don't need to uninstall Windows' native UVC drivers but that is a total guess.

There is yet another generic USB driver

@Timmmm
Copy link

Timmmm commented Jun 8, 2015

By the way, I'm going to have a go at this. Would you mind posting your modifications?

@mkassner
Copy link
Contributor

mkassner commented Jun 8, 2015

@Timmmm This is very relevant for us as well.

Will you develop in a fork? We would like to contribute and test.

@MichaelBarz What do you think?

@sureshjoshi
Copy link
Author

@Timmmm Thanks for all the info. Unfortunately, I moved my development over to native cross-platform drivers for the project I was working on, and for the life of me, I can't find my libuvc mods... Sorry.

However, I know Steven Lovegrove (https://github.com/stevenlovegrove/libuvc) started a Windows version too.

@Timmmm
Copy link

Timmmm commented Jun 8, 2015

Ok I will have a look at his fork. I wish github let you give forks descriptions. Sometimes it's really hard to work out what the difference between them all is! @mkassner if I get it to work I'll post here. Not sure about code as it is for work and they're a bit paranoid about IP. Hopefully it won't require many code changes anyway.

@flecheria
Copy link

I describe what I've done until here and also I need some further information.
It's a lot of stuff for a post but I hope it could be helpful for people like me that try libuvc for the very first time.
1 - uninstall old drive and I made a fresh installation of WinUSB with Zadig (Is it suffice or I have to install all? libusbK, WinUSB and libusb-win32?) following @Timmmm suggestions
2 - download libusb from libusb.info
3 - put it on this path on my machine C:\Users\Paolo\Documents\software\libusb-1.0.19-rc1
4 - cloning libuvc (obviously ;-) )
5 - change the path on CMakeLists.txt

find_library(LIBUSB_LIBRARY_NAMES usb-1.0
  PATHS C:/Users/Paolo/Documents/software/libusb-1.0.19-rc1/MinGW64/dll)

find_path(LIBUSB_INCLUDE_DIR libusb-1.0/libusb.h
  PATHS C:/Users/Paolo/Documents/software/libusb-1.0.19-rc1/include)

Questions:
-- @mkassner in my case i need libuvc to build pyuvc, is it the dll the right choice?
-- I choose the MinGW64 because I will build libuvc using tdm-gcc 64 bit
-- there is a way to write the find path instructions for every OS?
-- can I use the find_path to indicate also the path to jpeg?

6 - open CMAKE, set the path for code and binaries (as you can see in the picture), configure and generate the code using MinGW Makefiles as generator. reading the results, It seems that now libuvc is compiled at 64 bit, but I'm not sure.
cmake_build

Does CMake an automatic choise of the 64bit compiler refering to the MinGW64/dll path?
What is CMAKE_GNUtoMS? Do have I to check the options?
7 - goes to libuvc/build and type from the console

mingw32-make
mingw32-make install

All seems to work. I will run some tests in next few days.

make_install

last stupid question: mingw32-make is reffering to 32bit or 64bit or it has nothing to do with this because all is already setup in CMAKE when i generate?

@Timmmm
Copy link

Timmmm commented Jun 9, 2015

@flecheria WinUSB won't work because it doesn't support isochronous endpoints (required for UVC) until Windows 8 (and libusb doesn't take advantage of that support anyway). libusbK does support isochronous endpoints but again libusb doesn't take advantage of that support. However there are old patches for libusb that change it to add support for libusbK's isochronous API. This is "solution one" that I linked before.

So you (or I) need to port those old libusb patches to the current version (shouldn't be too hard), then compile that version of libusb, install the libusbK driver using Zadig, and then hopefully it should work. The downside of this method is that no other apps will be able to use the webcam because you'll have to uninstall the system UVC driver.

The other option - UsbDk which I linked before as "solution two", might work too and might not require removing the system UVC driver. However I just had a bad experience with it so I am going to avoid it for now!

@flecheria
Copy link

@Timmmm I rebuild libusb with the patches as you suggest on solution 1, uninstall WinUSB and install libusbK. It seems works.
Do you have a snippet of code for testing? because I have no idea on how to test isochronous transfer...
Thanks

@Timmmm
Copy link

Timmmm commented Jun 15, 2015

There is an isochronous benchmark example here:

https://github.com/libusb/libusb/blob/master/examples/sam3u_benchmark.c

One of my uses for isochronous transfers with libusb is for an application
using the SAM3X processor (which happens to be the one used by the Arduino
Due). I ported the Arduino Due to mBed and have an isochronous transfer
working (well, as far as I can tell; haven't tested libusb yet), but the
code isn't really in a shareable state yet.

Probably the easiest way to get something that sends isochronous transfers
is to buy an mBed device with USB support. The cheapest is the FRDM-KL25Z
https://developer.mbed.org/platforms/KL25Z/ which I don't own but I just
looked at the code and it seems to support isochronous transfers.

Then you can modify one of the mBed USB examples to just write isochronous
data. It's not too difficult.

Or you could wait a week or two until I have time to give it a go. Or just
try it with libuvc!

Cheers,

Tim

On 14 June 2015 at 16:25, paolo cappelletto notifications@github.com
wrote:

@Timmmm https://github.com/Timmmm I rebuild libusb with the patches as
you suggest on solution 1, uninstall WinUSB and install libusbK. It seems
works.
Do you have a snippet of code for testing? because I have no idea on how
to test isochronous transfer...
Thanks


Reply to this email directly or view it on GitHub
#12 (comment).

@flecheria
Copy link

Oh Thanks
I'll give it a try, I'm not sure to be properly skilled for thi stuff, but I'll try this week end.

@Timmmm
Copy link

Timmmm commented Jun 17, 2015

I had a go at this. It got fairly far - submitting the iso transfers
worked, but the transfer status in the callback was LIBUSB_TRANSFER_ERROR.
I stepped through and found that in windows_handle_events() io_result was
getting set to 87, which means "parameter is incorrect". I haven't been
able to work out why. I'm going to ask on the libusb mailing list.

On 16 June 2015 at 16:12, paolo cappelletto notifications@github.com
wrote:

Oh Thanks
I'll give it a try, I'm not sure to be properly skilled for thi stuff, but
I'll try this week end.


Reply to this email directly or view it on GitHub
#12 (comment).

@Timmmm
Copy link

Timmmm commented Jul 8, 2015

I asked on the mailing list but no reply... I may brave UsbDk again...

@Timmmm
Copy link

Timmmm commented Jul 19, 2015

Ok, I downloaded libusbK and tried using it directly rather than through libusb and it worked! Therefore it seems to me like the libusb patches to add support for libusbK isochronous transfers are incorrect in some way. I haven't investigated what they do differently to the libusbK example code.

@MichaelBarz
Copy link

@Timmmm, sounds great! I recently tried to build libuvc on Windows too, but without success. Could you share your steps on how you replaced libusb by libusbK? And what is you system setup?
I use a VM running Windows 8.1 Pro x64, Visual Studio 2008 and libusbK 3 dev kit.

Best, Michael

@maurosanjo
Copy link

Same here. I managed to compile libuvc and libusb. I can enumerate devices, connect, and when I try to start streaming I get UVC_ERROR_NOT_SUPPORTED, that came from inside libusb (LIBUSB_ERROR_NOT_SUPPORTED).

Tried with WinUSB and libusbK drivers using Zadig.

I'm checking libusbK, does any of you guys managed to port libuvc to use libusbK?

@Timmmm
Copy link

Timmmm commented Aug 6, 2015

Yeah maurosanjo - that is the expected response (see my previous comments).

I've tested the libusbK api directly (not with libuvc) and it worked, and I've tested libuvc using libusb with a libusbK backend that supports isochronous transfers but it didn't work.

Probably easier and better to fix the libusbK backend for libusb than to port libuvc to libusbK.

Alternatively if you don't care about windows 7 you could upgrade to windows 10 and add in the isochronous support in libusb for the WinUSB backend.

@MichaelBarz
Copy link

Hi. I tried to get this running again.

I used libusbK (Zadig), Windows Release of libusb-1.0.

There are a few things that I could solve or circumvent:

  • Not all UVC-classified devices can be opened with libusb on my system, thus I modified uvc_get_device_list in order to only allow those that opened successfully.
  • The DEBUG prints do not work for Windows. Dropping the line and file information solves this.
  • Some further functions that print status information cause a crash on Windows, e.g. uvc_print_diag. Can be commented.
  • It is possible to open a UVC device, but not to start a stream. uvc_claim_if fails because of libusb_claim_interface that returns -12 / "not supported".

I use the release version of libusb, which might cause this problem, because it does not support iso transfer. I'll try with another version and report if I had success. There are forks that claim to support iso transfers with libusbK.

@timlukins
Copy link

Just tried Windows build of 0.0.5 of libuvc based on Windows 1.0.20 libusb binaries release from official site here: http://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-1.0.20/libusb-1.0.20.7z/download

[Edit: on Windows 7 - is this the problem?]

Everything still exactly as reported by @MichaelBarz above. I used Zadig and tried the WinUSB and libusbK driver. I also had to disable the debugging macros (but then able to get debug build). Everything with querying the camera works - but streaming breaks on libusb_detach_kernel_driver(devh->usb_devh, idx) in uvc_claim_if.

This is a real shame and a bit of showstopper...

Looking through commit log it doesn't seem like there has been any updates on the master branch that might address this.

Might it actually be a problem with the release build of libusb then? My next step was going to go down the rabbit hole of creating a windows debug build of libusb to find where detach_kernel_driver goes...

@timlukins
Copy link

Digging into the libusb code for 1.0.20 says it all really...

/libusb/os/windows_usb.c

static int windows_detach_kernel_driver(struct libusb_device_handle *dev_handle, int iface)
{
        return LIBUSB_ERROR_NOT_SUPPORTED;

@mkassner
Copy link
Contributor

mkassner commented Feb 9, 2016

@timlukins I dont think this call makes sense on windows. It should be omitted since windows does not know the concept of a 'kernel driver' AFAIK .

I dont have the knowledge or time to get this to work on windows and my suspicion is that the real problem comes down to getting this to work: libusb/libusb#46

We really want to see libuvc working on windows and plan to put a (substantial) bounty on this. Interested?

@Timmmm
Copy link

Timmmm commented Feb 10, 2016

I could get libuvc to work on Windows 10 or later (well actually Windows 8). Did you mean you plan to put a substantial bounty on it? If so I'm interested (assuming you don't require Windows 7 support).

@mkassner
Copy link
Contributor

@Timmmm if that is the case we should talk! Please contact me: moritz [at] pupil-labs dot com

@ghost
Copy link

ghost commented Mar 3, 2016

Has anyone been able to solve this?

@isikmustafa
Copy link

isikmustafa commented Apr 18, 2017

Are there any updates on this?

@mkassner
Copy link
Contributor

We made this fork work for windows: https://github.com/pupil-labs/libuvc You will need to use libusbK drivers.

@reda-alaoui
Copy link

reda-alaoui commented Apr 28, 2017

Hello @mkassner,
could you create a PR to merge your modifications in the main repository?

@ftaiolivista
Copy link

I was able to make it working on windows a couple of years ago using this fork https://github.com/ftaiolivista/libuvc

@cn-newit
Copy link

cn-newit commented Mar 6, 2020

OK, I'll give it a try!
Thanks.

@ftaiolivista
Copy link

Found some notes that can help you.

Use LibUSB fork from pupil labs, follow this instructions:

https://github.com/pupil-labs/libusb/blob/master/INSTALL_WIN.txt

Use my LibUVC fork ( https://github.com/ftaiolivista/libuvc ) following this instructions:

https://github.com/ftaiolivista/libuvc/blob/master/INSTALL_WINDOWS.md

You may need turbo jpeg:

https://github.com/libjpeg-turbo/libjpeg-turbo.git

@waddlesplash
Copy link
Contributor

I asked pupil-labs about upstreaming their changes here (pupil-labs#34) and got no response, so I may try to just merge those manually, unless someone else would like to submit a PR.

mmohsenz pushed a commit to mmohsenz/libuvc that referenced this issue Apr 21, 2020
@PeterPeterPan
Copy link

PeterPeterPan commented Sep 30, 2020

Anyone use the usbdk driver on Windows?
When I use the libusbK, I can set command and show stream but some device unplugging will cause my Windows blue-screen.
So I want to try usbdk.

I use this fork: https://github.com/pupil-labs/libuvc
the step I try to use usbdk:
step1: operate UsbDk_1.0.22_x64.msi
step2: modify the func uvc_init() in init.c (Reference from the libusb wiki)

libusb_init(&ctx->usb_ctx);
libusb_set_option(ctx->usb_ctx, LIBUSB_OPTION_USE_USBDK);

step3: run my code

I got the log:

"uvc: device has a status interrupt endpoint, but unable to read from it"

any idea? thanks!

@KrCool
Copy link

KrCool commented Oct 12, 2020

Excuse me, I see you are talking about uvc and libusb.

I need to use libusb in Windows to send data to the uvc camera (at the same time I need to use opencv to play the camera screen), I am now facing a problem:

  1. If the driver is the uvc driver that comes with windows, then I cannot use the libusb library based on C language to open the USB device correctly
  2. If I use libwin32, libusb, or libusbk to install the driver, I can open it, but I cannot use opencv to play the screen normally.
    It's so hard, I feel my hair is saying goodbye to me

@ftaiolivista
Copy link

Hi. In an old project I managed to use libusbk + libuvc + opencv on windows in a C++. I'm able to liveview webcam and send USB commands to the same device.
But you cannot use directly the webcam with Opencv VideoCapture API, you have to use LIBUVC as middle layer to caputer images and then you can use opencv to elaborate them.

@KrCool
Copy link

KrCool commented Oct 12, 2020

你好。在一个旧项目中, 我设法在一个窗口使用 libusbk _ libuvc _ opencv C++。我能够实时查看网络摄像头,并发送 USB 命令到同一设备。
但是,您不能直接使用网络摄像头与 Opencv 视频捕获 API, 你必须使用 LIBUVC 作为中间层来封顶图像, 然后您可以使用 opencv 来详细说明它们。

Hi, thank you for your prompt, I have seen the relevant information of libuvc, but have not decided to use this method. I think I should try this method

@KrCool
Copy link

KrCool commented Oct 12, 2020

Hi. In an old project I managed to use libusbk + libuvc + opencv on windows in a C++. I'm able to liveview webcam and send USB commands to the same device.
But you cannot use directly the webcam with Opencv VideoCapture API, you have to use LIBUVC as middle layer to caputer images and then you can use opencv to elaborate them.

Oh,In addition, there is a situation where I can use a simple uvcplayer to play the screen and use the data sending function of Bus Hound at the same time. They work well together.

@palydawn
Copy link

Hi. In an old project I managed to use libusbk + libuvc + opencv on windows in a C++. I'm able to liveview webcam and send USB commands to the same device.
But you cannot use directly the webcam with Opencv VideoCapture API, you have to use LIBUVC as middle layer to caputer images and then you can use opencv to elaborate them.

Oh,In addition, there is a situation where I can use a simple uvcplayer to play the screen and use the data sending function of Bus Hound at the same time. They work well together.

Hi, I encountered the same problem as you, did you find way to send command to uvc camera without changing uvc driver?

@ftaiolivista
Copy link

ftaiolivista commented Dec 16, 2020

Hi, I encountered the same problem as you, did you find way to send command to uvc camera without changing uvc driver?

no, sorry

@KrCool
Copy link

KrCool commented Dec 16, 2020

Hi. In an old project I managed to use libusbk + libuvc + opencv on windows in a C++. I'm able to liveview webcam and send USB commands to the same device.
But you cannot use directly the webcam with Opencv VideoCapture API, you have to use LIBUVC as middle layer to caputer images and then you can use opencv to elaborate them.

Oh,In addition, there is a situation where I can use a simple uvcplayer to play the screen and use the data sending function of Bus Hound at the same time. They work well together.

Hi, I encountered the same problem as you, did you find way to send command to uvc camera without changing uvc driver?

I haven't found a way to send commands directly, but you can use the method defined in DirectShow, Dshow.h to control the camera(it's send the relevant command automatically,but you can't define your own), and it won't affect your ability to use other processes to play pictures

@THYAGARAJAN786
Copy link

THYAGARAJAN786 commented May 12, 2021

Is there any new progress?

i know its late,had the same issue UVC_ERROR_NOT_SUPPORTED, the fix was using zadig to replace both the composite and normal driver with (WinUsb driver) for the camera, under zadig list all devices -> ensure the option "Ignore hubs or composite parents" is unticked, a warning message would come, choose yes and replace the composite driver, Mine worked on libuvc(master), libusb(master) and windows10 64-bit release build, Hopefully helps someone else

@mcuee
Copy link

mcuee commented Aug 6, 2021

i know its late, had the same issue UVC_ERROR_NOT_SUPPORTED, the fix was using zadig to replace both the composite and normal driver with (WinUsb driver) for the camera, under zadig list all devices -> ensure the option "Ignore hubs or composite parents" is unticked, a warning message would come, choose yes and replace the composite driver, Mine worked on libuvc(master), libusb(master) and windows10 64-bit release build, Hopefully helps someone else

Yes, this may be related to the known issue of libusb libusb/libusb#85 if your device use IAD.
Using WinUSB to replace the USB composite parent driver is the current recommended workaround.

Or you can try this libusb pull request if your device use IAD.
libusb/libusb#965

@mcuee
Copy link

mcuee commented Aug 6, 2021

vcpkg libuvc formula is supposed to work but somehow it does not work for me.
https://github.com/microsoft/vcpkg/tree/master/ports/libuvc

Edit: they have updated to say libuvc is for Linux only.

@mcuee
Copy link

mcuee commented Aug 6, 2021

https://github.com/pupil-labs/libuvc is still easier to use for Windows users. You do not need to use the libusb fork there, rather you can use the official libusb.

@mcuee
Copy link

mcuee commented May 8, 2022

Latest build of https://github.com/pupil-labs/libuvc git head with libusb-1.0.26 (dynamic link) and pthreads-w32-2-9-1-release, using VS2019 (both 32bit and 64bit).
pupil_labs_libuvc.zip

@yomei-o
Copy link

yomei-o commented Dec 30, 2022

I succeed to work a UVC webcam on Windows.
I think this issue is libusb bug.
And I tested two UVC devices. (isochronous transfer device and bulk transfer device)

I used libusb v1.0.26 and libuvc v0.0.6

yomei-o/libusb-1@f5056ab

@mcuee
Copy link

mcuee commented Dec 30, 2022

I succeed to work a UVC webcam on Windows. I think this issue is libusb bug. And I tested two UVC devices. (isochronous transfer device and bulk transfer device)

I used libusb v1.0.26 and libuvc v0.0.6

yomei-o/libusb@6d30e87

If you think there is a bug in libusb, please create a PR against libusb git HEAD here.
https://github.com/libusb/libusb/pulls

You should fork libusb project and then modify from there. Nobody will be able to understand what you are doing in your repo. You need to write more proper commit message to provide details of your changes.
Ref: https://github.com/yomei-o/libusb/commits/main

And your paticular commit may not be applicable to libusb git HEAD any more as there are quite some changes compared to 1.0.26 release.
Example: https://github.com/libusb/libusb/blob/master/libusb/os/windows_winusb.c#L1409

But one thing you are right is that isoc transfer support under Windows is not so good, especially with WInUSB. You may have better results with libusbk.
https://github.com/libusb/libusb/issues?q=is%3Aopen+is%3Aissue+label%3Aisoc+label%3Awindows

@mcuee
Copy link

mcuee commented Dec 30, 2022

Instructions to build libuvc under Winodws and MSYS2 by @FrostKiwi. I have not tried it myself.

@mcuee
Copy link

mcuee commented Dec 30, 2022

The above instruction seems to work with latest libuvc git HEAD.

click for the detailed run log
PS C:\work\libusb\libuvc\libuvc> git diff
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 87ae8f7..1df2c38 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -114,10 +114,10 @@ foreach(target_name IN LISTS UVC_TARGETS)
       $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
       $<INSTALL_INTERFACE:include>
   )
-  target_link_libraries(${target_name}
+#  target_link_libraries(${target_name}
     # libusb-1.0 used internally so we link to it privately.
-    PRIVATE LibUSB::LibUSB ${threads}
-  )
+#    PRIVATE LibUSB::LibUSB ${threads}
+#  )
   if(JPEG_FOUND)
     target_link_libraries(${target_name}
       PRIVATE JPEG::JPEG

$ cmake -G"MSYS Makefiles" -D CMAKE_BUILD_TYPE=RelWithDebInfo -D CMAKE_VERBOSE_MAKEFILE:BOOL=ON -B build_mingw64
-- The C compiler identification is GNU 12.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/msys64/mingw64/bin/cc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- No target type selected, default to both shared and static library
CMake Warning at CMakeLists.txt:51 (message):
  JPEG not found.  libuvc will not support JPEG decoding.


-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: C:/work/libusb/libuvc/libuvc/build_mingw64

$ cp /mingw64/lib/libusb-1.0.dll.a ./build_mingw64/CMakeFiles/uvc.dir/src

$ cp /mingw64/include/libusb-1.0/libusb.h ./build_mingw64/include/libusb.h

$ cmake --build build_mingw64
/C/msys64/mingw64/bin/cmake.exe -S/C/work/libusb/libuvc/libuvc -B/C/work/libusb/libuvc/libuvc/build_mingw64 --check-build-system CMakeFiles/Makefile.cmake 0
/C/msys64/mingw64/bin/cmake.exe -E cmake_progress_start /C/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles /C/work/libusb/libuvc/libuvc/build_mingw64//CMakeFiles/progress.marks
/usr/bin/make  -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/usr/bin/make  -f CMakeFiles/uvc.dir/build.make CMakeFiles/uvc.dir/depend
make[2]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/C/msys64/mingw64/bin/cmake.exe -E cmake_depends "MSYS Makefiles" /C/work/libusb/libuvc/libuvc /C/work/libusb/libuvc/libuvc /C/work/libusb/libuvc/libuvc/build_mingw64 /C/work/libusb/libuvc/libuvc/build_mingw64 /C/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc.dir/DependInfo.cmake --color=
make[2]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/usr/bin/make  -f CMakeFiles/uvc.dir/build.make CMakeFiles/uvc.dir/build
make[2]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
[  5%] Building C object CMakeFiles/uvc.dir/src/ctrl.c.obj
/C/msys64/mingw64/bin/cc.exe -Duvc_EXPORTS -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc.dir/src/ctrl.c.obj -MF CMakeFiles/uvc.dir/src/ctrl.c.obj.d -o CMakeFiles/uvc.dir/src/ctrl.c.obj -c /C/work/libusb/libuvc/libuvc/src/ctrl.c
In file included from C:/work/libusb/libuvc/libuvc/src/ctrl.c:43:
C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:75: warning: "ARRAYSIZE" redefined
   75 | #define ARRAYSIZE(arr) (sizeof(arr) / (IS_ARRAY(arr) ? sizeof(arr[0]) : 0))
      |
In file included from C:/msys64/mingw64/include/minwindef.h:163,
                 from C:/msys64/mingw64/include/windef.h:9,
                 from C:/msys64/mingw64/include/windows.h:69,
                 from C:/work/libusb/libuvc/libuvc/build_mingw64/include/libusb.h:64,
                 from C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:14:
C:/msys64/mingw64/include/winnt.h:681: note: this is the location of the previous definition
  681 | #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
      |
[ 10%] Building C object CMakeFiles/uvc.dir/src/ctrl-gen.c.obj
/C/msys64/mingw64/bin/cc.exe -Duvc_EXPORTS -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc.dir/src/ctrl-gen.c.obj -MF CMakeFiles/uvc.dir/src/ctrl-gen.c.obj.d -o CMakeFiles/uvc.dir/src/ctrl-gen.c.obj -c /C/work/libusb/libuvc/libuvc/src/ctrl-gen.c
In file included from C:/work/libusb/libuvc/libuvc/src/ctrl-gen.c:3:
C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:75: warning: "ARRAYSIZE" redefined
   75 | #define ARRAYSIZE(arr) (sizeof(arr) / (IS_ARRAY(arr) ? sizeof(arr[0]) : 0))
      |
In file included from C:/msys64/mingw64/include/minwindef.h:163,
                 from C:/msys64/mingw64/include/windef.h:9,
                 from C:/msys64/mingw64/include/windows.h:69,
                 from C:/work/libusb/libuvc/libuvc/build_mingw64/include/libusb.h:64,
                 from C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:14:
C:/msys64/mingw64/include/winnt.h:681: note: this is the location of the previous definition
  681 | #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
      |
[ 15%] Building C object CMakeFiles/uvc.dir/src/device.c.obj
/C/msys64/mingw64/bin/cc.exe -Duvc_EXPORTS -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc.dir/src/device.c.obj -MF CMakeFiles/uvc.dir/src/device.c.obj.d -o CMakeFiles/uvc.dir/src/device.c.obj -c /C/work/libusb/libuvc/libuvc/src/device.c
In file included from C:/work/libusb/libuvc/libuvc/src/device.c:40:
C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:75: warning: "ARRAYSIZE" redefined
   75 | #define ARRAYSIZE(arr) (sizeof(arr) / (IS_ARRAY(arr) ? sizeof(arr[0]) : 0))
      |
In file included from C:/msys64/mingw64/include/minwindef.h:163,
                 from C:/msys64/mingw64/include/windef.h:9,
                 from C:/msys64/mingw64/include/windows.h:69,
                 from C:/work/libusb/libuvc/libuvc/build_mingw64/include/libusb.h:64,
                 from C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:14:
C:/msys64/mingw64/include/winnt.h:681: note: this is the location of the previous definition
  681 | #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
      |
[ 20%] Building C object CMakeFiles/uvc.dir/src/diag.c.obj
/C/msys64/mingw64/bin/cc.exe -Duvc_EXPORTS -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc.dir/src/diag.c.obj -MF CMakeFiles/uvc.dir/src/diag.c.obj.d -o CMakeFiles/uvc.dir/src/diag.c.obj -c /C/work/libusb/libuvc/libuvc/src/diag.c
In file included from C:/work/libusb/libuvc/libuvc/src/diag.c:40:
C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:75: warning: "ARRAYSIZE" redefined
   75 | #define ARRAYSIZE(arr) (sizeof(arr) / (IS_ARRAY(arr) ? sizeof(arr[0]) : 0))
      |
In file included from C:/msys64/mingw64/include/minwindef.h:163,
                 from C:/msys64/mingw64/include/windef.h:9,
                 from C:/msys64/mingw64/include/windows.h:69,
                 from C:/work/libusb/libuvc/libuvc/build_mingw64/include/libusb.h:64,
                 from C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:14:
C:/msys64/mingw64/include/winnt.h:681: note: this is the location of the previous definition
  681 | #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
      |
[ 25%] Building C object CMakeFiles/uvc.dir/src/frame.c.obj
/C/msys64/mingw64/bin/cc.exe -Duvc_EXPORTS -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc.dir/src/frame.c.obj -MF CMakeFiles/uvc.dir/src/frame.c.obj.d -o CMakeFiles/uvc.dir/src/frame.c.obj -c /C/work/libusb/libuvc/libuvc/src/frame.c
In file included from C:/work/libusb/libuvc/libuvc/src/frame.c:39:
C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:75: warning: "ARRAYSIZE" redefined
   75 | #define ARRAYSIZE(arr) (sizeof(arr) / (IS_ARRAY(arr) ? sizeof(arr[0]) : 0))
      |
In file included from C:/msys64/mingw64/include/minwindef.h:163,
                 from C:/msys64/mingw64/include/windef.h:9,
                 from C:/msys64/mingw64/include/windows.h:69,
                 from C:/work/libusb/libuvc/libuvc/build_mingw64/include/libusb.h:64,
                 from C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:14:
C:/msys64/mingw64/include/winnt.h:681: note: this is the location of the previous definition
  681 | #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
      |
[ 30%] Building C object CMakeFiles/uvc.dir/src/init.c.obj
/C/msys64/mingw64/bin/cc.exe -Duvc_EXPORTS -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc.dir/src/init.c.obj -MF CMakeFiles/uvc.dir/src/init.c.obj.d -o CMakeFiles/uvc.dir/src/init.c.obj -c /C/work/libusb/libuvc/libuvc/src/init.c
In file included from C:/work/libusb/libuvc/libuvc/src/init.c:79:
C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:75: warning: "ARRAYSIZE" redefined
   75 | #define ARRAYSIZE(arr) (sizeof(arr) / (IS_ARRAY(arr) ? sizeof(arr[0]) : 0))
      |
In file included from C:/msys64/mingw64/include/minwindef.h:163,
                 from C:/msys64/mingw64/include/windef.h:9,
                 from C:/msys64/mingw64/include/windows.h:69,
                 from C:/work/libusb/libuvc/libuvc/build_mingw64/include/libusb.h:64,
                 from C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:14:
C:/msys64/mingw64/include/winnt.h:681: note: this is the location of the previous definition
  681 | #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
      |
[ 35%] Building C object CMakeFiles/uvc.dir/src/stream.c.obj
/C/msys64/mingw64/bin/cc.exe -Duvc_EXPORTS -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc.dir/src/stream.c.obj -MF CMakeFiles/uvc.dir/src/stream.c.obj.d -o CMakeFiles/uvc.dir/src/stream.c.obj -c /C/work/libusb/libuvc/libuvc/src/stream.c
In file included from C:/work/libusb/libuvc/libuvc/src/stream.c:40:
C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:75: warning: "ARRAYSIZE" redefined
   75 | #define ARRAYSIZE(arr) (sizeof(arr) / (IS_ARRAY(arr) ? sizeof(arr[0]) : 0))
      |
In file included from C:/msys64/mingw64/include/minwindef.h:163,
                 from C:/msys64/mingw64/include/windef.h:9,
                 from C:/msys64/mingw64/include/windows.h:69,
                 from C:/work/libusb/libuvc/libuvc/build_mingw64/include/libusb.h:64,
                 from C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:14:
C:/msys64/mingw64/include/winnt.h:681: note: this is the location of the previous definition
  681 | #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
      |
[ 40%] Building C object CMakeFiles/uvc.dir/src/misc.c.obj
/C/msys64/mingw64/bin/cc.exe -Duvc_EXPORTS -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc.dir/src/misc.c.obj -MF CMakeFiles/uvc.dir/src/misc.c.obj.d -o CMakeFiles/uvc.dir/src/misc.c.obj -c /C/work/libusb/libuvc/libuvc/src/misc.c
[ 45%] Linking C shared library libuvc.dll
/C/msys64/mingw64/bin/cmake.exe -E rm -f CMakeFiles/uvc.dir/objects.a
/C/msys64/mingw64/bin/ar.exe qc CMakeFiles/uvc.dir/objects.a "CMakeFiles/uvc.dir/src/ctrl.c.obj" "CMakeFiles/uvc.dir/src/ctrl-gen.c.obj" "CMakeFiles/uvc.dir/src/device.c.obj" "CMakeFiles/uvc.dir/src/diag.c.obj" "CMakeFiles/uvc.dir/src/frame.c.obj" "CMakeFiles/uvc.dir/src/init.c.obj" "CMakeFiles/uvc.dir/src/stream.c.obj" "CMakeFiles/uvc.dir/src/misc.c.obj"
/C/msys64/mingw64/bin/cc.exe -O2 -g -DNDEBUG -shared -o libuvc.dll -Wl,--out-implib,libuvc.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -Wl,--whole-archive CMakeFiles/uvc.dir/objects.a -Wl,--no-whole-archive  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
...
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/uvc.dir/objects.a(stream.c.obj): in function `uvc_stream_stop':
C:/work/libusb/libuvc/libuvc/src/stream.c:1507: undefined reference to `libusb_cancel_transfer'
collect2.exe: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/uvc.dir/build.make:213: libuvc.dll] Error 1
make[2]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
make[1]: *** [CMakeFiles/Makefile2:90: CMakeFiles/uvc.dir/all] Error 2
make[1]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
make: *** [Makefile:139: all] Error 2

$ cd build_mingw64/

$ /C/msys64/mingw64/bin/cc.exe -O2 -g -DNDEBUG -shared -o libuvc.dll -Wl,--out-implib,libuvc.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -Wl,--whole-archive CMakeFiles/uvc.dir/objects.a -Wl,--no-whole-archive  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
 -lusb-1.0

$ cd ..

$ cmake --build build_mingw64
/C/msys64/mingw64/bin/cmake.exe -S/C/work/libusb/libuvc/libuvc -B/C/work/libusb/libuvc/libuvc/build_mingw64 --check-build-system CMakeFiles/Makefile.cmake 0
/C/msys64/mingw64/bin/cmake.exe -E cmake_progress_start /C/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles /C/work/libusb/libuvc/libuvc/build_mingw64//CMakeFiles/progress.marks
/usr/bin/make  -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/usr/bin/make  -f CMakeFiles/uvc.dir/build.make CMakeFiles/uvc.dir/depend
make[2]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/C/msys64/mingw64/bin/cmake.exe -E cmake_depends "MSYS Makefiles" /C/work/libusb/libuvc/libuvc /C/work/libusb/libuvc/libuvc /C/work/libusb/libuvc/libuvc/build_mingw64 /C/work/libusb/libuvc/libuvc/build_mingw64 /C/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc.dir/DependInfo.cmake --color=
Dependencies file "CMakeFiles/uvc.dir/src/ctrl-gen.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc.dir/compiler_depend.internal".
Dependencies file "CMakeFiles/uvc.dir/src/ctrl.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc.dir/compiler_depend.internal".
Dependencies file "CMakeFiles/uvc.dir/src/device.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc.dir/compiler_depend.internal".
Dependencies file "CMakeFiles/uvc.dir/src/diag.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc.dir/compiler_depend.internal".
Dependencies file "CMakeFiles/uvc.dir/src/frame.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc.dir/compiler_depend.internal".
Dependencies file "CMakeFiles/uvc.dir/src/init.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc.dir/compiler_depend.internal".
Dependencies file "CMakeFiles/uvc.dir/src/misc.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc.dir/compiler_depend.internal".
Dependencies file "CMakeFiles/uvc.dir/src/stream.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc.dir/compiler_depend.internal".
Consolidate compiler generated dependencies of target uvc
make[2]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/usr/bin/make  -f CMakeFiles/uvc.dir/build.make CMakeFiles/uvc.dir/build
make[2]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
make[2]: Nothing to be done for 'CMakeFiles/uvc.dir/build'.
make[2]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
[ 45%] Built target uvc
/usr/bin/make  -f CMakeFiles/uvc_static.dir/build.make CMakeFiles/uvc_static.dir/depend
make[2]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/C/msys64/mingw64/bin/cmake.exe -E cmake_depends "MSYS Makefiles" /C/work/libusb/libuvc/libuvc /C/work/libusb/libuvc/libuvc /C/work/libusb/libuvc/libuvc/build_mingw64 /C/work/libusb/libuvc/libuvc/build_mingw64 /C/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc_static.dir/DependInfo.cmake --color=
make[2]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/usr/bin/make  -f CMakeFiles/uvc_static.dir/build.make CMakeFiles/uvc_static.dir/build
make[2]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
[ 50%] Building C object CMakeFiles/uvc_static.dir/src/ctrl.c.obj
/C/msys64/mingw64/bin/cc.exe  -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc_static.dir/src/ctrl.c.obj -MF CMakeFiles/uvc_static.dir/src/ctrl.c.obj.d -o CMakeFiles/uvc_static.dir/src/ctrl.c.obj -c /C/work/libusb/libuvc/libuvc/src/ctrl.c
In file included from C:/work/libusb/libuvc/libuvc/src/ctrl.c:43:
C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:75: warning: "ARRAYSIZE" redefined
   75 | #define ARRAYSIZE(arr) (sizeof(arr) / (IS_ARRAY(arr) ? sizeof(arr[0]) : 0))
      |
In file included from C:/msys64/mingw64/include/minwindef.h:163,
                 from C:/msys64/mingw64/include/windef.h:9,
                 from C:/msys64/mingw64/include/windows.h:69,
                 from C:/work/libusb/libuvc/libuvc/build_mingw64/include/libusb.h:64,
                 from C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:14:
C:/msys64/mingw64/include/winnt.h:681: note: this is the location of the previous definition
  681 | #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
      |
[ 55%] Building C object CMakeFiles/uvc_static.dir/src/ctrl-gen.c.obj
/C/msys64/mingw64/bin/cc.exe  -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc_static.dir/src/ctrl-gen.c.obj -MF CMakeFiles/uvc_static.dir/src/ctrl-gen.c.obj.d -o CMakeFiles/uvc_static.dir/src/ctrl-gen.c.obj -c /C/work/libusb/libuvc/libuvc/src/ctrl-gen.c
In file included from C:/work/libusb/libuvc/libuvc/src/ctrl-gen.c:3:
C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:75: warning: "ARRAYSIZE" redefined
   75 | #define ARRAYSIZE(arr) (sizeof(arr) / (IS_ARRAY(arr) ? sizeof(arr[0]) : 0))
      |
In file included from C:/msys64/mingw64/include/minwindef.h:163,
                 from C:/msys64/mingw64/include/windef.h:9,
                 from C:/msys64/mingw64/include/windows.h:69,
                 from C:/work/libusb/libuvc/libuvc/build_mingw64/include/libusb.h:64,
                 from C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:14:
C:/msys64/mingw64/include/winnt.h:681: note: this is the location of the previous definition
  681 | #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
      |
[ 60%] Building C object CMakeFiles/uvc_static.dir/src/device.c.obj
/C/msys64/mingw64/bin/cc.exe  -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc_static.dir/src/device.c.obj -MF CMakeFiles/uvc_static.dir/src/device.c.obj.d -o CMakeFiles/uvc_static.dir/src/device.c.obj -c /C/work/libusb/libuvc/libuvc/src/device.c
In file included from C:/work/libusb/libuvc/libuvc/src/device.c:40:
C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:75: warning: "ARRAYSIZE" redefined
   75 | #define ARRAYSIZE(arr) (sizeof(arr) / (IS_ARRAY(arr) ? sizeof(arr[0]) : 0))
      |
In file included from C:/msys64/mingw64/include/minwindef.h:163,
                 from C:/msys64/mingw64/include/windef.h:9,
                 from C:/msys64/mingw64/include/windows.h:69,
                 from C:/work/libusb/libuvc/libuvc/build_mingw64/include/libusb.h:64,
                 from C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:14:
C:/msys64/mingw64/include/winnt.h:681: note: this is the location of the previous definition
  681 | #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
      |
[ 65%] Building C object CMakeFiles/uvc_static.dir/src/diag.c.obj
/C/msys64/mingw64/bin/cc.exe  -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc_static.dir/src/diag.c.obj -MF CMakeFiles/uvc_static.dir/src/diag.c.obj.d -o CMakeFiles/uvc_static.dir/src/diag.c.obj -c /C/work/libusb/libuvc/libuvc/src/diag.c
In file included from C:/work/libusb/libuvc/libuvc/src/diag.c:40:
C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:75: warning: "ARRAYSIZE" redefined
   75 | #define ARRAYSIZE(arr) (sizeof(arr) / (IS_ARRAY(arr) ? sizeof(arr[0]) : 0))
      |
In file included from C:/msys64/mingw64/include/minwindef.h:163,
                 from C:/msys64/mingw64/include/windef.h:9,
                 from C:/msys64/mingw64/include/windows.h:69,
                 from C:/work/libusb/libuvc/libuvc/build_mingw64/include/libusb.h:64,
                 from C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:14:
C:/msys64/mingw64/include/winnt.h:681: note: this is the location of the previous definition
  681 | #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
      |
[ 70%] Building C object CMakeFiles/uvc_static.dir/src/frame.c.obj
/C/msys64/mingw64/bin/cc.exe  -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc_static.dir/src/frame.c.obj -MF CMakeFiles/uvc_static.dir/src/frame.c.obj.d -o CMakeFiles/uvc_static.dir/src/frame.c.obj -c /C/work/libusb/libuvc/libuvc/src/frame.c
In file included from C:/work/libusb/libuvc/libuvc/src/frame.c:39:
C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:75: warning: "ARRAYSIZE" redefined
   75 | #define ARRAYSIZE(arr) (sizeof(arr) / (IS_ARRAY(arr) ? sizeof(arr[0]) : 0))
      |
In file included from C:/msys64/mingw64/include/minwindef.h:163,
                 from C:/msys64/mingw64/include/windef.h:9,
                 from C:/msys64/mingw64/include/windows.h:69,
                 from C:/work/libusb/libuvc/libuvc/build_mingw64/include/libusb.h:64,
                 from C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:14:
C:/msys64/mingw64/include/winnt.h:681: note: this is the location of the previous definition
  681 | #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
      |
[ 75%] Building C object CMakeFiles/uvc_static.dir/src/init.c.obj
/C/msys64/mingw64/bin/cc.exe  -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc_static.dir/src/init.c.obj -MF CMakeFiles/uvc_static.dir/src/init.c.obj.d -o CMakeFiles/uvc_static.dir/src/init.c.obj -c /C/work/libusb/libuvc/libuvc/src/init.c
In file included from C:/work/libusb/libuvc/libuvc/src/init.c:79:
C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:75: warning: "ARRAYSIZE" redefined
   75 | #define ARRAYSIZE(arr) (sizeof(arr) / (IS_ARRAY(arr) ? sizeof(arr[0]) : 0))
      |
In file included from C:/msys64/mingw64/include/minwindef.h:163,
                 from C:/msys64/mingw64/include/windef.h:9,
                 from C:/msys64/mingw64/include/windows.h:69,
                 from C:/work/libusb/libuvc/libuvc/build_mingw64/include/libusb.h:64,
                 from C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:14:
C:/msys64/mingw64/include/winnt.h:681: note: this is the location of the previous definition
  681 | #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
      |
[ 80%] Building C object CMakeFiles/uvc_static.dir/src/stream.c.obj
/C/msys64/mingw64/bin/cc.exe  -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc_static.dir/src/stream.c.obj -MF CMakeFiles/uvc_static.dir/src/stream.c.obj.d -o CMakeFiles/uvc_static.dir/src/stream.c.obj -c /C/work/libusb/libuvc/libuvc/src/stream.c
In file included from C:/work/libusb/libuvc/libuvc/src/stream.c:40:
C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:75: warning: "ARRAYSIZE" redefined
   75 | #define ARRAYSIZE(arr) (sizeof(arr) / (IS_ARRAY(arr) ? sizeof(arr[0]) : 0))
      |
In file included from C:/msys64/mingw64/include/minwindef.h:163,
                 from C:/msys64/mingw64/include/windef.h:9,
                 from C:/msys64/mingw64/include/windows.h:69,
                 from C:/work/libusb/libuvc/libuvc/build_mingw64/include/libusb.h:64,
                 from C:/work/libusb/libuvc/libuvc/include/libuvc/libuvc_internal.h:14:
C:/msys64/mingw64/include/winnt.h:681: note: this is the location of the previous definition
  681 | #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
      |
[ 85%] Building C object CMakeFiles/uvc_static.dir/src/misc.c.obj
/C/msys64/mingw64/bin/cc.exe  -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/uvc_static.dir/src/misc.c.obj -MF CMakeFiles/uvc_static.dir/src/misc.c.obj.d -o CMakeFiles/uvc_static.dir/src/misc.c.obj -c /C/work/libusb/libuvc/libuvc/src/misc.c
[ 90%] Linking C static library libuvc.a
/C/msys64/mingw64/bin/cmake.exe -P CMakeFiles/uvc_static.dir/cmake_clean_target.cmake
/C/msys64/mingw64/bin/cmake.exe -E cmake_link_script CMakeFiles/uvc_static.dir/link.txt --verbose=1
C:/msys64/mingw64/bin/ar.exe qc libuvc.a CMakeFiles/uvc_static.dir/src/ctrl.c.obj "CMakeFiles/uvc_static.dir/src/ctrl-gen.c.obj" CMakeFiles/uvc_static.dir/src/device.c.obj CMakeFiles/uvc_static.dir/src/diag.c.obj CMakeFiles/uvc_static.dir/src/frame.c.obj CMakeFiles/uvc_static.dir/src/init.c.obj CMakeFiles/uvc_static.dir/src/stream.c.obj CMakeFiles/uvc_static.dir/src/misc.c.obj
C:/msys64/mingw64/bin/ranlib.exe libuvc.a
make[2]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
[ 90%] Built target uvc_static
/usr/bin/make  -f CMakeFiles/example.dir/build.make CMakeFiles/example.dir/depend
make[2]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/C/msys64/mingw64/bin/cmake.exe -E cmake_depends "MSYS Makefiles" /C/work/libusb/libuvc/libuvc /C/work/libusb/libuvc/libuvc /C/work/libusb/libuvc/libuvc/build_mingw64 /C/work/libusb/libuvc/libuvc/build_mingw64 /C/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/example.dir/DependInfo.cmake --color=
make[2]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/usr/bin/make  -f CMakeFiles/example.dir/build.make CMakeFiles/example.dir/build
make[2]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
[ 95%] Building C object CMakeFiles/example.dir/src/example.c.obj
/C/msys64/mingw64/bin/cc.exe  -I/C/work/libusb/libuvc/libuvc/include -I/C/work/libusb/libuvc/libuvc/build_mingw64/include -O2 -g -DNDEBUG -MD -MT CMakeFiles/example.dir/src/example.c.obj -MF CMakeFiles/example.dir/src/example.c.obj.d -o CMakeFiles/example.dir/src/example.c.obj -c /C/work/libusb/libuvc/libuvc/src/example.c
C:/work/libusb/libuvc/libuvc/src/example.c: In function 'cb':
C:/work/libusb/libuvc/libuvc/src/example.c:26:74: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
   26 |     frame->frame_format, frame->width, frame->height, frame->data_bytes, (int) ptr);
      |                                                                          ^
[100%] Linking C executable example.exe
/C/msys64/mingw64/bin/cmake.exe -E rm -f CMakeFiles/example.dir/objects.a
/C/msys64/mingw64/bin/ar.exe qc CMakeFiles/example.dir/objects.a "CMakeFiles/example.dir/src/example.c.obj"
/C/msys64/mingw64/bin/cc.exe -O2 -g -DNDEBUG -Wl,--whole-archive CMakeFiles/example.dir/objects.a -Wl,--no-whole-archive -o example.exe -Wl,--out-implib,libexample.dll.a -Wl,--major-image-version,0,--minor-image-version,0  libuvc.dll.a -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
make[2]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
[100%] Built target example
make[1]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/C/msys64/mingw64/bin/cmake.exe -E cmake_progress_start /C/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles 0

@mcuee
Copy link

mcuee commented Dec 30, 2022

For those who are interested, you can try the binary here, using latest git commit 37734b0
libuvc_mingw64.zip

It seems to work.

PS C:\work\libusb\libuvc\libuvc\build_mingw64> cp C:\msys64\mingw64\bin\libusb-1.0.dll .
PS C:\work\libusb\libuvc\libuvc\build_mingw64> ls

    Directory: C:\work\libusb\libuvc\libuvc\build_mingw64

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          30/12/2022 11:16 pm                CMakeFiles
d----          30/12/2022 11:14 pm                include
-a---          30/12/2022 11:14 pm           5990 cmake_install.cmake
-a---          30/12/2022 11:14 pm          17879 CMakeCache.txt
-a---          30/12/2022 11:16 pm         271446 example.exe
-a---           11/4/2022 11:32 pm         214745 libusb-1.0.dll
-a---          30/12/2022 11:16 pm         350474 libuvc.a
-a---          30/12/2022 11:15 pm         514590 libuvc.dll
-a---          30/12/2022 11:15 pm         121570 libuvc.dll.a
-a---          30/12/2022 11:14 pm            322 libuvc.pc
-a---          30/12/2022 11:14 pm           2025 libuvcConfigVersion.cmake
-a---          30/12/2022 11:14 pm          17219 Makefile

PS C:\work\libusb\libuvc\libuvc\build_mingw64> .\example.exe
UVC initialized
Device found
Device opened
DEVICE CONFIGURATION (04f2:b6dd/[none]) ---
Status: idle
VideoControl:
        bcdUVC: 0x0110
VideoStreaming(1):
        bEndpointAddress: 129
        Formats:
        MJPEGFormat(1)
                  bits per pixel: 0
                  GUID: 4d4a5047000000000000000000000000 (MJPG)
                  default frame: 1
                  aspect ratio: 0x0
                  interlace flags: 00
                  copy protect: 00
                        FrameDescriptor(1)
                          capabilities: 01
                          size: 1280x720
                          bit rate: 442368000-442368000
                          max frame size: 1843200
                          default interval: 1/30
                          interval[0]: 1/30
                        FrameDescriptor(2)
                          capabilities: 01
                          size: 640x360
                          bit rate: 110592000-110592000
                          max frame size: 460800
                          default interval: 1/30
                          interval[0]: 1/30
                        FrameDescriptor(3)
                          capabilities: 01
                          size: 640x480
                          bit rate: 147456000-147456000
                          max frame size: 614400
                          default interval: 1/30
                          interval[0]: 1/30
        UncompressedFormat(2)
                  bits per pixel: 16
                  GUID: 5955593200001000800000aa00389b71 (YUY2)
                  default frame: 1
                  aspect ratio: 0x0
                  interlace flags: 00
                  copy protect: 00
                        FrameDescriptor(1)
                          capabilities: 01
                          size: 1280x720
                          bit rate: 147456000-147456000
                          max frame size: 1843200
                          default interval: 1/10
                          interval[0]: 1/10
                        FrameDescriptor(2)
                          capabilities: 01
                          size: 640x360
                          bit rate: 110592000-110592000
                          max frame size: 460800
                          default interval: 1/30
                          interval[0]: 1/30
                        FrameDescriptor(3)
                          capabilities: 01
                          size: 640x480
                          bit rate: 147456000-147456000
                          max frame size: 614400
                          default interval: 1/30
                          interval[0]: 1/30
END DEVICE CONFIGURATION

First format: (MJPG) 1280x720 30fps
bmHint: 0001
bFormatIndex: 1
bFrameIndex: 1
dwFrameInterval: 333333
wKeyFrameRate: 0
wPFrameRate: 0
wCompQuality: 0
wCompWindowSize: 0
wDelay: 32
dwMaxVideoFrameSize: 1843200
dwMaxPayloadTransferSize: 3060
bInterfaceNumber: 1
Streaming...
Enabling auto exposure ...
 ... full AE not supported, trying aperture priority mode
 ... enabled aperture priority auto exposure mode
callback! frame_format = 7, width = 1280, height = 720, length = 66106, ptr = 12345
callback! frame_format = 7, width = 1280, height = 720, length = 66472, ptr = 12345
callback! frame_format = 7, width = 1280, height = 720, length = 84072, ptr = 12345
callback! frame_format = 7, width = 1280, height = 720, length = 30672, ptr = 12345
callback! frame_format = 7, width = 1280, height = 720, length = 7480, ptr = 12345
callback! frame_format = 7, width = 1280, height = 720, length = 67954, ptr = 12345
...

@mcuee
Copy link

mcuee commented Dec 30, 2022

I am not so sure how to get a proper patch to libuvc to build under MSYS2/mingw nicely as I do not know much about CMake.

Hopefully @FrostKiwi or others can create a PR to sort out this long standing issue.

@mcuee
Copy link

mcuee commented Jan 23, 2023

$ cmake -G"MSYS Makefiles" -D CMAKE_BUILD_TYPE=RelWithDebInfo -D CMAKE_VERBOSE_MAKEFILE:BOOL=ON -D CMAKE_INSTALL_PREFIX=/mingw64 -B build_mingw64 .

...

$ cmake --build build_mingw64 --target install
/C/msys64/mingw64/bin/cmake.exe -S/C/work/libusb/libuvc/libuvc -B/C/work/libusb/libuvc/libuvc/build_mingw64 --check-build-system CMakeFiles/Makefile.cmake 0
/C/msys64/mingw64/bin/cmake.exe -E cmake_progress_start /C/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles /C/work/libusb/libuvc/libuvc/build_mingw64//CMakeFiles/progress.marks
/usr/bin/make  -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/usr/bin/make  -f CMakeFiles/uvc.dir/build.make CMakeFiles/uvc.dir/depend
make[2]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/C/msys64/mingw64/bin/cmake.exe -E cmake_depends "MSYS Makefiles" /C/work/libusb/libuvc/libuvc /C/work/libusb/libuvc/libuvc /C/work/libusb/libuvc/libuvc/build_mingw64 /C/work/libusb/libuvc/libuvc/build_mingw64 /C/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc.dir/DependInfo.cmake --color=
make[2]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/usr/bin/make  -f CMakeFiles/uvc.dir/build.make CMakeFiles/uvc.dir/build
make[2]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
make[2]: Nothing to be done for 'CMakeFiles/uvc.dir/build'.
make[2]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
[ 45%] Built target uvc
/usr/bin/make  -f CMakeFiles/uvc_static.dir/build.make CMakeFiles/uvc_static.dir/depend
make[2]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/C/msys64/mingw64/bin/cmake.exe -E cmake_depends "MSYS Makefiles" /C/work/libusb/libuvc/libuvc /C/work/libusb/libuvc/libuvc /C/work/libusb/libuvc/libuvc/build_mingw64 /C/work/libusb/libuvc/libuvc/build_mingw64 /C/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc_static.dir/DependInfo.cmake --color=
Dependencies file "CMakeFiles/uvc_static.dir/src/ctrl-gen.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc_static.dir/compiler_depend.internal".
Dependencies file "CMakeFiles/uvc_static.dir/src/ctrl.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc_static.dir/compiler_depend.internal".
Dependencies file "CMakeFiles/uvc_static.dir/src/device.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc_static.dir/compiler_depend.internal".
Dependencies file "CMakeFiles/uvc_static.dir/src/diag.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc_static.dir/compiler_depend.internal".
Dependencies file "CMakeFiles/uvc_static.dir/src/frame.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc_static.dir/compiler_depend.internal".
Dependencies file "CMakeFiles/uvc_static.dir/src/init.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc_static.dir/compiler_depend.internal".
Dependencies file "CMakeFiles/uvc_static.dir/src/misc.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc_static.dir/compiler_depend.internal".
Dependencies file "CMakeFiles/uvc_static.dir/src/stream.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/uvc_static.dir/compiler_depend.internal".
Consolidate compiler generated dependencies of target uvc_static
make[2]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/usr/bin/make  -f CMakeFiles/uvc_static.dir/build.make CMakeFiles/uvc_static.dir/build
make[2]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
make[2]: Nothing to be done for 'CMakeFiles/uvc_static.dir/build'.
make[2]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
[ 90%] Built target uvc_static
/usr/bin/make  -f CMakeFiles/example.dir/build.make CMakeFiles/example.dir/depend
make[2]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/C/msys64/mingw64/bin/cmake.exe -E cmake_depends "MSYS Makefiles" /C/work/libusb/libuvc/libuvc /C/work/libusb/libuvc/libuvc /C/work/libusb/libuvc/libuvc/build_mingw64 /C/work/libusb/libuvc/libuvc/build_mingw64 /C/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/example.dir/DependInfo.cmake --color=
Dependencies file "CMakeFiles/example.dir/src/example.c.obj.d" is newer than depends file "C:/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles/example.dir/compiler_depend.internal".
Consolidate compiler generated dependencies of target example
make[2]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/usr/bin/make  -f CMakeFiles/example.dir/build.make CMakeFiles/example.dir/build
make[2]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
make[2]: Nothing to be done for 'CMakeFiles/example.dir/build'.
make[2]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
[100%] Built target example
make[1]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
/C/msys64/mingw64/bin/cmake.exe -E cmake_progress_start /C/work/libusb/libuvc/libuvc/build_mingw64/CMakeFiles 0
/usr/bin/make  -f CMakeFiles/Makefile2 preinstall
make[1]: Entering directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
make[1]: Nothing to be done for 'preinstall'.
make[1]: Leaving directory '/c/work/libusb/libuvc/libuvc/build_mingw64'
Install the project...
/C/msys64/mingw64/bin/cmake.exe -P cmake_install.cmake
-- Install configuration: "RelWithDebInfo"
-- Installing: C:/msys64/mingw64/lib/libuvc.dll.a
-- Installing: C:/msys64/mingw64/bin/libuvc.dll
-- Installing: C:/msys64/mingw64/include/libuvc/libuvc.h
-- Installing: C:/msys64/mingw64/include/libuvc/libuvc_config.h
-- Installing: C:/msys64/mingw64/lib/libuvc.a
-- Up-to-date: C:/msys64/mingw64/include/libuvc/libuvc.h
-- Up-to-date: C:/msys64/mingw64/include/libuvc/libuvc_config.h
-- Installing: C:/msys64/mingw64/lib/cmake/libuvc/libuvcTargets.cmake
-- Installing: C:/msys64/mingw64/lib/cmake/libuvc/libuvcTargets-relwithdebinfo.cmake
-- Installing: C:/msys64/mingw64/lib/cmake/libuvc/FindLibUSB.cmake
-- Installing: C:/msys64/mingw64/lib/cmake/libuvc/FindJpegPkg.cmake
-- Installing: C:/msys64/mingw64/lib/cmake/libuvc/libuvcConfigVersion.cmake
-- Installing: C:/msys64/mingw64/lib/pkgconfig/libuvc.pc
-- Installing: C:/msys64/mingw64/lib/cmake/libuvc/libuvcConfig.cmake

$ ldd build_mingw64/libuvc.dll
        ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffdef5b0000)
        KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffdee860000)
        KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffdeccd0000)
        msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffdef4c0000)
        libwinpthread-1.dll => /mingw64/bin/libwinpthread-1.dll (0x7ffde7ce0000)
        libusb-1.0.dll => /mingw64/bin/libusb-1.0.dll (0x7ffdb0db0000)
        CRYPTBASE.DLL => /c/WINDOWS/SYSTEM32/CRYPTBASE.DLL (0x7ffdec1f0000)
        bcryptPrimitives.dll => /c/WINDOWS/System32/bcryptPrimitives.dll (0x7ffdecc50000)

$ pkg-config --cflags libuvc
-IC:/msys64/mingw64/include/libusb-1.0

$ pkg-config --libs libuvc
-luvc -lusb-1.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests