<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5642138203955347602</id><updated>2012-03-10T09:05:44.154-08:00</updated><title type='text'>On Software</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://opekar.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://opekar.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Vasek Opekar</name><uri>http://www.blogger.com/profile/02828054598573169589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5642138203955347602.post-4022214294411590391</id><published>2011-06-08T14:35:00.000-07:00</published><updated>2011-06-08T15:05:32.647-07:00</updated><title type='text'>Android + CMake is much easier in ndk-r5b</title><content type='html'>About a &lt;a href="http://opekar.blogspot.com/2010/01/building-native-libraries-for-android.html"&gt;year or two ago&lt;/a&gt; we struggled to make regular CMake usage with Android easy, time has changed and with the newer Android ndk releases things are straightforward.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Bellow is content of &lt;i&gt;android_env.sh&lt;/i&gt; script. To use it with CMake do following&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;open command line + cd&amp;nbsp; to your project directory with CMakelist.txt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;.&amp;nbsp; ./android_env.sh&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;ccmake .&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#!/bin/sh&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: #990000;"&gt;export&lt;/span&gt; NDK=/home/vasek/android-ndk-r5b&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SYSROOT=$NDK/platforms/android-9/arch-arm&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MIDDLE=toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;PREF=arm-linux-androideabi-&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: #990000;"&gt;export&lt;/span&gt; CC=&lt;span style="color: #38761d;"&gt;"&lt;/span&gt;$NDK/$MIDDLE/${PREF}gcc&amp;nbsp; --sysroot=$SYSROOT"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: #990000;"&gt;export&lt;/span&gt; CXX="$NDK/$MIDDLE/${PREF}g++&amp;nbsp; --sysroot=$SYSROOT"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: #990000;"&gt;export&lt;/span&gt; LD="$NDK/$MIDDLE/${PREF}ld&amp;nbsp; --sysroot=$SYSROOT"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: #990000;"&gt;export&lt;/span&gt; CPP="$NDK/$MIDDLE/${PREF}cpp&amp;nbsp; --sysroot=$SYSROOT"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: #990000;"&gt;export&lt;/span&gt; AS="$NDK/$MIDDLE/${PREF}as&amp;nbsp; --sysroot=$SYSROOT"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: #990000;"&gt;export&lt;/span&gt; OBJCOPY="$NDK/$MIDDLE/${PREF}objcopy&amp;nbsp; --sysroot=$SYSROOT"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: #990000;"&gt;export &lt;/span&gt;OBJDUMP="$NDK/$MIDDLE/${PREF}objdump&amp;nbsp; --sysroot=$SYSROOT"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: #990000;"&gt;export&lt;/span&gt; STRIP="$NDK/$MIDDLE/${PREF}strip&amp;nbsp; --sysroot=$SYSROOT"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: #990000;"&gt;export&lt;/span&gt; RANLIB="$NDK/$MIDDLE/${PREF}ranlib&amp;nbsp; --sysroot=$SYSROOT"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: #990000;"&gt;export&lt;/span&gt; CCLD="$NDK/$MIDDLE/${PREF}gcc&amp;nbsp; --sysroot=$SYSROOT"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: #990000;"&gt;export&lt;/span&gt; AR="$NDK/$MIDDLE/${PREF}ar&amp;nbsp; --sysroot=$SYSROOT"&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5642138203955347602-4022214294411590391?l=opekar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opekar.blogspot.com/feeds/4022214294411590391/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://opekar.blogspot.com/2011/06/android-cmake-is-much-easier-in-ndk-r5b.html#comment-form' title='Počet komentářů: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/4022214294411590391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/4022214294411590391'/><link rel='alternate' type='text/html' href='http://opekar.blogspot.com/2011/06/android-cmake-is-much-easier-in-ndk-r5b.html' title='Android + CMake is much easier in ndk-r5b'/><author><name>Vasek Opekar</name><uri>http://www.blogger.com/profile/02828054598573169589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5642138203955347602.post-4404018917020990876</id><published>2011-01-13T03:25:00.000-08:00</published><updated>2011-01-13T03:25:25.190-08:00</updated><title type='text'>Shortening the debug phase</title><content type='html'>One way to be able to quickly slash bugs in embedded software projects is to have good information about the context bugs appear. My colleagues tried to summarize their experience from large software projects in automotive to the following &lt;a href="http://eccam.com/etar.php"&gt;paper -Ten steps to efficient bug analysis.&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;i&gt;"This whitepaper describes approach allowing comprehensive analysis of bugs offline which dramatically boosts efficiency of development team during bug fixing phase."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Content is following&lt;/b&gt;&lt;i&gt;&lt;b&gt; :&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Make log analysis user friendly&lt;/li&gt;&lt;li&gt;Mark bug in the log&lt;/li&gt;&lt;li&gt;Restore system state automatically from the log&lt;/li&gt;&lt;li&gt;Visualize performance and memory issues&lt;/li&gt;&lt;li&gt;Store call stacks in the log&lt;/li&gt;&lt;li&gt;Generate KPI reports directly from logs&lt;/li&gt;&lt;li&gt;Logging outside the application process&lt;/li&gt;&lt;li&gt;Unify logging mechanism&lt;/li&gt;&lt;li&gt;Optimize CPU overhead of logging&lt;/li&gt;&lt;li&gt;Compress logging data&lt;/li&gt;&lt;/ol&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5642138203955347602-4404018917020990876?l=opekar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opekar.blogspot.com/feeds/4404018917020990876/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://opekar.blogspot.com/2011/01/shortening-debug-phase.html#comment-form' title='Počet komentářů: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/4404018917020990876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/4404018917020990876'/><link rel='alternate' type='text/html' href='http://opekar.blogspot.com/2011/01/shortening-debug-phase.html' title='Shortening the debug phase'/><author><name>Vasek Opekar</name><uri>http://www.blogger.com/profile/02828054598573169589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5642138203955347602.post-2246534628882233968</id><published>2010-10-06T02:05:00.000-07:00</published><updated>2010-10-06T02:11:47.028-07:00</updated><title type='text'>Working with IBM Jazz via Python through REST api</title><content type='html'>Have you worked with &lt;a href="http://www-01.ibm.com/software/awdtools/rtc/"&gt;RTC&lt;/a&gt;, &lt;a href="http://www-01.ibm.com/software/awdtools/rqm/"&gt;RQM &lt;/a&gt;or any other IBM &lt;a href="http://jazz.net/"&gt;Jazz &lt;/a&gt;based tool? Maybe you needed to import or export data via your own script? &lt;br /&gt;&lt;br /&gt;There are some examples in Java and C#&amp;nbsp; showing how to interact with &lt;a href="http://www-01.ibm.com/software/awdtools/rqm/"&gt;RQM&amp;nbsp;&lt;/a&gt; in this &lt;a href="https://jazz.net/library/content/articles/rtc/2.0.0.2/oslc-extensions-workshop/Innovate2010_OSLC_workbook_v4.pdf"&gt;document&lt;/a&gt;. My preference was python. This post is a little example how to use python to interact with &lt;a href="http://www-01.ibm.com/software/awdtools/rqm/"&gt;RQM &lt;/a&gt;server.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Motivation&lt;/span&gt;&lt;br /&gt;It would be nice to have a python RQM client working like this. &lt;br /&gt;&lt;br /&gt;&lt;div style="height: 200px; overflow: auto;"&gt;&lt;div style="width: 900px;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&lt;b&gt;from &lt;/b&gt;jazzclient &lt;b&gt;import &lt;/b&gt;JazzClient&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;jazz = JazzClient&lt;b&gt;(&lt;/b&gt;&lt;span style="color: lime;"&gt;'https://servername:9443/jazz'&lt;/span&gt;,&lt;span style="color: lime;"&gt;'username&lt;/span&gt;',&lt;span style="color: lime;"&gt;'password&lt;/span&gt;'&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;workItemXml = jazz.getWorkItem&lt;b&gt;(&lt;/b&gt;&lt;span style="color: lime;"&gt;'3934'&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;jazz.changeProgress(&lt;/span&gt;&lt;span style="color: lime; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;'3934'&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;,&lt;/span&gt;&lt;span style="color: lime; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; '90'&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;)&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Interacting with the REST interface is easy via the &lt;a href="http://code.google.com/p/httplib2/"&gt;httplib2&lt;/a&gt; python module.&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;1. Authentication &lt;/span&gt;&lt;br /&gt;consists of 3 steps (details on &lt;a href="http://jazz.net/"&gt;jazz.net&lt;/a&gt; &lt;a href="http://www.blogger.com/%20https://jazz.net/library/content/articles/rtc/2.0.0.2/oslc-extensions-workshop/RTCExtPoT.pdf"&gt;here&lt;/a&gt;)&lt;br /&gt;&lt;ol&gt;&lt;li&gt;requesting a "restricted resource"&lt;/li&gt;&lt;li&gt;supplying credintials and getting togetherthe session ID&lt;/li&gt;&lt;li&gt;requesting the "restricted resource" again, this time we should get it and confirm that our session is authenticated&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;All the authentication is done during construction, see bellow.&lt;br /&gt;&lt;br /&gt;&lt;div style="height: 300px; overflow: auto;"&gt;&lt;div style="width: 900px;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;import&lt;/b&gt; urllib&lt;br /&gt;&lt;b&gt;import&lt;/b&gt; httplib2&lt;br /&gt;&lt;b&gt;from&lt;/b&gt; xml.dom.minidom &lt;b&gt;import&lt;/b&gt; parse, parseString&lt;br /&gt;&lt;b&gt;from&lt;/b&gt; exceptions &lt;b&gt;import&lt;/b&gt; Exception&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;class&lt;/b&gt; JazzClient&lt;b&gt;(&lt;/b&gt;object&lt;b&gt;):&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;def __init__(&lt;/b&gt;self&lt;b&gt;,&lt;/b&gt; server_url, user, password&lt;b&gt;):&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.base_url &lt;b&gt;=&lt;/b&gt; server_url&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.http &lt;b&gt;=&lt;/b&gt; httplib2.Http&lt;b&gt;()&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.http.follow_redirects &lt;b&gt;=&lt;/b&gt; True&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.headers = {&lt;span style="background-color: white; color: lime;"&gt;'Content-type'&lt;/span&gt;: &lt;span style="color: lime;"&gt;'text/xml'&lt;/span&gt;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #cccccc;"&gt;#1) before authentification one needs to go first to a "restricted resource"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resp, content = self.http.request( self.base_url + &lt;span style="color: lime;"&gt;"/oslc/workitems/1.xml"&lt;/span&gt;, &lt;span style="color: lime;"&gt;'GET&lt;/span&gt;', headers=self.headers)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #cccccc;"&gt;#TODO sometimes returns capital X-&lt;/span&gt;&lt;br style="color: #cccccc;" /&gt;&lt;span style="color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #TODO check before if the key is in dictionary, if not something is wrong as well&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if resp[&lt;span style="background-color: white; color: lime;"&gt;'x-com-ibm-team-repository-web-auth-msg'&lt;/span&gt;] != &lt;span style="color: lime;"&gt;'authrequired'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise Exception(&lt;span style="color: lime;"&gt;"something is wrong seems the server doesn't expect authentication!"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.headers[&lt;span style="color: lime;"&gt;'Cookie'&lt;/span&gt;]=&amp;nbsp; resp[&lt;span style="color: lime;"&gt;'set-cookie'&lt;/span&gt;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.headers[&lt;span style="color: lime;"&gt;'Content-type'&lt;/span&gt;] = &lt;span style="color: lime;"&gt;'application/x-www-form-urlencoded'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #cccccc;"&gt;#2 now we can start the authentication via j_security_check page&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resp, content = self.http.request(self.base_url+&lt;span style="background-color: lime;"&gt;&lt;span style="background-color: white; color: lime;"&gt;'/j_security_check'&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: white;"&gt; &lt;/span&gt;, &lt;span style="color: lime;"&gt;'POST'&lt;/span&gt;, headers=self.headers, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; body=urllib.urlencode({&lt;span style="color: lime;"&gt;'j_username'&lt;/span&gt;: user, &lt;span style="color: lime;"&gt;'j_password'&lt;/span&gt;: password}))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #cccccc;"&gt; #TODO check auth worked fine, if not throw exception&lt;/span&gt;&lt;br style="color: #cccccc;" /&gt;&lt;span style="color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #3 get the requested resource - finish the authentication&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resp, content = self.http.request( self.base_url + &lt;span style="color: lime;"&gt;"/oslc/workitems/1.xml"&lt;/span&gt;, &lt;span style="color: lime;"&gt;'GET'&lt;/span&gt;, headers=self.headers)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;2. Getting a first "WorkItem" in XML (&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: large;"&gt;getWorkItem&lt;/span&gt;&lt;span style="font-size: large;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once we are authenticated&amp;nbsp; it's just simple (follow&lt;a href="https://jazz.net/wiki/bin/view/Main/ResourceOrientedWorkItemAPIv2"&gt; the API documentation&lt;/a&gt; ). &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;getWorkItem &lt;/span&gt;is method of &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;JazzClient &lt;/span&gt;class.&lt;br /&gt;&lt;br /&gt;&lt;div style="height: 200px; overflow: auto;"&gt;&lt;div style="width: 1400px;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;def &lt;/b&gt;getWorkItem&lt;b&gt;(&lt;/b&gt;self, itemNumber&lt;b&gt;):&lt;/b&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.headers&lt;b&gt;[&lt;/b&gt;&lt;span style="color: lime;"&gt;'Content-type'&lt;/span&gt;&lt;b&gt;]&lt;/b&gt; = &lt;span style="color: lime;"&gt;'text/xml'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resp, content = self.http.request&lt;b&gt;(self.base_url+&lt;span style="color: lime;"&gt;'/oslc/workitems/'&lt;/span&gt;+ itemNumber +&lt;span style="color: lime;"&gt;'.xml'&lt;/span&gt;&lt;/b&gt;, &lt;span style="color: lime;"&gt;'GET'&lt;/span&gt;, headers=self.headers&lt;b&gt;)&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;if&lt;/b&gt; resp.status &lt;b&gt;!=&lt;/b&gt; 200&lt;b&gt;:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;raise &lt;/b&gt;Exception&lt;b&gt;(&lt;/b&gt;&lt;span style="color: lime;"&gt;"JazzClient responce status != 200 !!!"&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;return&lt;/b&gt; content &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;3. Changing progress field in a WorkItem (&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;changeProgress&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;Now a small example showing change of &lt;i&gt;progress&lt;/i&gt; field in a WorkItem. Again following method belongs to above &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;JazzClient &lt;/span&gt;class.&lt;br /&gt;&lt;br /&gt;&lt;div style="height: 300px; overflow: auto;"&gt;&lt;div style="width: 6000px;"&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;def &lt;/b&gt;changeProgress&lt;b&gt;(&lt;/b&gt;self, itemNumber, progress&lt;b&gt;):&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; changeRequest = &lt;span style="color: lime;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;"""&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;oslc_cm:changerequest xmlns:atom="http://www.w3.org/2005/Atom" xmlns:calm="http://jazz.net/xmlns/prod/jazz/calm/1.0/" xmlns:dc="http://purl.org/dc/terms/" xmlns:jd="http://jazz.net/xmlns/prod/jazz/discovery/1.0/" xmlns:jp="http://jazz.net/xmlns/prod/jazz/process/1.0/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:oslc_cm="http://open-services.net/xmlns/cm/1.0/" xmlns:oslc_disc="http://open-services.net/xmlns/discovery/1.0/" xmlns:oslc_qm="http://open-services.net/xmlns/qm/1.0/" xmlns:oslc_rm="http://open-services.net/xmlns/rm/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:rtc_cm="http://jazz.net/xmlns/prod/jazz/rtc/cm/1.0/"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;rtc_cm:progress&gt;%s&amp;lt;/rtc_cm:progress&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/oslc_cm:changerequest&gt;"""&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;% &lt;b&gt;(&lt;/b&gt;progress&lt;b&gt;)&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.headers&lt;b&gt;[&lt;/b&gt;&lt;span style="color: lime;"&gt;'Content-type'&lt;/span&gt;&lt;b&gt;]&lt;/b&gt; = &lt;span style="color: lime;"&gt;'text/xml'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resp, content = self.http.request&lt;b&gt;(&lt;/b&gt;self.base_url+&lt;span style="color: lime;"&gt;'/oslc/workitems/'&lt;/span&gt;+ itemNumber +&lt;span style="color: lime;"&gt;'.xml'&lt;/span&gt; , &lt;span style="color: yellow;"&gt;'PUT'&lt;/span&gt;, headers=self.headers, body=changeRequest&lt;b&gt;)&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;if &lt;/b&gt;resp.status != 200&lt;b&gt;:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;raise &lt;/b&gt;Exception&lt;b&gt;(&lt;/b&gt;&lt;span style="color: lime;"&gt;"JazzClient.responce status != 200 !!!"&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;return &lt;/b&gt;content&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;With the&lt;a href="https://jazz.net/wiki/bin/view/Main/ResourceOrientedWorkItemAPIv2"&gt; REST api documentation&lt;/a&gt; and bit of python it is fun to interact with Jazz servers.&lt;br /&gt;The above code of &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;JazzClient&lt;/span&gt; class&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;were tested so just copy&amp;amp;paste to use it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Links&lt;/span&gt;&lt;span style="font-size: large;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="https://jazz.net/wiki/bin/view/Main/ResourceOrientedWorkItemAPIv2" target="_top"&gt;RTC REST API v2.0&lt;/a&gt; &lt;/li&gt;&lt;li&gt; &lt;a href="http://jazz.net/wiki/bin/view/Main/RqmApi" target="_top"&gt;RQM API&lt;/a&gt; - Data model of RQM &lt;/li&gt;&lt;li&gt; &lt;a href="https://jazz.net/wiki/bin/view/Main/RQMUsingPoster" target="_top"&gt;RQM Using Poster&lt;/a&gt; - howto access&amp;nbsp; RQM using Firefox Poster plugin d&lt;/li&gt;&lt;li&gt; &lt;a href="https://jazz.net/library/content/articles/rtc/2.0.0.2/oslc-extensions-workshop/Innovate2010_OSLC_workbook_v4.pdf" target="_top"&gt;OSLC Workshop - Consumer &amp;amp; Producer labs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://jazz.net/wiki/bin/view/Main/RQMURLUtility" target="_top"&gt;RQMURLUtility&lt;/a&gt; - example java client for REST API including source code&lt;/li&gt;&lt;/ul&gt;Some links expect registration (free). &lt;br /&gt;&lt;span style="font-size: large;"&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5642138203955347602-2246534628882233968?l=opekar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opekar.blogspot.com/feeds/2246534628882233968/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://opekar.blogspot.com/2010/10/working-with-ibm-jazz-via-python.html#comment-form' title='Počet komentářů: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/2246534628882233968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/2246534628882233968'/><link rel='alternate' type='text/html' href='http://opekar.blogspot.com/2010/10/working-with-ibm-jazz-via-python.html' title='Working with IBM Jazz via Python through REST api'/><author><name>Vasek Opekar</name><uri>http://www.blogger.com/profile/02828054598573169589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5642138203955347602.post-973071497636609092</id><published>2010-01-31T07:34:00.000-08:00</published><updated>2010-01-31T07:40:43.385-08:00</updated><title type='text'>Building native libraries for Android using CMake</title><content type='html'>Some time ago we started to use &lt;a href="http://www.cmake.org/"&gt;CMake&lt;/a&gt; build scripts for the &lt;a href="http://www.android.com/"&gt;Android&lt;/a&gt; platform since most of our cross-platform projects are based on &lt;a href="http://www.cmake.org/"&gt;CMake&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Maybe this style of building is also of your preference.&lt;br /&gt;If so, here is a little how-to.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.cmake.org/"&gt;CMake&lt;/a&gt; and &lt;a href="http://developer.android.com/sdk/ndk/1.6_r1/index.html"&gt;Android NDK&lt;/a&gt; need tobe installed&lt;br /&gt;&lt;/li&gt;&lt;li&gt;create a &lt;i&gt;gcc-android&lt;/i&gt; file (copy paste from bellow)&lt;/li&gt;&lt;li&gt;create a symlink to &lt;i&gt;gcc-android&lt;/i&gt; called &lt;i&gt; g++-android&lt;/i&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;create &lt;i&gt;android-build-env&lt;/i&gt; file on your system (see bellow)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;adjust ANDROID_GCC_WRAPPERS variable (&lt;i&gt;in android-build-env!)&lt;/i&gt; to point to directory where gcc-&lt;i&gt;android&lt;/i&gt; is &lt;br /&gt;&lt;/li&gt;&lt;li&gt;run " &lt;i&gt;. ./android-build-env&lt;/i&gt;" to set proper environment to tell &lt;a href="http://www.cmake.org/"&gt;CMake&lt;/a&gt; what tools to use for project building&lt;br /&gt;&lt;/li&gt;&lt;li&gt;generate project files from &lt;a href="http://www.cmake.org/"&gt;CMake&lt;/a&gt; file (e.g. using &lt;i&gt;ccmake&lt;/i&gt;)&lt;/li&gt;&lt;li&gt;generated project is ready to build the binaries using&amp;nbsp; &lt;i&gt;gcc-android&lt;/i&gt; gcc wrapper.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Scripts were tested with Eclipse and make on (Ubuntu) Linux.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;File - android-build-env&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 78%;"&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;export ANDROID_NDK_ROOT="$HOME/android-ndk-1.6_r1"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export ANDROID_GCC_WRAPPERS="!! PLS CHANGE !! PATH_TO_gcc-android script"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export PATH="$ANDROID_GCC_WRAPPERS:$ANDROID_NDK_ROOT/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/:$PATH"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export CROSS_PREFIX="arm-eabi-"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export SYSROOT="$ANDROID_NDK_ROOT/build/platforms/android-4/arch-arm"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt; &lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; # The config is specified in $ANDROID_NDK_ROOT/build/toolchains/arm-eabi-4.2.1/setup.mk&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; # and $ANDROID_NDK_ROOT/build/core/build-*.mk&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt; &lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export MAKE="make"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt; &lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; # Use android wrappers&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export CC="gcc-android"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export CXX="g++-android"&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 78%;"&gt;&lt;code&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export LD="deliberatey-undefined-do-not-use-directly"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export CPP="${CROSS_PREFIX}gcc -E"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export AS="${CROSS_PREFIX}as"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export OBJCOPY="${CROSS_PREFIX}objcopy"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export OBJDUMP="${CROSS_PREFIX}objdump"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export STRIP="${CROSS_PREFIX}strip"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export RANLIB="${CROSS_PREFIX}ranlib"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export CCLD="${CROSS_PREFIX}gcc"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export AR="${CROSS_PREFIX}ar"&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;File - gcc-android&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 78%;"&gt;&lt;verbatim&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#!/bin/bash&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# Android gcc/g++ wrapper&lt;br /&gt;#&lt;br /&gt;# As android uses completely hacked and gutted gcc, it also&lt;br /&gt;# uses -nostdlib, so for the linking phase we must explicitly&lt;br /&gt;# specify crtbegin, crtend and friends. =&amp;gt; We can't just do&lt;br /&gt;# with LDFLAGS. :-(&lt;br /&gt;#&lt;br /&gt;# set DRY_RUN=1 for dry run&lt;br /&gt;# set V=1 for verbose run&lt;br /&gt;V=1&lt;br /&gt;&lt;br /&gt;if [ -z $CROSS_PREFIX ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo "Source android-build-env first!"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit 1&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;REAL_CC="${CROSS_PREFIX}gcc"&lt;br /&gt;REAL_CXX="${CROSS_PREFIX}g++"&lt;/span&gt;&lt;/span&gt;&lt;/verbatim&gt;&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# Inspired by ndk-wrappers:&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 78%;"&gt;&lt;verbatim&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: xx-small;"&gt;COMMON_FLAGS="--sysroot=$SYSROOT -march=armv5te -mtune=xscale -msoft-float -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CFLAGS="$COMMON_FLAGS"&lt;br /&gt;&lt;br /&gt;CXXFLAGS="$COMMON_FLAGS" -fno-exceptions -fno-rtti"&lt;br /&gt;&lt;br /&gt;TARGET_LIBGCC=`${CROSS_PREFIX}gcc -mthumb-interwork -print-libgcc-file-name`&lt;br /&gt;&lt;br /&gt;# Test if we're wrapping gcc or g++&lt;br /&gt;THIS_SCRIPT=`basename "$0"`&lt;br /&gt;&lt;br /&gt;if [[ "$THIS_SCRIPT" =~ 'gcc' ]]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WRAPPED="$REAL_CC"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; COMPILE_FLAGS="$CFLAGS"&lt;br /&gt;elif [[ "$THIS_SCRIPT" =~ 'g++' ]]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WRAPPED="$REAL_CXX"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; COMPILE_FLAGS="$CXXFLAGS"&lt;br /&gt;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo "Wrong script name - matches neither '^gcc' nor '^g++'."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit 2&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# Determine what mode (link, compile, nothing) we're in&lt;br /&gt;LINK=1&lt;br /&gt;COMPILE=0&lt;br /&gt;SHARED=0&lt;br /&gt;for ARG in "$@"; do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case "$ARG" in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # Preprocess-only (-E) and don't assemble (-S) mean the same as -c for us - the same CFLAGS are needed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; -c|-S|-E)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LINK=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *.c|*.cpp|*.c++|*.cxx)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; COMPILE=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ;;&lt;br /&gt;&lt;br /&gt;# This is broken: gcc -c src.c -o object.o&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *.o)&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LINK=1&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; -shared)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SHARED=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; -static)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; echo "$0: Static executables not supported by this wrapper."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exit 5&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; -v)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LINK=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; COMPILE=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; esac&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;if [ $# -eq 0 ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; COMPILE=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LINK=0&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;function verbose_command&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if [ "$V" = "1" -o "$DRY_RUN" = "1" ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; echo "$@"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fi&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if [ "$DRY_RUN" != "1" ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "$@"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fi&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# Compile source&lt;br /&gt;function compile&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # That's easy&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; verbose_command "$WRAPPED" $COMPILE_FLAGS "$@"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# Link a binary&lt;br /&gt;function link&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # TODO: Separate libraries, sources and other arguments&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Idea: read args till hitting sources -&amp;gt; that's USER_LIBS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # rest is USER_OBJECTS, ignore USER_ARGS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; USER_LIBS=""&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; USER_OBJECTS=""&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; USER_ARGS=""&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OBJECTS_HIT=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ARG in "$@"; do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if [ $OBJECTS_HIT -eq 0 ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # Test if ARG is a lib&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if [[ "$ARG" == *.o ]]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # is an object&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; OBJECTS_HIT=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; USER_OBJECTS="$USER_OBJECTS $ARG"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # a lib or an early param&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; USER_LIBS="$USER_LIBS $ARG"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fi&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # We already reached objects, stuff all into USER_OBJECTS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; USER_OBJECTS="$USER_OBJECTS $ARG"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fi&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; done&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Mess starts here&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if [ $SHARED -eq 1 ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # TODO: Remove -shared from args&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # Building a shared library&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LD_PREFIX="--sysroot=$SYSROOT -nostdlib -Wl,-shared,-Bsymbolic"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LD_BEGIN="$SYSROOT/usr/lib/libc.so&amp;nbsp; $SYSROOT/usr/lib/libm.so"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # user objects&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # user dyn. libs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LD_END="-Wl,--no-undefined -Wl,-rpath-link=$SYSROOT/usr/lib $TARGET_LIBGCC"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; verbose_command "$WRAPPED" $LD_PREFIX $USER_OBJECTS $USER_LIBS $LD_BEGIN $LD_END $USER_ARGS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # Building dynamic executable&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LD_PREFIX="--sysroot=$SYSROOT -nostdlib -Bdynamic -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # STLport static lib explodes here, needs to come after objects (??)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LD_BEGIN="$SYSROOT/usr/lib/libc.so&amp;nbsp; $SYSROOT/usr/lib/libm.so $SYSROOT/usr/lib/crtbegin_dynamic.o"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # user objects&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # user dyn. libs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LD_END="-Wl,--no-undefined -Wl,-rpath-link=$SYSROOT/usr/lib $TARGET_LIBGCC $SYSROOT/usr/lib/crtend_android.o"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; verbose_command "$WRAPPED" $LD_PREFIX $LD_BEGIN $USER_OBJECTS $USER_LIBS $LD_END $USER_ARGS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fi&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if [ $COMPILE -eq 0 -a $LINK -eq 0 ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # No special handling needed, call $WRAPPED&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; verbose_command "$WRAPPED" "$@"&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# TODO: support link+compile&lt;br /&gt;if [ $COMPILE -eq 1 -a $LINK -eq 1 ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo "$0: Link and compile in one step is not supported by this wrapper."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit 4&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ $COMPILE -eq 1 ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; compile "$@"&lt;br /&gt;elif [ $LINK -eq 1 ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; link "$@"&lt;br /&gt;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo "$0: Internal error: Uknown compiler mode."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit 3&lt;br /&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/verbatim&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5642138203955347602-973071497636609092?l=opekar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opekar.blogspot.com/feeds/973071497636609092/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://opekar.blogspot.com/2010/01/building-native-libraries-for-android.html#comment-form' title='Počet komentářů: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/973071497636609092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/973071497636609092'/><link rel='alternate' type='text/html' href='http://opekar.blogspot.com/2010/01/building-native-libraries-for-android.html' title='Building native libraries for Android using CMake'/><author><name>Vasek Opekar</name><uri>http://www.blogger.com/profile/02828054598573169589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5642138203955347602.post-5121332628948003704</id><published>2009-05-07T02:43:00.000-07:00</published><updated>2010-01-31T07:44:12.734-08:00</updated><title type='text'>pygtkie - Internet Explorer in your pygtk application</title><content type='html'>&lt;a href="http://code.google.com/p/pygtkie"&gt;pygtkie&lt;/a&gt; is a small component  for embedding Internet explorer to &lt;a href="http://www.pygtk.org/"&gt;pygtk&lt;/a&gt; applications ( on Windows of course) using python language.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The picture bellow shows what you can do with &lt;a href="http://code.google.com/p/pygtkie"&gt;pygtkie&lt;/a&gt;. Among other things a start up page for a program. If user clicks on a specific link a custom python code can be called.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_SxuP6BJv9NU/SgK0cpBbj_I/AAAAAAAAAAM/1EfEsZWvKE0/s1600-h/startpage_using_pygtkie.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5333023312901279730" src="http://2.bp.blogspot.com/_SxuP6BJv9NU/SgK0cpBbj_I/AAAAAAAAAAM/1EfEsZWvKE0/s400/startpage_using_pygtkie.png" style="cursor: pointer; height: 323px; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please see code examples on &lt;a href="http://code.google.com/p/pygtkie"&gt;pygtkie&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5642138203955347602-5121332628948003704?l=opekar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opekar.blogspot.com/feeds/5121332628948003704/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://opekar.blogspot.com/2009/05/pygtkie-internet-explorer-in-your-pygtk.html#comment-form' title='Počet komentářů: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/5121332628948003704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/5121332628948003704'/><link rel='alternate' type='text/html' href='http://opekar.blogspot.com/2009/05/pygtkie-internet-explorer-in-your-pygtk.html' title='pygtkie - Internet Explorer in your pygtk application'/><author><name>Vasek Opekar</name><uri>http://www.blogger.com/profile/02828054598573169589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_SxuP6BJv9NU/SgK0cpBbj_I/AAAAAAAAAAM/1EfEsZWvKE0/s72-c/startpage_using_pygtkie.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5642138203955347602.post-5807604871478540104</id><published>2009-04-19T12:16:00.000-07:00</published><updated>2011-10-27T10:08:21.242-07:00</updated><title type='text'>eliminate the monkey work</title><content type='html'>Sometimes  people suggest to hire a student (== not so expensive technical person) to do some repetitive a tedious tasks. Eg. testing a specific module, pre-chewing certain complex document etc.&lt;br /&gt;&lt;br /&gt;It's a temptation, especially when you have a big enough budget and a good will to &lt;span style="font-weight: bold;"&gt;help&lt;/span&gt; your overloaded software team. But at the end it maybe has the &lt;span style="font-weight: bold;"&gt;opposite effect&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A  few disadvantages which just come to my mind:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;if the hard monkey job is done by somebody else you don't even start to think how to eliminate it (eg. module is automaticaly testable only if it's designed the right way)&lt;/li&gt;&lt;li&gt;repetitive work is no fun - bad mood doesn't increase the productivity of your team&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the more people in the team, the more time spent in meeting, communication, management, administration...&lt;/li&gt;&lt;/ol&gt;In software factories  most of the repetitive and boring work can be eliminated. Some repetitive tasks are harder to remove some are just easy. Complex documents can be managed by requirement management tools, most of the testing can be decomposed in a way that it could be run automatically, integration test can be semi-automated&lt;br /&gt;&lt;br /&gt;If one succeeds in eliminating this repetitive tasks he/she is rewarded by having a smaller team which is more flexible, faster and most probably the deliverable will contain less bugs.&lt;br /&gt;&lt;br /&gt;Let me put it simple:  &lt;span style="font-weight: bold;"&gt;"Monkey tasks must be shared by the whole team, otherwise the senior people are not motivated to eliminate them."&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5642138203955347602-5807604871478540104?l=opekar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opekar.blogspot.com/feeds/5807604871478540104/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://opekar.blogspot.com/2009/04/eliminate-monkey-work.html#comment-form' title='Počet komentářů: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/5807604871478540104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/5807604871478540104'/><link rel='alternate' type='text/html' href='http://opekar.blogspot.com/2009/04/eliminate-monkey-work.html' title='eliminate the monkey work'/><author><name>Vasek Opekar</name><uri>http://www.blogger.com/profile/02828054598573169589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5642138203955347602.post-6017595587819724158</id><published>2009-04-08T13:37:00.000-07:00</published><updated>2010-01-31T07:45:11.496-08:00</updated><title type='text'>Data2l 1.0 - Management of complex data structures</title><content type='html'>We finally released &lt;a href="http://www.eccam.com/datatool.php"&gt;Data2l 1.0.&lt;/a&gt;&lt;br /&gt;It helped us a lot during the last 3 years in understanding, generating, patching large "embedded" (also called "read-only" or "flatfiles") databases.&lt;br /&gt;After those years of internal usage and internal development we cut off all the proprietary parts and released a general tool.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you manage a large read-only database - typically in embedded system like car navigation - &lt;a href="http://www.eccam.com/datatool.php"&gt;have a look&lt;/a&gt; it might save you a lot of work.&lt;br /&gt;&lt;br /&gt;Using couple of types like Structure, Alternative, Array and Basic ( word, byte, dword ...) and using really simple "functional"  language for relation definition we can describe really complex binary structures.&lt;br /&gt;&lt;br /&gt;Once structure is described it's so easy do anything with it .. generate new data, inspect old data, use SAX and DOM like access, transform  data or generate a specialized maintenance code. We used generated C++ code and this way we could work with a large binary data with quick and ease.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5642138203955347602-6017595587819724158?l=opekar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opekar.blogspot.com/feeds/6017595587819724158/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://opekar.blogspot.com/2009/04/data2l-10-management-of-complex-data.html#comment-form' title='Počet komentářů: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/6017595587819724158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/6017595587819724158'/><link rel='alternate' type='text/html' href='http://opekar.blogspot.com/2009/04/data2l-10-management-of-complex-data.html' title='Data2l 1.0 - Management of complex data structures'/><author><name>Vasek Opekar</name><uri>http://www.blogger.com/profile/02828054598573169589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5642138203955347602.post-7509855632006678941</id><published>2009-03-19T14:52:00.000-07:00</published><updated>2010-01-31T07:43:05.815-08:00</updated><title type='text'>Repeat after me: "Singleton is my enemy"</title><content type='html'>Some people call  singletons controversial some call them evil. I'd say the second group consists of those who pray to OOP.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What are the reasons why  they are evil especially in large scale software design?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;they cripple locality&lt;/span&gt; - singleton is equal to a global variable - it's functionality can suddenly appear anywhere in the program. This decreases dramatically understandability of the system and often forces you to use new and new singletons, especially if management is pushing for new features and there is no time for refactoring.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;they increase number of states  in the system&lt;/span&gt; - singletons don't have parametrized constructors - that enforces to use "set" methods which add the necessary context to singletons. But that means that we need to check in singleton methods that the context is correctly set. So again in all the functions we have couple of more "if" statements, if we have "if" statements we probably  have to report failure return codes.&lt;span style="font-style: italic;"&gt; "hello! here is a singleton  which doesn't know its context!"&lt;/span&gt;.&lt;br /&gt;Little by little  we need to add more and more code which takes care about the state of the system. This doesn't happen during weeks or months. This happens during &lt;span style="font-style: italic;"&gt;years of software maintenance&lt;/span&gt;. People coming and leaving .. managements is pushing ... do you know the story ? :-)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;they are difficult to release&lt;/span&gt; - singleton is usually not owned by any other object. Those who are not owned are then released in &lt;span style="font-style: italic;"&gt;compiler specific defined order&lt;/span&gt;. This is not what we want to have. When there are more singletons they are normally that entangled that graceful release of such objects is not possible. If one cannot gracefully shutdown it's system resource leak analysis is difficult.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;There are  many reasons and explanations above three are the first  which come to  my mind  just yahoo &lt;span style="font-style: italic;"&gt;"why singletons are bad"&lt;/span&gt;  or something similar to see the consensus.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5642138203955347602-7509855632006678941?l=opekar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opekar.blogspot.com/feeds/7509855632006678941/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://opekar.blogspot.com/2009/03/repeat-after-me-singleton-is-my-enemy.html#comment-form' title='Počet komentářů: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/7509855632006678941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5642138203955347602/posts/default/7509855632006678941'/><link rel='alternate' type='text/html' href='http://opekar.blogspot.com/2009/03/repeat-after-me-singleton-is-my-enemy.html' title='Repeat after me: &quot;Singleton is my enemy&quot;'/><author><name>Vasek Opekar</name><uri>http://www.blogger.com/profile/02828054598573169589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
