<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Semipol Blog</title>
	<atom:link href="http://www.semipol.de/feed" rel="self" type="application/rss+xml" />
	<link>http://www.semipol.de</link>
	<description>Wer braucht schon Untertitel?</description>
	<lastBuildDate>Thu, 16 Feb 2012 13:06:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Relative RPath Settings with CMake</title>
		<link>http://www.semipol.de/archives/356</link>
		<comments>http://www.semipol.de/archives/356#comments</comments>
		<pubDate>Thu, 16 Feb 2012 13:05:57 +0000</pubDate>
		<dc:creator>languitar</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[CMake]]></category>
		<category><![CDATA[corlab]]></category>

		<guid isPermaLink="false">http://www.semipol.de/?p=356</guid>
		<description><![CDATA[The run-time search path (rpath) defines paths to search for dynamic libraries when executing a program. It is a mechanism on Linux parallel to the LD_LIBRARY_PATH environment variable, which is another hint to find dynamic libraries. Usually, it is a good idea to make software which you built relocatable. This means that created binaries can [...]]]></description>
			<content:encoded><![CDATA[<p>The run-time search path (rpath) defines paths to search for dynamic libraries when executing a program. It is a mechanism on Linux parallel to the LD_LIBRARY_PATH environment variable, which is another hint to find dynamic libraries.</p>
<p>Usually, it is a good idea to make software which you built relocatable. This means that created binaries can be moved around and they still work after the location change. This includes the ability to still find the correct versions of dynamic libraries. One simple way to achieve this is by setting the rpath relative to the current location of the binary. In CMake this can be achieved like this:</p>
<pre class="brush: plain; title: ; notranslate">
# for all binaries created in a CMake project:
SET(CMAKE_INSTALL_RPATH &quot;\$ORIGIN/../lib:\$ORIGIN/&quot;)
# for certain targets
SET_TARGET_PROPERTIES(target 1 target2 ...
    PROPERTIES INSTALL_RPATH &quot;\$ORIGIN/../lib:\$ORIGIN/&quot;)
</pre>
<p>Please note that the backslash is required.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.semipol.de/archives/356/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New script added</title>
		<link>http://www.semipol.de/archives/353</link>
		<comments>http://www.semipol.de/archives/353#comments</comments>
		<pubDate>Tue, 03 Jan 2012 23:26:23 +0000</pubDate>
		<dc:creator>languitar</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.semipol.de/?p=353</guid>
		<description><![CDATA[fixgpsandtags]]></description>
			<content:encoded><![CDATA[<p><a href="software/fixgpsandtags" title="fixgpsandtags">fixgpsandtags</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.semipol.de/archives/353/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Dependency Tracking in Jenkins with CMake-based C++ Projects</title>
		<link>http://www.semipol.de/archives/326</link>
		<comments>http://www.semipol.de/archives/326#comments</comments>
		<pubDate>Sun, 31 Jul 2011 20:30:31 +0000</pubDate>
		<dc:creator>languitar</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[CMake]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[corlab]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jenkins]]></category>

		<guid isPermaLink="false">http://www.semipol.de/?p=326</guid>
		<description><![CDATA[If you are building multiple related software projects with a continuous integration server one important aspect is to be notified when changes in an upstream job break the build or tests for a downstream job. This involves knowing which exact build numbers of the upstream and the downstream job are involved. The Jenkins continuous integration [...]]]></description>
			<content:encoded><![CDATA[<p>If you are building multiple related software projects with a continuous integration server one important aspect is to be notified when changes in an upstream job break the build or tests for a downstream job. This involves knowing which exact build numbers of the upstream and the downstream job are involved.</p>
<p>The <a href="http://jenkins-ci.org/" title="Jenkins CI" target="_blank">Jenkins</a> continuous integration server uses the notion of <a href="https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint" title="Jeknins File Fingerprints" target="_blank">file fingerprints</a> for this purpose. The upstream job is built by Jenkins and produces one or several so called artifacts, the results of the build process. The artifacts are archived by Jenkins and fingerprints (hash sums) for each artifact are created and stored along with the build number of the job. When the downstream job starts to build it downloads the (most recent) artifacts from the upstream job and uses them for its purposes, i.e. building and running the own source code. By comparing the fingerprints of the downloaded artifacts with the stored fingerprints Jenkins knows which version of each upstream job was involved in a build and can track which upstream build number broke the downstream job. Jenkins will <strong>only</strong> issue notifications if this fingerprinting mechanism is properly configured, triggering a build after another is not sufficient to receive these notifications. Moreover, the <a href="https://wiki.jenkins-ci.org/display/JENKINS/Blame+Upstream+Committers+Plugin" title="Jenkins Blame Upstream Committers plugin" target="_blank">Blame Upstream Commiters plugin</a> needs to be used and enabled for each downstream job or the global property <a href="https://wiki.jenkins-ci.org/display/JENKINS/Features+controlled+by+system+properties" title="Jenkins Properties" target="_blank">hudson.upstreamCulprits</a> (will this ever be renamed?) needs to be set.</p>
<p>The rational behind this rather complex mechanism is that it enables a high amount of parallelism for building jobs. While the downstream job builds, the upstream job can already operate again without affecting the downstream job. This would be the case if e.g. a central installation location would be shared between both jobs. If the upstream job installs new files while the downstream job is still building, this will certainly result in hard to debug errors. Moreover, this also allows to run the downstream job on a different build salve (assuming similar systems), which also would not be the case with a central installation location in a file system. </p>
<p>For Java projects (where Jenkins comes from) the explained mechanism usually works well. The upstream job produces one or several jar files containing all resources for the project like images, fingerprints them, no preprocessor is involved which configures the Java code according to the installation setup, and no source code was generated based on this setup. For C++ projects this is usually different, because the language already includes a preprocessor and it is common practice to set certain code lines according to the installation location, e.g. to find additional files like images, because they cannot be packaged in the jar file. Also, C++ projects usually consists of much more files considering all headers compared to Java. This provides more chances to mix something up.</p>
<p>So assuming an upstream C++ job A (using CMake, other build solutions are not covered in this post but the techniques can be applied there, too) which is built in Jenkins, it usually will be configured with an installation location, e.g. inside the job&#8217;s workspace like /jenkins/workspace/A/install.</p>
<ol>
<li>Often, CMake will use this location, e.g. to generate a config.h which tells that images are found at /jenkins/workspace/A/install/share/A/images etc.</li>
<li> To use the CMake dependency mechanism, it will generate a AConfig.cmake file and install it also to the share folder (cf. the <a href="http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:find_package" title="CMake find_package documentation" target="_blank">CMake documentation for find_package</a>). The file might look like:<br/>
<pre>SET(A_LIBRARIES "/jenkins/workspace/A/install/lib/libA.so")
SET(A_INCLUDE_DIRS "/jenkins/workspace/A/install/include/A")
</pre>
</li>
</ol>
<p>After building the project the job will e.g. use a compression tool to create a single archive and compress all contents of /jenkins/workspace/A/install/, archive this artifact and generate the fingerprints for it.</p>
<p>Both issues mentions above will prevent the dependency tracking of Jenkins to function properly, because the downstream job will download the artifacts to its own workspace, e.g. to /jenkins/workspace/B/upstream/A and unpack them. Cf. the issues:</p>
<ol>
<li>The upstream project A will not find external files at all or will use wrong versions, because in the meantime a new build of job A might have started and hence the workspace of this job is currently changing.</li>
<li>The downstream job B will not build at all or might use a wrong version of A because the contents of AConfig.cmake point to A&#8217;s workspace and not the downloaded artifacts.
</ol>
<p>To enable reliable dependency tracking in Jenkins, the solutions are:</p>
<ol>
<li>Do not use this technique at all. The software is generally more flexible if not hard locations are assumed and more situations are covered without recompiling.</li>
<li>The idea here is to make all paths given in the config file (AConfig.cmake) relative to its current location on the disc. This will look like this:<br/>
<pre>GET_FILENAME_COMPONENT(CONFIG_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
SET(A_LIBRARIES "${CONFIG_DIR}/../../lib/libA.so")
SET(A_INCLUDE_DIRS "${CONFIG_DIR}/../../include/A")
</pre>
<p>Now the CMake script of B will use the correct downloaded headers, libraries etc. for A from the own workspace</li>
</ol>
<p>The two aspects make it possible to use fingerprinting in Jenkins for dependency tracking with notifications for upstream committers. Especially the first aspect includes taking care while designing the project but there is no other solution I can think of.</p>
<p>Please note that for executing any tests in downsteam job B you have to set the LD_LIBRARY_PATH to find the right upstream libraries as well.</p>
<h3>Random Comments</h3>
<p>Some more care needs to be taken to not mix up the dependency tracking again:</p>
<ul>
<li>The downstream job needs to make sure that the latest downloaded artifact is really used to build its own source code. So it is a good idea to simply remove the upstream directory as the first step of the build.</li>
<li>The downloaded artifacts (as explained above the generated archive files) need to be kept after extracting them, because the downstream job also has to generate fingerprints for them (and not for the extracted files) to create a match with the fingerprints stored for the upstream job.</li>
<li>In order to enable the downstream CMake project to find the upstream project use the _DIR variable for the CMake call as defined in the CMake documentation, e.g. <code>-DA_DIR="${WORKSPACE}/upstream/A/share/A"</code></li>
<li>If your upstream project contains a version or revision number in the extracted folder (e.g. ${WORKSPACE}/upstream/A-0.35/) and you want your downstream job to be resilient against version changes in the upstream project you can use some find-magic on UNIX for automatically finding the folder:<br />
<code>A=`find "${WORKSPACE}/upstream" -maxdepth 1 -type d -name "A-*";`</code></li>
<li>If you are using <a href="http://www.freedesktop.org/wiki/Software/pkg-config" title="pkg-config">pkg-config</a> instead of or in addition to the CMake config file mechanism, you can use the <code>--define-variable</code> command line argument to achieve similar flexibility, assuming that all your absolute paths depend on a single prefix-variable in the pc file.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.semipol.de/archives/326/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gcov Coverage Reports in Jenkins</title>
		<link>http://www.semipol.de/archives/320</link>
		<comments>http://www.semipol.de/archives/320#comments</comments>
		<pubDate>Sat, 09 Apr 2011 17:47:20 +0000</pubDate>
		<dc:creator>languitar</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[CMake]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[corlab]]></category>
		<category><![CDATA[jenkins]]></category>

		<guid isPermaLink="false">http://www.semipol.de/?p=320</guid>
		<description><![CDATA[I am currently evaluating the applicability and limitations of the Jenkins continuous integration server for C++ development. Besides several limitations which are mainly caused by the complexity of C++, Jenkins provides a solid basis for continuous integration of C++ projects. One thing which I was not happy with so far was the missing integration of [...]]]></description>
			<content:encoded><![CDATA[<p>I am currently evaluating the applicability and limitations of the <a title="Jenkins" href="http://jenkins-ci.org/" target="_blank">Jenkins</a> continuous integration server for C++ development. Besides several limitations which are mainly caused by the complexity of C++, Jenkins provides a solid basis for continuous integration of C++ projects.</p>
<p>One thing which I was not happy with so far was the missing integration of open-source coverage tools for Linux. Here, <a title="gcov" href="http://gcc.gnu.org/onlinedocs/gcc/Gcov.html" target="_blank">Gcov</a> can be used to generate more or less precise coverage reports for projects compiled with GCC. Unfortunately, Gcov itself does not provide tools to export the results in any common or even nicely readable format. Until now, the only working solution I found was to use the Gcov front-end <a title="LCOV" href="http://ltp.sourceforge.net/coverage/lcov.php" target="_blank">LCOV</a> to generate a HTML report. This report is nice to read but it cannot be tracked by Jenkins with the drawback that no trend report for the code coverage can be generated. Nevertheless, I&#8217;ve wrapped the creation of such a HTML report in a CMake function and worked with it so far.</p>
<p>Today, I searched again for cheap solutions to overcome this drawback (this means without writing a custom Jenkins plugin for Gcov coverage files). While searching the net, I found the <a title="gcovr" href="https://software.sandia.gov/trac/fast/wiki/gcovr" target="_blank">gcovr</a> script, which parses Gcov result files and is able to convert them into XML files that satisfy the format generated by <a title="Cobertura" href="http://cobertura.sourceforge.net/" target="_blank">Cobertura</a>, which is a coverage tool for Java with an existing plugin for Jenkins.</p>
<p>As far as I tested it, this script works well with the Jenkins plugin, so I integrated the execution of this script in my existing coverage function for CMake, which is available in the <a title="Robotics Systems Commons" href="https://code.cor-lab.de/projects/rsc" target="_blank">RSC library</a>. This library also contains additional CMake wrappers for tools that can be used to generate trend reports in Jenkins, like <a title="cppcheck" href="http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page" target="_blank">cppcheck</a>. Now our Jenkins can also generate coverage trend reports for C++ projects.</p>
<p><a href="http://www.semipol.de/wp-content/uploads/2011/04/graph.png"><img class="aligncenter size-full wp-image-322" title="Jenkins coverage trend report" src="http://www.semipol.de/wp-content/uploads/2011/04/graph.png" alt="" width="500" height="200" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.semipol.de/archives/320/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Evauation of Default Arguments in Python</title>
		<link>http://www.semipol.de/archives/311</link>
		<comments>http://www.semipol.de/archives/311#comments</comments>
		<pubDate>Wed, 19 Jan 2011 20:55:57 +0000</pubDate>
		<dc:creator>languitar</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[corlab]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.semipol.de/?p=311</guid>
		<description><![CDATA[Today I stumbled upon a very subtle problem with default arguments in python. I noticed that loading a python module already instantiated one of my classes even though I could not find an instantiation of this class. In the end it turned out to be a default argument for a function: As I am currently [...]]]></description>
			<content:encoded><![CDATA[<p>Today I stumbled upon a very subtle problem with default arguments in python. I noticed that loading a python module already instantiated one of my classes even though I could not find an instantiation of this class. In the end it turned out to be a default argument for a function:</p>
<pre class="brush: python; title: ; notranslate">
def foo(arg=MyClass()):
    pass
</pre>
<p>As I am currently programming a lot in C++ this did not look suspicious to me. But from python&#8217;s point of view it absolutely makes sense that the default value for arg is already constructed at module load time  and <strong>not</strong> only on a call to that functions. Moreover it is important to remember that this default argument is <strong>constructed only once</strong> for all calls to a function as stated <a href="http://www.network-theory.co.uk/docs/pytut/DefaultArgumentValues.html" title="An Introduction to Python - Default Argument Values">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.semipol.de/archives/311/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boost bind and smart pointers</title>
		<link>http://www.semipol.de/archives/306</link>
		<comments>http://www.semipol.de/archives/306#comments</comments>
		<pubDate>Sun, 09 Jan 2011 16:13:38 +0000</pubDate>
		<dc:creator>languitar</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[boost]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[corlab]]></category>

		<guid isPermaLink="false">http://www.semipol.de/?p=306</guid>
		<description><![CDATA[I&#8217;ve seen this several times causing troubles: This prevents the livecycle management of shared_ptr or any other smart pointer to be effective in the thread. Hence, p may get destructed even though the thread is still active. Boost bind can handle smart pointers, so instead use the smart pointer itself as the instance argument for [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve seen this several times causing troubles:</p>
<pre class="brush: cpp; title: ; notranslate">
boost::shared_ptr&lt;Foo&gt; p(new Foo);
boost::thread t(boost::bind(&amp;Foo::method, p.get()))
</pre>
<p>This prevents the livecycle management of shared_ptr or any other smart pointer to be effective in the thread. Hence, <code>p</code> may get destructed even though the thread is still active.<br />
Boost bind can handle smart pointers, so instead use the smart pointer itself as the instance argument for bind:</p>
<pre class="brush: cpp; title: ; notranslate">
boost::thread t(boost::bind(&amp;Foo::method, p))
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.semipol.de/archives/306/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>bash: Home Directory Not Replaced With Tilde (~)</title>
		<link>http://www.semipol.de/archives/291</link>
		<comments>http://www.semipol.de/archives/291#comments</comments>
		<pubDate>Thu, 30 Dec 2010 15:45:15 +0000</pubDate>
		<dc:creator>languitar</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[corlab]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.semipol.de/?p=291</guid>
		<description><![CDATA[After switching my computers to Arch Linux, reusing the existing home directories, I had the problem that the bash did not replace the user&#8217;s home directory with the tilde character (~) in the prompt. The solutions for this problem is easy: somewhere in the bash-internals a check tests whether the output of pwd matches the [...]]]></description>
			<content:encoded><![CDATA[<p>After switching my computers to Arch Linux, reusing the existing home directories, I had the problem that the bash did not replace the user&#8217;s home directory with the tilde character (~) in the prompt. The solutions for this problem is easy: somewhere in the bash-internals a check tests whether the output of pwd matches the contents of $HOME. $HOME, in turn, is filled from the user definition in /etc/passwd. pwd always returns the current working directory without a trailing slash, but the entry for my user in /etc/passwd contained a trailing slash. Removing this slash from the file solves the problem and the prompt uses ~ again for the home directory.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.semipol.de/archives/291/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ubuntu Default Browser in Thunderbird</title>
		<link>http://www.semipol.de/archives/285</link>
		<comments>http://www.semipol.de/archives/285#comments</comments>
		<pubDate>Sat, 13 Nov 2010 18:56:29 +0000</pubDate>
		<dc:creator>languitar</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[freedesktop]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[kubuntu]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[thunderbird]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.semipol.de/?p=285</guid>
		<description><![CDATA[Since the update to Ubuntu/Kubuntu Maverick Meerkat I was a bit puzzled why Thunderbird refused to open links in mails with my default browser Firefox even though it was set in the KDE settings and registered as a protocol-handler for http and https in the Thunderbird settings. It seems that there must be another setting [...]]]></description>
			<content:encoded><![CDATA[<p>Since the update to Ubuntu/Kubuntu Maverick Meerkat I was a bit puzzled why Thunderbird refused to open links in mails with my default browser Firefox even though it was set in the KDE settings and registered as a protocol-handler for http and https in the Thunderbird settings. It seems that there must be another setting in Thunderbird to use the default browser selected for the freedesktop environment which is now used. So updating the alternatives helped in Ubuntu:<br />
<code>sudo update-alternatives --config x-www-browser</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.semipol.de/archives/285/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Menü Titanic</title>
		<link>http://www.semipol.de/archives/282</link>
		<comments>http://www.semipol.de/archives/282#comments</comments>
		<pubDate>Fri, 27 Aug 2010 10:30:55 +0000</pubDate>
		<dc:creator>languitar</dc:creator>
				<category><![CDATA[Uni]]></category>
		<category><![CDATA[Mensa]]></category>
		<category><![CDATA[Speiseplan]]></category>

		<guid isPermaLink="false">http://www.semipol.de/?p=282</guid>
		<description><![CDATA[Speiseplan gestern in der Mensa: Frühlingsröllchen, Chili-Pfeffer-Dip, Reis, Eisberg mit Möhren, Kokosquark]]></description>
			<content:encoded><![CDATA[<p>Speiseplan gestern in der Mensa:</p>
<p>Frühlingsröllchen, Chili-Pfeffer-Dip, Reis, <em>Eisberg</em> mit Möhren, Kokosquark</p>
]]></content:encoded>
			<wfw:commentRss>http://www.semipol.de/archives/282/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ignoring Warnings from System Headers</title>
		<link>http://www.semipol.de/archives/275</link>
		<comments>http://www.semipol.de/archives/275#comments</comments>
		<pubDate>Fri, 20 Aug 2010 11:43:11 +0000</pubDate>
		<dc:creator>languitar</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[CMake]]></category>
		<category><![CDATA[corlab]]></category>
		<category><![CDATA[GCC]]></category>

		<guid isPermaLink="false">http://www.semipol.de/?p=275</guid>
		<description><![CDATA[Compiling C and C++ code with the highest warning levels is a good practice and helps spotting potential errors. For GCC the flags will generate a lot of useful warning messages about unused parameters etc. Unfortunately, this is not the common practice and often the own compiler settings concerning the warning level results in dozens [...]]]></description>
			<content:encoded><![CDATA[<p>Compiling C and C++ code with the highest warning levels is a good practice and helps spotting potential errors. For GCC the flags</p>
<pre class="brush: plain; title: ; notranslate">
-Wall -Wextra
</pre>
<p>will generate a lot of useful warning messages about unused parameters etc.<br />
Unfortunately, this is not the common practice and often the own compiler settings concerning the warning level results in dozens of warnings from system headers on which the own code relies, making it impossible to spot warnings from your own code in the endless mass of console output.<br />
Fortunately, GCC has a way to ignore warnings from foreign headers. Instead of using <code>-I</code> to specify an include path, <code>-isystem</code> tells the compiler to treat the includes from the given path as system headers where no warnings should be reported.</p>
<p>If CMake is used to create the Makefile, a special argument to the <code>INCLUDE_DIRECTORIES</code> function generates these compiler flags:</p>
<pre class="brush: plain; title: ; notranslate">
INCLUDE_DIRECTORIES(SYSTEM /usr/include /and/other /system/paths)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.semipol.de/archives/275/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

