From Fedora Project Wiki



-!- nirik changed the topic of #fedora-classroom to: Fedora IRC Classroom - Using the Windows cross-compiler with your teacher Richard Jones ( rwmjones ) - See Classroom for todays class schedule and more info. 12:14
@rwmjones herlo, about time to start I think 12:14
@nirik ok, it's time to start in on our first class of the day. 12:14
@nirik take it away rwmjones! :) 12:15
@rwmjones Morning/afternoon/evening Fedora users from around the world! 12:15
@rwmjones I've got a short prepared talk about APIs and cross-compilers, 12:15
@rwmjones followed by a practical demonstration which you can follow along. 12:15
@rwmjones If you want to follow the practical demonstration, go here to see how 12:15
@rwmjones to set it up (best to start now): 12:15
@rwmjones 12:15
DiscordianUK good evening 12:15
@rwmjones Short, general interest questions are welcome any time. If you have 12:15
@rwmjones long, deep technical questions or you want to argue with me about "why 12:15
@rwmjones are we helping Windows users" etc then please leave it til the end. 12:15
-!- rwmjones changed the topic of #fedora-classroom to: Using the Windows cross-compiler: API basics 12:16
@rwmjones What is an API? A collection of functions that you can call. Linux 12:16
@rwmjones has hundreds of APIs, some with thousands of functions. 12:16
@rwmjones Examples: 12:16
@rwmjones POSIX/C99/libc: fork, getenv, fopen, ctime, printf, ... 12:16
@rwmjones Gtk+: gtk_button_new, gtk_object_ref, gdk_colormap_query_color, ... 12:16
@rwmjones libcurl: curl_easy_init, curl_easy_perform, curl_formadd, ... 12:16
@rwmjones openssl: SSL_CIPHER_get_version, SSL_CTX_sess_connect, ... 12:16
@rwmjones Most real world programs call just a few functions from a small number 12:16
@rwmjones of APIs. 12:16
@rwmjones (Diagram: ) 12:16
@rwmjones (Diagram: ) 12:16
@rwmjones Looking at the diagram above, I've tried to summarise a few of the 12:16
@rwmjones APIs you'll find on Linux. Thanks to the huge efforts of many free 12:16
@rwmjones software developers over many years, those APIs are also available on 12:16
@rwmjones Windows. 12:16
DiscordianUK which version of windows is that? 12:17
@rwmjones DiscordianUK, that's windows xp and "above" 12:17
@rwmjones although some applies to '95, '98 and 2K 12:17
DiscordianUK Okay thanks 12:17
DiscordianUK right 12:17
@rwmjones The one obvious exception is POSIX/libc. libc is so directly tied to 12:17
@rwmjones specifics of how Unix works that it's hard to port it (that's what 12:17
@rwmjones Cygwin emulates). But it turns out most programs don't make too many 12:17
@rwmjones calls to libc directly. Mostly they call higher level APIs (Gtk, Qt). 12:17
@rwmjones Portability libraries and higher level APIs can replace a lot of libc 12:18
@rwmjones calls and make software easier to port. 12:18
@rwmjones Examples: Gnulib, glib2, Qt, NSPR, APR, kdewin32, Boost, POCO 12:18
-!- rwmjones changed the topic of #fedora-classroom to: Using the Windows cross-compiler: Cross-compiler basics 12:18
@rwmjones Cross-compilers are like ordinary compilers, but they generate code 12:18
@rwmjones for another machine. A common example are cross-compilers that 12:18
@rwmjones generate code for embedded machines (the embedded machine isn't "big 12:18
@rwmjones enough" to run a compiler on its own). 12:18
@rwmjones Terminology: 12:19
@rwmjones Build: The machine on which we build the software. (Fedora) 12:19
@rwmjones Host: The system where the software will run. (Windows) 12:19
@rwmjones Target: (You don't need to worry about 'target'. 12:19
@rwmjones Technically it's different from 'host', but the terms 12:19
@rwmjones are often wrongly used interchangably.) 12:19
@rwmjones We treat Windows as a strange embedded machine (!) 12:19
DiscordianUK haha! 12:19
-!- rwmjones changed the topic of #fedora-classroom to: Using the Windows cross-compiler: Practical demonstration 12:20
@rwmjones ok on to the practical part 12:20
@rwmjones So you need to set up your machine as described: 12:20
@rwmjones 12:20
@rwmjones While you're doing that, download the sources: 12:20
@rwmjones 12:20
@rwmjones and unpack them somewhere as a non-root, ordinary user. 12:20
@rwmjones wget '' 12:21
@rwmjones zcat tictactoe-1.0.tar.gz | tar xvf - 12:21
@rwmjones cd tictactoe-1.0 12:21
@rwmjones how far are people with yum downloads? 12:21
DiscordianUK i've got it all installed 12:22
* nirik has stuff down, but has a local mirror, so it was pretty fast. ;) 12:22
* Plouj is afraid to hose his system by installing so many "testing" packages 12:22
@rwmjones it's certainly killing that server 12:23
delhage ? 12:23
baconfork haha 12:23
linuxguru haha 12:23
* rahmanangel is keep downloading, it will take time becoz of slow net, so forget about him 12:23
DiscordianUK building ttt the unix way gives me something that almost works 12:23
Plouj What is the point of the wine* packages? Why aren't the ones provided by fedora good enough? 12:24
@nirik rwmjones: you can place them on fedorapeople too if you like... should have lots of BW available. 12:24
delhage I'm curious, can we use the F10 shipped rpms instead of setting up according to 12:24
@rwmjones delhage, yes of course, but there are a few missing from Fedora (not yet reviewed) 12:24
@nirik are the missing ones needed for this demo? 12:24
@rwmjones for the full gtk there's like 3 or 4 missing ones 12:24
@rwmjones yup 12:24
delhage ok 12:24
@rwmjones the server is still up, just being a bit slow. I'll keep going anyway 12:24
@rwmjones Once the 'yum' command has finished, you can compile simple test 12:25
@rwmjones programs using the cross-compiler easily. For exampl 12:25
@rwmjones cat > test.c 12:25
@rwmjones #include <stdio.h> 12:25
@rwmjones main () { printf ("hello, world!\n"); } 12:25
@rwmjones (press Ctrl D) 12:25
@rwmjones i686-pc-mingw32-gcc test.c -o test.exe 12:25
@rwmjones file test.exe 12:25
@rwmjones $ file test.exe 12:26
@rwmjones test.exe: PE32 executable for MS Windows (console) Intel 80386 32-bit 12:26
@nirik rwmjones: so that exe would run on any win ">" xp ? 12:26
@rwmjones nirik, yes 12:26
@rwmjones $ i686-pc-mingw32-nm test.exe | tail 12:26
@rwmjones 00401330 T _main 12:26
@rwmjones 00401130 T _mainCRTStartup 12:26
@rwmjones 00402008 d _p.1598 12:26
@rwmjones 00401570 T _puts 12:26
@rwmjones 004015a0 t _register_frame_ctor 12:26
@rwmjones 00401558 T _signal 12:26
@rwmjones 004050a4 i fthunk 12:26
rahmanangel n using wine? 12:26
@rwmjones 0040508c i fthunk 12:26
@rwmjones 00405058 i hname 12:26
@rwmjones 00405040 i hname 12:26
@rwmjones rahmanangel, coming to that :-) 12:26
@rwmjones i686-pc-mingw32-objdump -p test.exe 12:26
@rwmjones and finally you can do: 12:26
@rwmjones ./test.exe 12:26
@rwmjones $ ./test.exe 12:27
@rwmjones hello, world! 12:27
@rwmjones $ wine test.exe 12:27
@rwmjones hello, world! 12:27
@rwmjones (If you get an error about missing DLLs, read 12:27
@rwmjones ) 12:27
linuxguru ok. what's the difference between the two 12:27
@rwmjones linuxguru, when wine is installed, it installs a linux kernel handler which detects Win32 PE executables and runs wine 12:27
@rwmjones linuxguru, so the two commands are the same 12:27
@rwmjones except as you'll see below 12:28
@rwmjones I guess you can see from that, commands are just the same but 12:28
@rwmjones preceeded by 'i686-pc-mingw-'. Also if Wine is installed then it adds 12:28
@rwmjones a special handler to the Linux kernel so you can just run Windows 12:28
@rwmjones binaries. 12:28
@rwmjones [Except when that doesn't work for reasons we don't fully understand -- 12:28
@rwmjones but 'wine prog.exe' always works]. 12:28
@rwmjones Back to the Tic-Tac-Toe example 12:28
@rwmjones 12:28
@rwmjones If you've downloaded and unpacked this example, and the 'yum install' 12:28
@rwmjones has finished, then you should be ready to compile this program which 12:28
@rwmjones comes from the Gtk tutorial. 12:28
@rwmjones To compile for Linux, you do: 12:29
@rwmjones ./configure 12:29
@rwmjones make 12:29
@rwmjones ./ttt 12:29
DiscordianUK i did that 12:29
@rwmjones (It's a really stupid demo, so don't even try to play the game :-) 12:29
@rwmjones Cross-compiling for Windows is just as easy: 12:29
@rwmjones make clean # cleans up the Linux binary 12:29
DiscordianUK i tried to play the game 12:29
@rwmjones mingw32-configure 12:30
@rwmjones make 12:30
@rwmjones ./ttt.exe 12:30
@rwmjones that final command runs the game locally using wine 12:30
* nirik finds it pretty slick how transparent that is. 12:30
@rwmjones If you try the menu Help -> About you should see the Windows look and 12:30
@rwmjones feel. 12:30
linuxguru does the configure file modified for this particular thing ? 12:30
@rwmjones linuxguru, take a look at 12:30
@rwmjones it is IIRC identical 12:31
* rwmjones checks 12:31
@rwmjones yeah, basically it's the same 12:31
linuxguru yeah 12:31
@rwmjones 'mingw32-configure' is just a wrapper around configure. It really 12:31
@rwmjones does: ./configure --host=i686-pc-mingw32 12:31
@rwmjones plus a few other flags and environment variables. 12:31
@rwmjones That worked for everyone? 12:31
DiscordianUK yeah 12:31
@rwmjones it worked for one person, good! 12:32
* delhage is far behind 12:32
* nirik nods. 12:32
linuxguru yeah 12:32
@rwmjones all of this gets archived on the fedora-classroom webpage later, so you can follow it at your leisure 12:32
* delhage nods 12:32
baconfork I'm almost there 12:32
@rwmjones but we've got plenty of time so I'll wait a few mins 12:33
@rwmjones The 'ttt.exe' binary won't run directly on Windows. 12:36
@rwmjones The reason is that it needs all the Gtk DLLs and Gtk 12:36
@rwmjones configuration files. But we provide a way to wrap that up easily. 12:36
linuxguru okay 12:36
@rwmjones First, for reasons which are obscure / a bug, you will need to install 12:36
@rwmjones that ttt.exe binary, so do this *as root*: 12:36
@rwmjones make install 12:37
@rwmjones # make install 12:37
@rwmjones make[1]: Entering directory /tmp/tictactoe-1.0' 12:37
@rwmjones if test -z "/usr/i686-pc-mingw32/sys-root/mingw/bin" ; then /bin/mkdir -p "/usr/i686-pc-mingw32/sys-root/mingw/bin" ; fi 12:37
@rwmjones /usr/bin/install -c 'ttt.exe' '/usr/i686-pc-mingw32/sys-root/mingw/bin/ttt.exe' 12:37
@rwmjones make[1]: Nothing to be done for install-data-am'. 12:37
@rwmjones make[1]: Leaving directory `/tmp/tictactoe-1.0' 12:37
@rwmjones Then (as non-root again): 12:37
@rwmjones make installer.exe 12:37
@rwmjones ls -l installer.exe 12:37
@nirik if you do a command line exe would that work on windows without needing a bunch of libs? ie, it's only gui libs you need to add? 12:37
@rwmjones nirik, yes, if it really didn't need any libs at all, eg. zlib 12:38
@rwmjones if it just made win32 calls 12:38
@nirik ok, cool. thanks. 12:38
@rwmjones but almost any non-trivial program, particularly if it comes from the Linux side of the world, will use one of these APIs 12:38
@rwmjones I'm going to cover that later 12:38
@rwmjones $ ls -l installer.exe 12:39
@rwmjones -rw-rw-r-- 1 rjones rjones 12932585 2009-03-08 18:38 installer.exe 12:39
@rwmjones 13MB, as you can see it's quite large, because it includes all of Gtk 12:39
@rwmjones and because windows doesn't have any packaging system, every app ends up with its own copy of Gtk 12:40
@rwmjones That gives you a Windows installer that contains everything (program, 12:40
@rwmjones dependent DLLs, configuration files, desktop icon, menu entry, 12:40
@rwmjones uninstaller). You can copy that file onto a Windows box and run it. 12:40
@rwmjones Anyone got any questions about the practical part? 12:41
@herlo ? 12:41
npmccallum how is the installer different than simply doing a static build? 12:42
@rwmjones npmccallum, good question! 12:42
dimion ? can it link statical 12:42
npmccallum i.e. why not just do a static build, if you are bundling gtk2, etc 12:42
@rwmjones the installer is a windows installer, so you can also put other stuff in there, like license files, more menu items and so on 12:42
@herlo yeah, it seems I've tried to install the mingw32-gtk2 but yum can't find it. I assume that's why my make after the mingw32-configure failed? 12:42
@rwmjones now, several people on the list have asked us to build mingw32-foo-static libraries 12:42
@rwmjones and although originally everything was a DLL, we now also have some -static subpackages 12:43
@rwmjones although not yet for Gtk 12:43
AleBaStr can it be done without make install (in case i have no root password/sudo)? 12:43
@rwmjones AleBaStr, not at the moment, but that is just a bug in mingw32-nsiswrapper 12:43
npmccallum and that installer is using nsis? 12:43
@rwmjones herlo, you followed the instructions ? 12:43
@rwmjones npmccallum, yes 12:44
@herlo yes 12:44
@herlo rwmjones: except when I go to your 12:44
@rwmjones herlo, it's probably because that webserver is being killed with downloads at the moment 12:44
@herlo yeah, kind of figured, I'll keep trying 12:44
* herlo likes this stuff so far though.. 12:44
linuxguru how can one customize the installer ? 12:45
npmccallum rwmjones: is the installer.exe target transparently added to any makefile when using the normal autotools setup and mingw32-configure ? 12:45
@rwmjones npmccallum, as the name suggests, nsiswrapper is a wrapper which generates the script used by nsis 12:45
@rwmjones npmccallum, see 12:45
npmccallum k 12:45
@rwmjones linuxguru, yes, do: 12:45
@rwmjones linuxguru, man nsiswrapper is your best bet actually 12:45
@rwmjones npmccallum, in case it's not obvious, scroll down a bit in 12:46
-!- rwmjones changed the topic of #fedora-classroom to: Using the Windows cross-compiler: Crossreport 12:46
@rwmjones A final point about porting your own programs. Use our 12:46
@rwmjones 'mingw32-crossreport' tool to help you. You just run it on an 12:46
@rwmjones existing Linux (C/C++) compiled program, and it will tell you where 12:46
@rwmjones potential problems might arise. 12:46
@rwmjones mingw32-crossreport /usr/bin/eog | less 12:46
linuxguru okay 12:47
npmccallum rwmjones: this is really slick, you rock 12:47
baconfork got it working good deal 12:47
@rwmjones for people who don't have this installed, look at the output of that command here: 12:47
@rwmjones 12:47
* npmccallum wonders about building libraries... 12:48
@rwmjones npmccallum, you'll prob want to look at some examples here: 12:48
@rwmjones 12:49
@rwmjones so you can see from the report, it highlight potential problems you might have when porting a program to Windows 12:49
npmccallum rwmjones: and that will allow for development *on windows* using the dll? 12:49
@rwmjones in that case, eog = Eye Of Gnome 12:49
@rwmjones npmccallum, yes and mostly yes ... with C++ we are still resolving problems with exception handling across libraries compiled by different compilers 12:50
@rwmjones npmccallum, for plain C you should be OK 12:50
npmccallum ok 12:50
-!- rwmjones changed the topic of #fedora-classroom to: Using the Windows cross-compiler: Future directions (Win64, Mac OS X ?) 12:50
@rwmjones Future directions: We have a working Win64 cross-compiler thanks to 12:51
@rwmjones the excellent work of the mingw-w64 upstream project. We haven't 12:51
@rwmjones cross-compiled any libraries for Win64 yet, but it's something we're 12:51
@rwmjones looking at for a future Fedora. 12:51
@rwmjones You can download the Win64 cross-compiler from the temporary repository, when it starts working again .. 12:52
@rwmjones mingw64-gcc 12:52
@rwmjones We have a sort-of-working Darwin (Mac OS X) cross-compiler. There are 12:52
@rwmjones various issues which I summarised here: 12:52
@rwmjones 12:52
@nirik rwmjones: do 32bit exe's typically run on 64 bit windows? or it's only 64bit for those? 12:52
DiscordianUK Right 12:53
@rwmjones nirik, yes, but they run in a sandbox/emulator called WoW 12:53
@nirik ha. I think of something different when I see WoW. ;) ok. 12:53
DiscordianUK So the idea is that Fedora can be a windows dev env? 12:53
@rwmjones practically yes they do run fine, but for the usual reasons it's better to have 64 bit executables 12:53
@rwmjones DiscordianUK, that would be great 12:53
@rwmjones Anyway, Win64 and Mac OS X are for future versions of Fedora. For Fedora 11 we're concentrating on the Win32 cross-compiler and about 35 libraries. 12:54
DiscordianUK I like the idea of crossplatform binaries 12:55
@rwmjones 12:55
-!- rwmjones changed the topic of #fedora-classroom to: Using the Windows cross-compiler: How to get involved 12:55
@rwmjones We *always* need volunteers: 12:55
@rwmjones - people who know about intimate details of compiling on Windows and OS X 12:55
@rwmjones - Fedora packagers 12:55
@rwmjones - Fedora reviewers 12:55
@rwmjones - testers 12:55
@rwmjones - developers who want to cross-compile their own apps 12:55
@rwmjones - developers who want to maintain Win32 ports of their own libraries 12:55
@rwmjones Web site: 12:56
@rwmjones Mailing list: 12:56
@rwmjones IRC: #fedora-mingw on FreeNode 12:56
@rwmjones Status: 12:56
@rwmjones Any questions? 12:56
DiscordianUK How does cygwin fit into this? (sorry someone had to ask) 12:57
@rwmjones Cygwin is quite a different approach. They are emulating POSIX, so you can run Unix programs unchanged (just recompile from the same sources). 12:57
@rwmjones For Fedora MinGW we do patch the sources, sometimes quite a bit. 12:58
@rwmjones we actively port to Windows APIs (eg Win32 APIs) 12:58
DiscordianUK it'd be nice if that was true about cygwin 12:58
@rwmjones another difference is that we are in Fedora, and we are a cross-compiler 12:58
DiscordianUK but there are gotchas 12:58
@rwmjones another difference is the licensing 12:58
linuxguru how about modifications to my app. un-install and re-install 12:58
linuxguru ?* 12:59
@rwmjones linuxguru, not sure I understand? 12:59
linuxguru suppose i compiled and installed a app in windows and then i change some things and compiled again get a installer.exe i have to un-install the previous one 12:59
@nirik Q: is there any indication to a windows user running one of these exe's how it was produced? ie, is there a way to note that this was made on linux host via free software? or is that too hard or too close to anoying advertising. 12:59
@rwmjones linuxguru, right, yes you do 12:59
@herlo What are the legal issues with compiling for Windows? I'm concerned that if I create something in Fedora using Windows libraries I'll get into a sticky situation... do you have any thoughts/insight? 13:00
@rwmjones linuxguru, we mainly test using Wine, and use Windows only for very final testing 13:00
DiscordianUK cygwin doesn't for example grok fork vs vfork 13:00
@rwmjones nirik, I think if you take apart the executable you could tell ... of course you can always add something in the Help or About box 13:00
@rwmjones herlo, there are no legal issues that I'm aware of. This is 100% independently produced, open source software. 13:01
npmccallum herlo: if you are building against win32api it is covered by the base os library provision in the GPL 13:01
delhage you already anticipated this question in the beginning: "why are we helping Windows users"? ;) 13:01
@herlo so there aren't any proprietary licenses to concern myself with? 13:01
@rwmjones herlo, no ... 100% independently made, 100% open source chain 13:02
@herlo very nice 13:02
@rwmjones delhage, well, I think there are two arguments here: 13:02
@rwmjones (1) a user who is using all proprietary apps on Windows, if we give them just one free app, then that gives them just a little bit of freedom that they didn't have before 13:02
@rwmjones practically, that can be freedom from proprietary lock in that many commercial Windows apps use to control the user 13:03
@rwmjones (2) no user is seriously going to change to using Linux in one day, because they'd have to change all their apps. However that equation changes as soon as all the apps they're using are free software. 13:03
@rwmjones because they can then change the underlying OS very easily, probably without noticing 13:04
@rwmjones so we want to switch people away from proprietary formats and apps that lock you in first 13:04
@rwmjones 'course it'd be great if none of this was necessary and no one used windows, but that's not the real world unfortunately 13:04
DiscordianUK Wha 13:04
@rwmjones for developers, it's also a way to get 10x the potential audience for your software 13:05
* nirik has a few more Q's, but will wait until others finish asking. ;) 13:05
AleBaStr Q: is it working with cmake/other alternative build systems? 13:05
DiscordianUK That' s the bonus rwmjones 13:05
@rwmjones if I missed any question, just repost it 13:05
delhage ok, I'm not sure I agree but thanks for explaining 13:05
@rwmjones AleBaStr, yes cmake is OK, others are troublesome but we've done pretty much all of the common build systems 13:05
@rwmjones AleBaStr, as in, there will be at least one package in the set that uses a build system and that I've laboured away to make it work as a cross-compiler 13:06
AleBaStr OK means installer works too?) 13:06
@rwmjones eg for bjam, there is mingw32-boost 13:06
* npmccallum just found out mingw32-crossreport works on libraries too :) 13:06
@rwmjones AleBaStr, usually the installer is independent of the build system, because you can run mingw32-nsiswrapper by hand 13:07
@rwmjones npmccallum, yes, mingw32-crossreport is just a perl script that wraps around objdump 13:07
npmccallum rwmjones: I figured as much 13:08
@nirik Q: you said you support EL-5... are there any issues there? or should we expect the same setup/support as in fedora, just older libs? or same versions? 13:08
* AleBaStr thinks about some macros for cpack to automate this 13:08
@rwmjones nirik, it's pretty much the same level, certainly right now there are all the same packages. lfarkas is mainly supporting that. 13:08
@rwmjones I should say we also support Qt 13:08
@nirik ok, cool. 13:09
@rwmjones it's not in fedora yet, but there is a qt-win package in the temp repo 13:09
@rwmjones mingw32-qt-win IIRC 13:09
@rwmjones my poor webserver is totally fscked 13:12
DiscordianUK awww 13:12
@rwmjones any more questions? 13:12
linuxguru i guess you should think of putting the repository on fedorapeople as nirik suggested earlier :) 13:13
@rwmjones yes, I think that's a good idea 13:13
@nirik is there any repo of rebuilt free software made with mingw? ie, for windows users who want to run a popular opensource app? 13:13
@nirik I guess it could be hard to do for all fedora packaged applications. 13:13
AleBaStr what about command like "make installer.nsi", for customizing script? 13:13
npmccallum what is the likelihood of running into bugs in wine that don't exist in windows? 13:13
@rwmjones nirik, not really no. We didn't want to get into that game because it's lots of work tracking upstream releases. We want upstream to use our tools to provide the software for windows themselves. 13:14
@rwmjones AleBaStr, certainly it's something that can be done. The code in that is just a suggestion. 13:14
@nirik rwmjones: sure, understood. Wonder if it could be automated... but yeah, thats getting complex fast. ;( 13:14
@rwmjones npmccallum, yes, I've hit one of those so far, when doing inkscape 13:14
@rwmjones so we have ported inkscape using these tools 13:15
@rwmjones I've got some pretty screengrabs ... 13:15
@rwmjones 13:15
@rwmjones in fact, the slide I sent out at the beginning was constructed using mingw32-inkscape on wine 13:16
@nirik rwmjones: want to repaste your lines about where you are looking for help to wrap things up? 13:16
@rwmjones this one: 13:16
@rwmjones We *always* need volunteers: 13:16
@rwmjones - people who know about intimate details of compiling on Windows and OS X 13:16
@rwmjones - Fedora packagers 13:16
@rwmjones - Fedora reviewers 13:16
@rwmjones - testers 13:16
@rwmjones - developers who want to cross-compile their own apps 13:16
@rwmjones - developers who want to maintain Win32 ports of their own libraries 13:16
@rwmjones Web site: 13:16
@rwmjones Mailing list: 13:16
@rwmjones IRC: #fedora-mingw on FreeNode 13:16
@rwmjones Status: 13:16
@rwmjones ok thanks everyone, have a great morning/evening 13:17
@nirik excellent. Thanks for the informative talk rwmjones ! 13:17
AleBaStr thanks) 13:17
DiscordianUK thank you rwmjones 13:17
-!- nirik changed the topic of #fedora-classroom to: Fedora IRC Classroom - Next Class at 20:45UTC - See Classroom for todays class schedule and more info. 13:18
linuxguru yeah thank you rwmjones , it was a great session. :) 13:18
zer0c00l thanks rwmjones 13:18

Generated by 2.7 by Marius Gedminas - find it at!