<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.inkscape.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ciradrak</id>
	<title>Inkscape Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.inkscape.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ciradrak"/>
	<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/Special:Contributions/Ciradrak"/>
	<updated>2026-04-15T22:26:13Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=User:Ciradrak&amp;diff=123278</id>
		<title>User:Ciradrak</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=User:Ciradrak&amp;diff=123278"/>
		<updated>2025-06-18T20:41:07Z</updated>

		<summary type="html">&lt;p&gt;Ciradrak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I like to use Inkscape.&lt;br /&gt;
I used it to do most of my drawings for school.&lt;br /&gt;
&lt;br /&gt;
I love the elegance of Inkscape and prefer it's node display and editing mechanism greatly over Illustrator's.  And frankly, Inkscape is now so mature that I don't really see the point of attempting to follow what any other program does.  It is now its own thing and must forge ahead to find its own path.&lt;/div&gt;</summary>
		<author><name>Ciradrak</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Developer_manual&amp;diff=61831</id>
		<title>Developer manual</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Developer_manual&amp;diff=61831"/>
		<updated>2010-05-04T05:42:50Z</updated>

		<summary type="html">&lt;p&gt;Ciradrak: garbage collection, caveats, added possible year to date, as june 7 2010 is coming...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Inkscape Developer's Manual =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
For those of you just joining us, or who have been with us but are just&lt;br /&gt;
now getting the itch to work on Inkscape, I thought I'd give some tips&lt;br /&gt;
for how to get started working in the codebase based on our own&lt;br /&gt;
experiences.&lt;br /&gt;
&lt;br /&gt;
One of the first things most people wonder is &amp;quot;what should I work on&amp;quot;.&lt;br /&gt;
As you may have already noticed, we generally don't &amp;quot;assign&amp;quot; projects.&lt;br /&gt;
We figure there's plenty more work to do than people to do it, so you&lt;br /&gt;
may as well work on something that you're either interested in or that&lt;br /&gt;
adds something of benefit to you; that's extra motivation to get your&lt;br /&gt;
own itches scratched.&lt;br /&gt;
&lt;br /&gt;
If you're really stumped though, we keep a detailed [[Roadmap]] in wiki that&lt;br /&gt;
you're welcome to browse through to look for ideas of things to work&lt;br /&gt;
on.  Tasks that do not have names beside them are open for anyone to&lt;br /&gt;
take; if you want to take ownership of a task, just put your name beside&lt;br /&gt;
it.  Feel free to add or reword tasks as needed, although try not to&lt;br /&gt;
load up the current milestone with tasks that aren't critical for the&lt;br /&gt;
release.  Feel free to work on stuff that is several milestones down the&lt;br /&gt;
road; there's rarely any problem with getting stuff done sooner than&lt;br /&gt;
planned.  ;-)&lt;br /&gt;
&lt;br /&gt;
We have a process for gaining SVN commit access.  The reason is that&lt;br /&gt;
while it is important that we keep access to the codebase open, we don't&lt;br /&gt;
want to be crazy and leave it wide open to any random passer-by.  The&lt;br /&gt;
process is that we require that the person make two contributions&lt;br /&gt;
(patches, documentation, web collateral, etc.) and then make a request&lt;br /&gt;
to get account access.&lt;br /&gt;
&lt;br /&gt;
In general you won't need SVN commit access in order to start doing&lt;br /&gt;
development, because you can work from an anonymous checkout and create&lt;br /&gt;
patches.  If you've not done this before, you'll need to learn this&lt;br /&gt;
skill first (basically see docs for `svn diff`).&lt;br /&gt;
&lt;br /&gt;
When you first start hacking on Inkscape code, I wouldn't recommend&lt;br /&gt;
taking an objective of implementing a specific feature, because you will&lt;br /&gt;
need some time to familiarize yourself with the codebase, and because&lt;br /&gt;
you won't really know what features are going to be straightforward to&lt;br /&gt;
implement and which will be highly challenging.  Of course, if you have&lt;br /&gt;
the time and love adventures, this might be a fun way to go.&lt;br /&gt;
&lt;br /&gt;
There are four approaches that I've seen people effectively use in&lt;br /&gt;
getting into the codebase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Write code documentation.  Some people who don't mind adding&lt;br /&gt;
comments to code or writing docs find it useful to just go through&lt;br /&gt;
code they're interested in working on and writing up what it does.&lt;br /&gt;
The codebase is in dire need of better docs, so this approach pays&lt;br /&gt;
dividends well into the future.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Fix bugs.  Tracing down the cause of reported bugs is an effective&lt;br /&gt;
way to gain understanding of the codebase in small chunks.  Many&lt;br /&gt;
common bugs can be traced down and fixed in a matter of hours, and&lt;br /&gt;
often will identify some bit of code in need of refactoring or&lt;br /&gt;
extension.  Note that some of our older bugs are in the system&lt;br /&gt;
because they're hard to fix, so you'll want to work on the more&lt;br /&gt;
recent ones.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Chip in on a group effort.  Occasionally we identify a major&lt;br /&gt;
refactoring effort (such as when we converted from C to C++), that&lt;br /&gt;
we encourage lots of people to help on, in the philosophy that many&lt;br /&gt;
hands makes short work.  This work tends to be pretty rote so is&lt;br /&gt;
not hard for new folks to get involved with; it just takes time.  We&lt;br /&gt;
generally have one of these kinds of efforts per release.  It&lt;br /&gt;
usually isn't glamorous work, but in aggregate moves the codebase&lt;br /&gt;
forward in a major way.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Subsystem/module work.  Some people want to get their hands in the&lt;br /&gt;
details quick, so take the approach of developing new code separate&lt;br /&gt;
from the codebase, to be integrated in later.  This generally tends&lt;br /&gt;
to take a larger time commitment than the other approaches, but can be&lt;br /&gt;
an effective approach in some circumstances.  We have a SVN module&lt;br /&gt;
called 'experimental' that you're welcome to house your work until&lt;br /&gt;
it's ready for prime time.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beyond that, you're going to find the documentation for the Inkscape&lt;br /&gt;
code is pretty scarce.  We've worked on bits and pieces but&lt;br /&gt;
unfortunately the vast majority of the code is undocumented.  On the&lt;br /&gt;
plus side, often you can implement the stuff you care about after&lt;br /&gt;
learning only a limited portion of the codebase.&lt;br /&gt;
&lt;br /&gt;
I think you'd find Inkscape an enjoyable Open Source project to work on.&lt;br /&gt;
There's a huge range of interesting and useful skills that can be&lt;br /&gt;
learned from it, plus the developers are great guys to participate with.&lt;br /&gt;
The project itself runs smoothly and puts a premium on keeping things&lt;br /&gt;
friendly and low-stress, so heated arguments are rare.  The users have&lt;br /&gt;
been great to work with and very appreciative of even small new features&lt;br /&gt;
and fixes.  Plus, since Inkscape is so visual in nature, it's very cool&lt;br /&gt;
to see how your little changes make noticeable improvements to the app&lt;br /&gt;
overall.&lt;br /&gt;
&lt;br /&gt;
== C++ Reference ==&lt;br /&gt;
* FAQ (with answers) sheet. We strongly recommend that everyone read this site comprehensively. You should not need to bookmark it, it should be the first of the sites on your autocomplete list for &amp;lt;code&amp;gt;par&amp;lt;/code&amp;gt;!&lt;br /&gt;
&lt;br /&gt;
http://www.parashift.com/c++-faq-lite/&lt;br /&gt;
&lt;br /&gt;
It is actually more in-depth than the name FAQ suggests.  Many experienced C++ programmers would benefit from it.&lt;br /&gt;
&lt;br /&gt;
* List of [http://www.cs.helsinki.fi/u/vkarvone/2004s/cplusplus/errors.html schoolboy errors]. None of these should appear in [http://en.wikipedia.org/wiki/Free/Libre/Open-Source_Software FLOSS] code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Strings ==&lt;br /&gt;
Please make sure any user-visible strings are localizable.  This requires wrapping them with &amp;quot;_(&amp;quot; and &amp;quot;)&amp;quot;, like so:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Select object&amp;quot;&lt;br /&gt;
becomes&lt;br /&gt;
 _(&amp;quot;Select object&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
In case the interpretation of the string may be ambiguous or may differ according to context, you can add a context prefix (that won't be displayed) in order to eliminate the ambiguity. &lt;br /&gt;
 &amp;quot;Ambiguous string&amp;quot;&lt;br /&gt;
can then become&lt;br /&gt;
 Q_(&amp;quot;Context|Ambiguous string&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
For more complex things, please check the gettext/localization documentation.&lt;br /&gt;
See also http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementing User Interface Changes ==&lt;br /&gt;
&lt;br /&gt;
UI improvements are enjoyable to work on because they produce visible changes in how Inkscape works.  These improvements are one of the most tangible ways to help improve how Inkscape works; thus, we strongly support new developers wishing to work in these areas.&lt;br /&gt;
&lt;br /&gt;
It is also very important to us that Inkscape presents an organized, productive, and easily discoverable interface to users, and because of this it is important that new Inkscape UI developers work to ensure changes make Inkscape's UI *more* consistent, *more* flexible, *more* cohesive, and so on.  We don't have firm rules about what can and cannot done, so as to ensure there is plenty of freedom for innovation.  However, we can outline some general principles and guidelines that are important to keep in mind:&lt;br /&gt;
&lt;br /&gt;
'''Don't please the artist - BE the artist''' - Many times UI is designed and created by programmers who &amp;quot;understand what the user wants&amp;quot;.  But in Inkscape we believe that the best requirements list is the list inside the user's head.  Requirements docs, usability studies, and so on are very indirect ways of transferring this gut-level understanding from user to programmer.  We believe the best way to ensure this information is communicated clearly is for the user to BE the programmer.  Or, alternatively, for the programmer to BECOME a user.&lt;br /&gt;
&lt;br /&gt;
This is why we so strongly encourage users to get involved in coding, and why we so strongly encourage programmers to focus on the features that are most important to them personally.  This is also why it is absolutely critical to pay close attention to what users report when using a new feature - often they can tip you off to alternate designs that achieve the same result in a better way.&lt;br /&gt;
&lt;br /&gt;
'''Eliminate limitations''' - Commercial software is often developed to fulfill feature requirement lists from a marketing department.  As such, it's common to see the feature implemented to meet the requirement exactly, and no more.  However, especially with artistic software, art is often found outside what seems reasonable.  So when putting in a new feature, avoid the temptation to limit it to what you expect people to use it for - instead generalize it and open as many parameters as possible for tweaking, and let the artist decide what is reasonable - that is their job.  &lt;br /&gt;
&lt;br /&gt;
As an example, a drawing program might want to support the features, feather and drop shadow.  Obviously, users need these important features.  Commercial software may well implement these as distinct features, each with their own UI controls.  However, these features are just special cases of the more general gaussian blur, and in Inkscape we implemented *that*.  With that in place, artists can not only do feathering and blur, but a whole variety of other effects.&lt;br /&gt;
&lt;br /&gt;
It is interesting to note that, as an open collaborative standard, SVG&lt;br /&gt;
necessarily has the same goals as Inkscape: a minimum set of&lt;br /&gt;
universal, well thought-out building blocks that can accommodate the&lt;br /&gt;
widest possible range of graphics and applications. Thus, simply by&lt;br /&gt;
following the SVG philosophy, Inkscape scores quite a few important&lt;br /&gt;
points over commercial software. Live clones, patterns that can be contain any&lt;br /&gt;
objects, layers that are essentially groups and can be easily&lt;br /&gt;
converted to/from groups - all these are examples where the underlying&lt;br /&gt;
universality of SVG directly translates into extremely valuable user&lt;br /&gt;
features.&lt;br /&gt;
&lt;br /&gt;
== Implementing New SVG Features ==&lt;br /&gt;
&lt;br /&gt;
The most important way to help Inkscape is to implement a new SVG feature in it.  Our hope is to eventually support ALL SVG features, so if you can help check one off the list, it brings us close to the nirvana of 100% SVG compliance.  :-)&lt;br /&gt;
&lt;br /&gt;
Generally we find that implementation of an SVG feature goes through three discrete stages:&lt;br /&gt;
&lt;br /&gt;
1.  Find the appropriate tags and attributes in the SVG spec&lt;br /&gt;
2.  Implement support for rendering files with these tags&lt;br /&gt;
3.  Implement support for UI controls to edit the tags&lt;br /&gt;
&lt;br /&gt;
(1) is mostly a research project.  Start by reading the SVG spec so you&lt;br /&gt;
can learn about the tag, the attributes that go with it, and so forth.&lt;br /&gt;
It is good practice to set up a page in the Wiki for storing your notes&lt;br /&gt;
as you do this process, so that in case you don't make it to steps 2 and&lt;br /&gt;
3, then maybe someone else can benefit from your research.&lt;br /&gt;
&lt;br /&gt;
(2) is the fun part.  It helps to be comfortable with Inkscape internals&lt;br /&gt;
for this part.  Depending on the feature, it may require advanced&lt;br /&gt;
knowledge of transformation, rendering, document management, and so on.&lt;br /&gt;
For this part, just hand-edit an SVG file to put the tags in that you&lt;br /&gt;
found in step #1, and keep plugging away at the code until Inkscape&lt;br /&gt;
displays things as the specification dictates.  It can help to compare&lt;br /&gt;
your work with Batik, as we use that program as our reference&lt;br /&gt;
implementation.&lt;br /&gt;
&lt;br /&gt;
(3) is the most important stage, since it is the point at which the&lt;br /&gt;
feature becomes available for users.  This step often requires knowledge&lt;br /&gt;
of Gtk+, for creating dialogs, widgets, menus, etc. for allowing the&lt;br /&gt;
user to edit the characteristics of the feature.  Be sure to listen to&lt;br /&gt;
feedback from other developers and users - especially if there are&lt;br /&gt;
different opinions.  It is hard to come up with UI that everyone can&lt;br /&gt;
agree on, but it is worth the work to achieve this - the more critique&lt;br /&gt;
your UI survives, the better loved the feature will be for future users.&lt;br /&gt;
&lt;br /&gt;
Looking through Inkscape's history, these stages are often done by different people.  If you're new to Inkscape, you may find working on stages 1 and 3 easiest, but there are many developers who can answer questions when you're ready to dig into the internals, so don't be afraid to ask questions!&lt;br /&gt;
&lt;br /&gt;
== Standards Compliance - Extension Namespaces ==&lt;br /&gt;
&lt;br /&gt;
* Only elements and attributes from our extension namespaces that ''do not affect rendering'' may be saved in SVG documents.&lt;br /&gt;
* Generally, this means that extension elements and attributes should only be used to provide UI hints.&lt;br /&gt;
* Extension elements and attributes should ''only'' be used where an existing facility provided by XML or SVG is not sufficient.&lt;br /&gt;
&lt;br /&gt;
== Global Verbs ==&lt;br /&gt;
&lt;br /&gt;
Here's a readers' digest summary of how Inkscape accelerators work:&lt;br /&gt;
&lt;br /&gt;
A global mapping between key combinations and integer verb IDs&lt;br /&gt;
(sp_verb_t) is maintained in shortcuts.cpp; these are registered using&lt;br /&gt;
sp_shortcut_set().&lt;br /&gt;
&lt;br /&gt;
Given an sp_verb_t and an SPView, you can get an SPAction which&lt;br /&gt;
represents that action in that view.  These mappings are currently&lt;br /&gt;
hard-coded in verbs.cpp.&lt;br /&gt;
&lt;br /&gt;
SPActions derive from NRActiveObject, which putatively provides a&lt;br /&gt;
&amp;quot;lightweight&amp;quot; method of doing callbacks, versus GObject signals.  I&lt;br /&gt;
don't completely understand how it works.&lt;br /&gt;
&lt;br /&gt;
SPActions also contain the label, image, etc, used for buttons and&lt;br /&gt;
menuitems.&lt;br /&gt;
&lt;br /&gt;
sp_shortcut_invoke() looks up the SPAction for a keypress and SPView and&lt;br /&gt;
invokes it automatically. SPEventContexts call it for keypresses that&lt;br /&gt;
they do not handle themselves.&lt;br /&gt;
&lt;br /&gt;
== Garbage collection ==&lt;br /&gt;
&lt;br /&gt;
As you know, many automatic garbage collectors (like libgc) only&lt;br /&gt;
free and recycle memory periodically.  This means you may have some&lt;br /&gt;
extra slush that could be freed, but hasn't yet.&lt;br /&gt;
&lt;br /&gt;
There are other forces at work, though...&lt;br /&gt;
&lt;br /&gt;
Pretty much all allocators, whether automatic or not, whether the&lt;br /&gt;
system malloc() or some custom allocator like libgc's, work the&lt;br /&gt;
same way:  they request large blocks of memory from the operating&lt;br /&gt;
system, then divvy those blocks into smaller ones internally to&lt;br /&gt;
satisfy application allocation requests.&lt;br /&gt;
&lt;br /&gt;
When an application frees memory, that memory is usually recycled&lt;br /&gt;
internally rather than returned to the OS immediately.  The reason&lt;br /&gt;
for this is that the large memory blocks acquired from the OS must&lt;br /&gt;
be completely unused before they can actually be freed.&lt;br /&gt;
&lt;br /&gt;
Let's say for example that an allocator acquires 16 8MB blocks from&lt;br /&gt;
the OS in response to 32768 4k application allocations...&lt;br /&gt;
&lt;br /&gt;
In a worst-case scenario, it's possible that the application could&lt;br /&gt;
free 32752 of those 4k blocks but the remaining 16 4k just happen&lt;br /&gt;
to be distributed across the 16 8MB blocks requested from the OS.&lt;br /&gt;
&lt;br /&gt;
If that happens, from the application's point of view it may only&lt;br /&gt;
have 64k allocated, but as far as the OS is concerned, it's still&lt;br /&gt;
using 128MB!&lt;br /&gt;
&lt;br /&gt;
Note that this applies to nearly all allocators in common use.&lt;br /&gt;
&lt;br /&gt;
While it's unusual for things to get quite that bad, memory&lt;br /&gt;
fragmentation is common enough that many popular allocators (for&lt;br /&gt;
example Perl's) simply don't bother trying to return memory to the&lt;br /&gt;
OS at all (the memory will still get forcibly reclaimed by the OS&lt;br /&gt;
when the process exits).&lt;br /&gt;
&lt;br /&gt;
[ FWIW, libgc's allocator is one of the ones that _does_ make an&lt;br /&gt;
effort to release memory to the OS, but it is limited by&lt;br /&gt;
fragmentation like any other ]&lt;br /&gt;
&lt;br /&gt;
Also note that for various reasons, the statistics you get from the&lt;br /&gt;
OS aren't going to directly reflect the amount of heap-allocated&lt;br /&gt;
memory.  Be careful drawing conclusions from only looking at e.g.&lt;br /&gt;
the output of top(1)...&lt;br /&gt;
&lt;br /&gt;
(the worst thing is that due to the modern practice of&lt;br /&gt;
overcommitting memory, the OS may literally lie to an application&lt;br /&gt;
about the amount of memory it is being given, hoping the&lt;br /&gt;
application won't really try to use it all)&lt;br /&gt;
&lt;br /&gt;
The best approach to evaluating memory usage is if you can ask the&lt;br /&gt;
allocator for information on memory usage directly, as that matches&lt;br /&gt;
the world from the point of view of the application.&lt;br /&gt;
&lt;br /&gt;
leftover gradients/markers/patterns&lt;br /&gt;
will get automatically cleaned up when the objects that use them are&lt;br /&gt;
deleted.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
&lt;br /&gt;
* this only applies to such objects created with a build of Inkscape which post-dates this commit (June 7) (2009?)&lt;br /&gt;
&lt;br /&gt;
* not all automatically-created objects will necessarily be collected; the code that creates them needs to be updated to set the correct collection policy&lt;br /&gt;
&lt;br /&gt;
* paint objects won't get collected until another editing operation takes place, since NRArenaShape currently holds onto an SPStyle for too long&lt;br /&gt;
&lt;br /&gt;
Technical details:&lt;br /&gt;
&lt;br /&gt;
Assuming its collection policy permits it, an object will be collected&lt;br /&gt;
if neither it nor its descendants have any outstanding inter-document&lt;br /&gt;
URI references (nonzero SPObject::hrefcount).&lt;br /&gt;
&lt;br /&gt;
There are two &amp;quot;policies&amp;quot; for collecting orphans:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;with-parent&amp;quot; - the object will only be collected if one of its ancestors is collected&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;always&amp;quot; - the object is always collected if unused&lt;br /&gt;
&lt;br /&gt;
(a third policy might be &amp;quot;never&amp;quot;, which would necessarily also prevent&lt;br /&gt;
that object's ancestors from ever being collected; I do not plan on&lt;br /&gt;
implementing it)&lt;br /&gt;
&lt;br /&gt;
The policy in effect is determined by the inkscape:collect attribute.&lt;br /&gt;
&lt;br /&gt;
Be careful with the &amp;quot;always&amp;quot; policy; it really only makes sense for&lt;br /&gt;
&amp;quot;private&amp;quot; objects that are indirectly created behind the scenes (e.g. by&lt;br /&gt;
selecting a fill or marker option in the GUI).&lt;br /&gt;
&lt;br /&gt;
SPDocument manages a queue of objects to collect; SPObject handles the machinery for actually queueing them when their hrefcount falls (based on policy), and performing the actual collection (delete).&lt;br /&gt;
SPDocument::collectObjects() performs a collection pass; it's currently only called from sp_document_maybe_done().&lt;br /&gt;
&lt;br /&gt;
== Inkscape Experimental SVN ==&lt;br /&gt;
&lt;br /&gt;
The 'experimental' module in Inkscape SVN is provided as a kind of &amp;quot;scratchpad&amp;quot; for &lt;br /&gt;
working up new ideas that aren't quite ready for folding into the main codebase.&lt;br /&gt;
This includes architectural sketches, examples, experimental patchsets, tools &amp;amp; utilities, or&lt;br /&gt;
whatever else strikes the developer's fancy.&lt;br /&gt;
&lt;br /&gt;
Please create a subdirectory within experimental/ for your work. You're welcome to either post&lt;br /&gt;
the stuff at the top level or create a subdirectory for yourself.  Things linked in at the top level&lt;br /&gt;
should be considered fair game for other developers to collaborate on; items posted under&lt;br /&gt;
a developer's username should be considered ask-first.  Same sort of idea as wiki.&lt;br /&gt;
&lt;br /&gt;
One of the principles behind this module is the idea of a shared working space.  Other developers&lt;br /&gt;
working in experimental can fairly easily see what others are working on in the tree, and perhaps&lt;br /&gt;
borrow or contribute ideas back and forth.   Since it is by definition not 'production' code, the &lt;br /&gt;
work may be incomplete or in a non-compileable state, and thats O-K.&lt;br /&gt;
&lt;br /&gt;
When an experiment has matured to the point of being actually useful, please move it out of&lt;br /&gt;
the experimental module to someplace more appropriate.  Or alternatively if the experimental &lt;br /&gt;
work has become obsolete or irrelevant, please remove it so we can avoid having the&lt;br /&gt;
experimental tree get too bulky.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Directory Organization ==&lt;br /&gt;
&lt;br /&gt;
=== Distribution / Packaging Files ===&lt;br /&gt;
&lt;br /&gt;
Files related to generation of distribution packages should go under inkscape/packaging, as follows:&lt;br /&gt;
                                                                                      &lt;br /&gt;
    inkscape/packaging/&lt;br /&gt;
                       common/&lt;br /&gt;
                       debian/&lt;br /&gt;
                       fedora/&lt;br /&gt;
                       fink/&lt;br /&gt;
                       mandrake/&lt;br /&gt;
                       suse/&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Share&amp;quot; Collateral ===&lt;br /&gt;
&lt;br /&gt;
A variety of items are installed in addition to the program itself, and placed into a 'share' directory structured as follows:&lt;br /&gt;
                                                                                      &lt;br /&gt;
    AUTHORS&lt;br /&gt;
    NEWS&lt;br /&gt;
    clipart/&lt;br /&gt;
    examples/&lt;br /&gt;
    extensions/&lt;br /&gt;
    fonts/&lt;br /&gt;
    gradients/&lt;br /&gt;
    icons/&lt;br /&gt;
    keyboards/&lt;br /&gt;
    markers/&lt;br /&gt;
    palettes/&lt;br /&gt;
    patterns/&lt;br /&gt;
    screens/&lt;br /&gt;
        about.svg&lt;br /&gt;
    templates/&lt;br /&gt;
    tutorials/&lt;br /&gt;
                                                                                      &lt;br /&gt;
In the SVN codebase, all of these are placed in inkscape/share/ (except AUTHORS and NEWS which will be copied to share during installation.  The idea is that in theory, this entire tree structure can be copied into place on the user's machine.  &lt;br /&gt;
&lt;br /&gt;
However, we need to provide the user some level of control over the installation.  They may wish to exclude some items, or may wish to augment the default install with some items external to the Inkscape package.  For example, they may wish to incorporate external clipart collections.  One approach would be to install symlinks in the given component directory to the external collection.  For example, if the flags package were to install into /usr/share/flags-svg/, we'd just symlink there.&lt;br /&gt;
&lt;br /&gt;
=== Code modules ===&lt;br /&gt;
Several parts of the code were written in a modular way, and they have been&lt;br /&gt;
accordingly placed in subdirectories of src/, while the main src directory&lt;br /&gt;
still contains the biggest part. To get a first overview of the modules, you&lt;br /&gt;
might want to have a look at these dependency graphs before you read deeper&lt;br /&gt;
into the source code (outside at the moment):&lt;br /&gt;
&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-debug.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-dialogs.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-display.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-io.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-libcroco.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-libnr.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-libnrtype.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-livarot.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-widgets.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-xml.svgz]&lt;br /&gt;
&lt;br /&gt;
These are not all modules! For questions about how to generate these graphs&lt;br /&gt;
with graph-includes, please [mailto:rwst@users.sf.net].&lt;br /&gt;
&lt;br /&gt;
Question on .svgz files: Is the server sending the right 'Content-Encoding:' header?&lt;br /&gt;
This matters to Mozilla browsers in standards compliance mode! http://jwatt.org/svg/authoring/#server-configuration&lt;br /&gt;
&lt;br /&gt;
= See Also =&lt;br /&gt;
* [[DirectoryReorgProposal]]&lt;br /&gt;
* [[InkscapeJanitors]]&lt;br /&gt;
* [[CompilingInkscape]]&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
[http://advogato.org/article/51.html Software Quality]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Documentation]]&lt;/div&gt;</summary>
		<author><name>Ciradrak</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=User:Ciradrak&amp;diff=61813</id>
		<title>User:Ciradrak</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=User:Ciradrak&amp;diff=61813"/>
		<updated>2010-05-02T22:23:08Z</updated>

		<summary type="html">&lt;p&gt;Ciradrak: inital brief about me&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My background is in video compression and OpenGL.  &lt;br /&gt;
I was a SodiPodi user and switched to Inkscape &lt;br /&gt;
shortly after the fork.  I have used, and continue to use Illustrator&lt;br /&gt;
and a variety of [http://dracoquies.us/cira/home/cad/cad.html CAD] systems for vector editing purposes and simply to ponder their workings.&lt;br /&gt;
Currently I use Inkscape to do most of my drawings for school.&lt;br /&gt;
&lt;br /&gt;
I have my own page about Inkscape at &lt;br /&gt;
[http://dracoquies.us/cira/comp/inkscape/inkscape.html http://dracoquies.us/cira/comp/inkscape/inkscape.html]&lt;br /&gt;
&lt;br /&gt;
I love the elegance of Inkscape and prefer it's node display and editing mechanism greatly over Illustrator's.  And frankly, Inkscape is now so mature that I don't really see the point of attempting to follow what any other program does.  It is now its own thing and must forge ahead to find its own path.&lt;/div&gt;</summary>
		<author><name>Ciradrak</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=SpecGuidesImprovement&amp;diff=61645</id>
		<title>SpecGuidesImprovement</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=SpecGuidesImprovement&amp;diff=61645"/>
		<updated>2010-04-27T15:48:52Z</updated>

		<summary type="html">&lt;p&gt;Ciradrak: idea: spacebar to duplicate guides during a drag operation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Launchpad Entry:&lt;br /&gt;
https://blueprints.launchpad.net/inkscape/+spec/guides-improvement&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
This specs provides a comprehensive way of managing guides and guidesets (which are groups of guides).&lt;br /&gt;
&lt;br /&gt;
== Release Note ==&lt;br /&gt;
== Rationale ==&lt;br /&gt;
Guides are one of the stronger workhorses of any vector editing application. Inkscape has a powerful set of options but I feel the way to manage guides is mainly focused on a per-guide basis and has lagged a bit behind the overall quality of the software. My points for this argument are:&lt;br /&gt;
* The current dialog for manually setting guides properties is not as good as it should be since it tops the main window and the user has to pop-up the guides dialog for every editing, breaking the workflow. Also, is inconsistent with the way dock tabs work (much less obstructive).&lt;br /&gt;
* The user can't change the color on a per-guide basis.&lt;br /&gt;
* This spec adds basic managing operations such as add, remove, copy, visible/invisible and lock/unlock for guides.&lt;br /&gt;
** Lock /unlock lets the user specify if the guides should be selectable along the objects or not.&lt;br /&gt;
* It also deploys a complete UI framework for fitting the current types of guides (horizontal, vertical and angled) and adding other types of guides (see [https://blueprints.launchpad.net/inkscape/+spec/composition-guides composition guides], or others to come).&lt;br /&gt;
* This spec introduces the concept of a '''Guideset''' (or just '''Set'''). This is a bunch of guides that are grouped, having common managing options (copy, delete, visible/invisible, move and rotate).&lt;br /&gt;
** If the user selects a set, all of the guides inside it are edited homogeneously.&lt;br /&gt;
** Sets allows the user to arrange his guides in a comprehensive way (specially important when there are dozens of guides on the document).&lt;br /&gt;
* Right now, for angled guides, the user can edit the angle and center of the guide numerically but not on-canvas. I try to improve this too.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
=== UI ===&lt;br /&gt;
Pretty self-explanatory...&lt;br /&gt;
&lt;br /&gt;
[[Image:Guides-mockup.png|left]]&lt;br /&gt;
&lt;br /&gt;
The guides shown inside the viewer contains from left to right: visible/invisible, ID (name), and icon for type.&lt;br /&gt;
&lt;br /&gt;
Using the drop-down menu we can select the type of composition guide:&lt;br /&gt;
&lt;br /&gt;
[[Image:Guides_selector.png]]&lt;br /&gt;
&lt;br /&gt;
=== On-canvas editing ===&lt;br /&gt;
The guides can be edited on canvas with only mouse and some key modifiers. These modifiers try to mimic the current behavior when transforming objects (the first three actions are already implemented).&lt;br /&gt;
&lt;br /&gt;
[[Image:Guide_editing_mockup.png]]&lt;br /&gt;
&lt;br /&gt;
The rotation can be snapped as any other node to grids or other guides.&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
* The IDs of the newly created guides should have more meaningful names like ''guide001'', ''guide002'', ''guide003'', etc. More appropriate would be to have the names being &amp;quot;smart&amp;quot;, i.e.: the name has some resemblance to the name of the guideset it is attached to. So if you have a guideset called ''left eye'' the guides are named ''left eye001'', ''left eye002'', etc. A guideset called ''right eye'' would have guides named ''right eye001'', ''right eye 002'', etc.&lt;br /&gt;
&lt;br /&gt;
* '''How does lock/unlock work?''':&lt;br /&gt;
** A ''locked guide'' can be moved and rotated on-canvas the same as an ''unlocked guide''. However, the ''un''locked one '''is selectable along the objects''' with the selector tool (both dragging a square and touch selection), '''and moving and rotating the object does the same for the guides'''.&lt;br /&gt;
&lt;br /&gt;
* '''Guidesets:'''&lt;br /&gt;
** This is an usage example: imagine you are working on the design of a complex drawing such as a book cover or a product label, you will end with many elements on the page: text, vector figures, lines, bitmaps... and grids, lots of grids. Till now, the guides are hard hard to tell apart when there are a lot of them. However, is quite probably that you can break them into groups so you would have '''sets''' and '''guides''' such as:&lt;br /&gt;
*** ''text guides''&lt;br /&gt;
**** ''main title''&lt;br /&gt;
**** ''subtitle''&lt;br /&gt;
**** ''name of the author''&lt;br /&gt;
*** ''barcode and copyright''&lt;br /&gt;
**** ''barcode bound1''&lt;br /&gt;
**** ''barcode bound2''&lt;br /&gt;
**** ''barcode bound3''&lt;br /&gt;
**** ''barcode bound4''&lt;br /&gt;
**** ''copyright text''&lt;br /&gt;
*** ''cover design''&lt;br /&gt;
**** ''guide1''&lt;br /&gt;
**** ''guideN''&lt;br /&gt;
&lt;br /&gt;
Thus, and using different colors, the layout of the grids should be clearer and more usable.&lt;br /&gt;
&lt;br /&gt;
=== SVG representation ===&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
I'm unsure about these ideas. Please, discuss below.&lt;br /&gt;
&lt;br /&gt;
* IDEA: Add '''snap''' option for every guide or every set, so the user is able to decide if snappable elements should snap to it or not.&lt;br /&gt;
* IDEA: Add '''attach''' option so a guide or guideset can be attached to an object, so selecting and transforming the object automatically moves and transforms the guides.&lt;br /&gt;
&lt;br /&gt;
* REMINDER: '''Lock/unlock''' feature requires guides '''to be selectable along the objects''' (which I don't think they are right now). This is aimed to future developers.&lt;br /&gt;
&lt;br /&gt;
* IDEA: Currently if a double click is done at the intersection of a guide and a path (being node edited) the guide will get the double click (0.46, 0.47). This means a user cannot use the double click to add a node to a path at the intersection of a guide and a path. My work style, and the style of some others, is to use the guide to place nodes but the guide gets the higher priority.  To me, I would rather see the guide getting a lower priority for the double click so the path being node edited will create a new node. If guides were locked would the double click be ignored by the guide and allow the path to add a node? - Lawrence&lt;br /&gt;
&lt;br /&gt;
* IDEA: Should guides be shapes on just another layer? The layer could be locked / unlocked the way other layers are currently being done. - Lawrence&lt;br /&gt;
&lt;br /&gt;
* IDEA: When dragging an object currently in Inkscape pressing the spacebar will drop a copy in the current position.  It would be great to do the same thing with guides as an easy way to create copies.&lt;/div&gt;</summary>
		<author><name>Ciradrak</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Inkscape_popularity&amp;diff=58477</id>
		<title>Inkscape popularity</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Inkscape_popularity&amp;diff=58477"/>
		<updated>2010-02-15T01:28:14Z</updated>

		<summary type="html">&lt;p&gt;Ciradrak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Idea ==&lt;br /&gt;
&lt;br /&gt;
The idea of this is mostly about helping Inkscape and other open-source apps being more popular in the professional and academic graphic design world.&lt;br /&gt;
&lt;br /&gt;
The needed is getting help from arts/design and engineering universities, associations (like http://www.icograda.org), design-related studios, offset printing companies, etc., the most worldwidely as possible.&lt;br /&gt;
&lt;br /&gt;
Getting contact from both arts/design and engineering worlds would provide us to get the best features and intensive testing (specially on the speed and accuracy we need from this kind of application)&lt;br /&gt;
&lt;br /&gt;
What also would help on Inkcape popularity is making it more visible from graphic design related magazines, like Eye (http://www.eyemagazine.com/), Communication Arts (http://www.commarts.com/), U&amp;amp;LC (http://www.uandlc.com/), Emigre (http://www.emigre.com/), [[DotDotDot]], etc.&lt;br /&gt;
&lt;br /&gt;
Comments and helps on this task is hugely welcome!&lt;br /&gt;
&lt;br /&gt;
How to attract graphic design professionals: Prioritise the UI&lt;br /&gt;
&lt;br /&gt;
* Clarity and usability. If Freehand and Illustrator do things a certain way in terms of layout or terminology then so should Inkscape - unless it is seriously sub-optimal.&lt;br /&gt;
&lt;br /&gt;
::I agree, except that Illustrator ways are indeed often suboptimal, especially in the context of Inkscape. Anyway, please make specific proposals. --bb&lt;br /&gt;
&lt;br /&gt;
* The default keyboard shortcuts should be the same as the industry leaders. Reduce clutter and look at the UI trends Adobe are pushing. They have a lot of historical baggage to accomodate which Inkscape doesn't so we can get there quicker and cleaner. Another point.&lt;br /&gt;
&lt;br /&gt;
::See my comment in your RFE on this. --bb&lt;br /&gt;
&lt;br /&gt;
As an Architecture student I use Inkscape specifically because its interface for control point editing is *better* than Illustrator's.  I would never want to see Inkscape become a 'follow the crowd' project.  We can look to programs like Illustrator, Xara, CorelDraw, and even CAD systems for inspiration; but never imitate a function wholesale unless that aspect really is perfect.  (And I can't think of one of them which is.)  I would rather see Inkscape become a leader rather than a follower.&lt;br /&gt;
&lt;br /&gt;
To make Inkscape more palatable to my fellow students I would say improve its reliability, and the performance of complex files.  Focusing on core functionality, and fixing the rough edges -- stuff that doesn't work 'out of the box' -- would also help with adoption.  (alt-keys anyone? relative links for embedded files?)  Remember that more that half of them are using OSX and the others, Windows.  Out of 200-300 students I'm the only one using Linux.&lt;br /&gt;
--[[User:Ciradrak|Ciradrak]] 01:28, 15 February 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
(I'll eventually edit this rant and move it to a more appropriate place.)&lt;br /&gt;
&lt;br /&gt;
::*Tutorial videos?&lt;br /&gt;
::*Get Inkscape used for some major/important public art and publicise this?&lt;br /&gt;
::*Prioritise the text editing tools so that they are more conducive to newbies who have been coaxed into straying from Microsoft Word's wonderful :( poster-making abilities. It needs to be easier to have different styles within one block of text; surely this is possible with css stylesheets in svg? I wish I had the coding ability to start implementing this. [[User:Legio noctis|Legio noctis]] 20:13, 12 January 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
== others ==&lt;br /&gt;
&lt;br /&gt;
[[http://www.google.pt/trends?q=inkscape%2Cxara&amp;amp;ctab=0&amp;amp;geo=all&amp;amp;date=all&amp;amp;sort=2 Google Trends to Inkscape and Xara]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Discussion]]&lt;/div&gt;</summary>
		<author><name>Ciradrak</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=CompilingMacOsX&amp;diff=53901</id>
		<title>CompilingMacOsX</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=CompilingMacOsX&amp;diff=53901"/>
		<updated>2009-09-25T03:34:23Z</updated>

		<summary type="html">&lt;p&gt;Ciradrak: /* Installing dependencies */ added purpose of cairo extension&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= For the impatient =&lt;br /&gt;
&lt;br /&gt;
1. Install [http://developer.apple.com/tools/xcode/ XCode tools] from your OS X installation DVD&lt;br /&gt;
&lt;br /&gt;
2. Download and install [http://www.macports.org/ MacPorts]&lt;br /&gt;
&lt;br /&gt;
3. In Terminal (Applications&amp;gt;Utilities&amp;gt;Terminal) type&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo port sync&lt;br /&gt;
sudo port selfupdate&lt;br /&gt;
sudo port install cairo boehmgc gtkmm gtk-engines2 intltool libxslt lcms popt poppler boost \ &lt;br /&gt;
 gnome-vfs libgnomeprintui automake autoconf subversion&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: subversion is pre-installed on Leopard, so you may be fine leaving subversion out of the port install command chain.&lt;br /&gt;
&lt;br /&gt;
Grab a cup of coffee&lt;br /&gt;
&lt;br /&gt;
4. In Terminal, get and build Inkscape&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
svn co https://inkscape.svn.sourceforge.net/svnroot/inkscape/inkscape/trunk inkscape&lt;br /&gt;
cd inkscape/packaging/macosx/&lt;br /&gt;
./osx-build.sh a c b i -s p&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Et voilà''. If you want to understand what you just did, read on.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
To compile Inkscape from source you need:&lt;br /&gt;
*Mac OS X &amp;gt; 10.3&lt;br /&gt;
*XCode Tools. They are on your installation DVD, in the optional installs, or can be download from [http://developer.apple.com/tools/xcode/ Apple Developer Connection]. You can customize the install to make it smaller (avoir documentation and example software for example). You need at least: gcc, XCode, X11SDK.&lt;br /&gt;
*Inkscape's source code. You can download an [http://www.inkscape.org/download.php official release source code], a [http://inkscape.modevia.com/svn-snap/?M=D development snapshot] or checkout a copy of the current state of the [http://www.inkscape.org/svn.php?lang=en SVN repository] using [http://subversion.tigris.org/ subversion]. Subversion comes pre-installed on Leopard. On previous system, subversion can be installed by package management systems (see point below) or with an OS X installer [http://homepage.mac.com/martinott/ package]&lt;br /&gt;
*A means of getting Inkscape's numerous dependencies: glibmm, gtkmm, lmcs, boehmgc... We recommend the use of [http://www.macports.org/ MacPorts] right now. ([http://www.finkproject.org/ Fink] was used in the past but it no longer meets Inkscape's needs currently.)&lt;br /&gt;
&lt;br /&gt;
= Compiling Inkscape with X11, using MacPorts [Recommended method]=&lt;br /&gt;
&lt;br /&gt;
== Installing dependencies ==&lt;br /&gt;
You can use MacPorts to list Inkscape dependencies:&lt;br /&gt;
&amp;lt;pre&amp;gt;port deps inkscape&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some are mandatory and you can install them with the command:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo port install boehmgc gtkmm gtk-engines2 intltool libxslt lcms popt boost gsl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Others provide additional functionality to Inkscape:&lt;br /&gt;
* &amp;lt;code&amp;gt;gnome-vfs&amp;lt;/code&amp;gt; : access to remote servers, in particular import from Open Clipart Library&lt;br /&gt;
* &amp;lt;code&amp;gt;aspell&amp;lt;/code&amp;gt; : check spelling of text elements [Note: I have never seen it working on OS X, though at least it should install fine]&lt;br /&gt;
* &amp;lt;code&amp;gt;libgnomeprintui&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;loudmouth&amp;lt;/code&amp;gt; : jabber library used by InkBoard&lt;br /&gt;
* &amp;lt;code&amp;gt;cairo&amp;lt;/code&amp;gt; : ps and pdf export&lt;br /&gt;
* &amp;lt;code&amp;gt;poppler&amp;lt;/code&amp;gt; : better pdf import&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo port install gnome-vfs aspell libgnomeprintui loudmouth cairo poppler&amp;lt;/pre&amp;gt;&lt;br /&gt;
NB: Cairo was already installed at previous step as a GTK dependency. You need to either deactivate the old version and install this one, or directly write it on the command line above. &lt;br /&gt;
If you're unsure about MacPorts commands, you can find a guide that is easy to skim here: [http://guide.macports.org/ MacPorts Guide]&lt;br /&gt;
&lt;br /&gt;
In addition, Inkscape requires versions of the autotools more recent thant those that ship with OS X. Install them:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo port install autoconf automake&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More recent (Sep 2008) pre-packaged nightly builds for Mac OS X also feature additional dependencies:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo port install librsvg libwpd libwpg libcroco&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NB: At the time of editing (2008-12-01) there was a problem fetching &amp;quot;lzmautils&amp;quot; as the URL MacPorts tried to use as download source dies in a timeout. &lt;br /&gt;
As this package is needed as a dependency for one or more packages noted above you need to download the source tarball of lzmautils from somewhere else (for example, from [ftp://sunfreeware.mirrors.tds.net/pub/sunfreeware/SOURCES/lzma-4.32.7.tar.gz here]) and put that into the local MacPorts repository at &amp;quot;/opt/local/var/macports/distfiles/lzmautils&amp;quot;. You should now be able to run the commands above.&lt;br /&gt;
&lt;br /&gt;
Also make sure that you have &amp;quot;libxml2&amp;quot; and &amp;quot;libxslt&amp;quot; installed with MacPorts. This should have been installed previously, either directly or as a dependency.&lt;br /&gt;
You will need those later to compile the &amp;quot;lxml&amp;quot; Python module if you want to use Python effects. First check what's installed and if they are missing from your MacPorts repository install them by doing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;port installed&lt;br /&gt;
sudo port install libxml2 libxslt&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pre-compiling the Python modules  ==&lt;br /&gt;
&lt;br /&gt;
If you cannot use the pre-built Python modules from [http://inkscape.modevia.com/macosx-snap/?C=M;O=D Modevia], say, because you're using an unsupported Python version or you just want to install from source you need to pre-compile both modules.&lt;br /&gt;
&lt;br /&gt;
In case you are using a Python version installed through MacPorts do a search for both modules and install the ones suitable for the Python version activated within MacPorts.&lt;br /&gt;
&amp;lt;pre&amp;gt;port search lxml numpy&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using Leopard's default Python 2.5.1 installation or a more recent one (e.g. MacPython 2.6) you will need to compile both modules outside of MacPorts. Download both modules from [http://pypi.python.org PyPI] if they are available there for your Python version. At the time of editing (2008-12-01) both modules were only available through SVN for Python 2.6.&lt;br /&gt;
&lt;br /&gt;
There are lots of tutorials for building and installing the &amp;quot;numpy&amp;quot; module. One good place to start looking is the [[GettingEffectsWorking#on_Mac_OS_X|Getting Effects Working]] entry referenced at the end of this guide. &lt;br /&gt;
&lt;br /&gt;
Building the &amp;quot;lxml&amp;quot; module deviates a little from the standard way, so if you cannot install it try the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd /path/to/lxml/source&lt;br /&gt;
sudo python setup.py install \&lt;br /&gt;
--with-xslt-config=/opt/local/bin/xslt-config \&lt;br /&gt;
--with-xml2-config=/opt/local/bin/xml2-config&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This tells it to use the libxml2 and libxslt packages we installed earlier with MacPorts instead of Mac OS X' default versions, which have been known to cause problems when trying to build &amp;quot;lxml&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you are compiling the Python modules outside of MacPorts you will need to make a mental note for after running the .app-bundle building script (detailed [[CompilingMacOsX#Creating_an_.app_bundle|later]] in this guide) to copy the &amp;quot;lxml&amp;quot; and &amp;quot;numpy&amp;quot; dirs from the standard installation destination (by default &amp;quot;/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages&amp;quot; for MacPython 2.6 and &amp;quot;/Library/Python/2.5/site-packages/&amp;quot; for Leopard's default Python 2.5.1 installation) to either&lt;br /&gt;
* the &amp;quot;extensions&amp;quot; folder inside the Inkscape.app bundle (&amp;quot;Inkscape.app/Contents/Resources/extensions&amp;quot;) if all you care about is getting the Inkscape build to work with your Python version. This method is more foolproof but supports only one Python version.&lt;br /&gt;
* the &amp;quot;site-packages&amp;quot; folder inside the Inkspace.app bundle. The &amp;quot;site-packages&amp;quot; folder is the right place for putting your pre-compiled Python modules if you want to redistribute your build. Make a subfolder within &amp;quot;site-packages&amp;quot; with the name of your arch (&amp;quot;i386&amp;quot; for Intel, &amp;quot;PPC&amp;quot; for PowerPC or type &amp;lt;code&amp;gt;arch&amp;lt;/code&amp;gt; into a Terminal window) and another subfolder within the arch folder with the name of your Python version (e.g. &amp;quot;2.5&amp;quot; or &amp;quot;2.6&amp;quot; etc.). This allows you to include support for multiple Python versions with your Inkscape build. Note, however, that if someone has multiple Python versions installed they may run into problems with the PATH order exported by the internal script (&amp;quot;Inkspace.app/Contents/Resources/bin/inkscape&amp;quot;) responsible for preparing the Inkscape launch environment. &lt;br /&gt;
&lt;br /&gt;
Armed with this knowledge you should be able to take care of the &amp;quot;...needs the fantastic libxml2 wrapper...&amp;quot; message when executing Python effects. Normally the &amp;lt;code&amp;gt;osx-app.sh&amp;lt;/code&amp;gt; script (detailed [[CompilingMacOsX#Creating_an_.app_bundle|later]])  should take care of this for you, but if for whatever reason it didn't you know how to copy the modules manually.&lt;br /&gt;
&lt;br /&gt;
For further info refer to the [[GettingEffectsWorking#on_Mac_OS_X|Getting Effects Working]] section of this wiki.&lt;br /&gt;
&lt;br /&gt;
== Setting the build environment ==&lt;br /&gt;
MacPorts's hierarchy (/opt/local/) is not searched for libraries by default. Therefore, before the configuration starts, some environment variables need to be set. The environment variables are presented in bash syntax here. &lt;br /&gt;
&amp;lt;pre&amp;gt;export LIBPREFIX=&amp;quot;/opt/local&amp;quot;&lt;br /&gt;
#  automake seach path&lt;br /&gt;
export CPATH=&amp;quot;$LIBPREFIX/include&amp;quot;&lt;br /&gt;
#  configure search path&lt;br /&gt;
export CPPFLAGS=&amp;quot;-I$LIBPREFIX/include&amp;quot;&lt;br /&gt;
export LDFLAGS=&amp;quot;-L$LIBPREFIX/lib&amp;quot;&lt;br /&gt;
#  compiler arguments&lt;br /&gt;
export CFLAGS=&amp;quot;-O3 -Wall&amp;quot;&lt;br /&gt;
export CXXFLAGS=&amp;quot;$CFLAGS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also use &amp;lt;code&amp;gt;[http://en.wikipedia.org/wiki/Ccache ccache]&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;sudo port install ccache&amp;lt;/code&amp;gt;) to speed up the compilation a bit. To do so, add compiler variables:&lt;br /&gt;
&amp;lt;pre&amp;gt;export CC=&amp;quot;ccache gcc&amp;quot;&lt;br /&gt;
export CXX=&amp;quot;ccache g++&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuring ==&lt;br /&gt;
If you compile Inkscape for the first time from an svn checkout you need to generate the configure script. Navigate to Inkscape's source directory and run:&lt;br /&gt;
&amp;lt;pre&amp;gt;./autogen.sh&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then run configure with the options &amp;lt;code&amp;gt;--disable-static --enable-shared&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;--prefix&amp;lt;/code&amp;gt; which sets the directory where the build products are placed. It must be somewhere you have write access to.&lt;br /&gt;
&amp;lt;pre&amp;gt;./configure --disable-static --enable-shared --prefix=/path/to/build/products/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to package Inkscape into a double-clickable &amp;lt;code&amp;gt;.app&amp;lt;/code&amp;gt; bundle in order to access it like a regular OS X application (you probably want to), you need to add the option &amp;lt;code&amp;gt;--enable-osxapp&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;./configure {...} --enable-osxapp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have loudmouth installed and you want to enable whiteboard functionality in Inkscape, add &amp;lt;code&amp;gt;--enable-inkboard&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Other configuration options can be set, check the list of options by issuing:&lt;br /&gt;
&amp;lt;pre&amp;gt;./configure --help&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example which covers most options that can be set:&lt;br /&gt;
&amp;lt;pre&amp;gt;./configure --disable-static --enable-shared --prefix=/path/to/build/products/ --with-xft \&lt;br /&gt;
--with-gnome-vfs --with-python=/path/to/python/modules --enable-osxapp --enable-lcms \&lt;br /&gt;
--enable-poppler-cairo --enable-inkboard&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building and Installing ==&lt;br /&gt;
Just run:&lt;br /&gt;
&amp;lt;pre&amp;gt;make&lt;br /&gt;
make install&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creating an .app bundle ==&lt;br /&gt;
Assuming that you have used the &amp;lt;code&amp;gt;--enable-osxapp&amp;lt;/code&amp;gt; option during &amp;lt;code&amp;gt;configure&amp;lt;/code&amp;gt;, navigate to Mac OS X packaging directory in Inkscape source code and use the automated script:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd packaging/macosx&lt;br /&gt;
./osx-app.sh -s -b /path/to/install/prefix/bin/inkscape -p ../../Info.plist&amp;lt;/pre&amp;gt;&lt;br /&gt;
The script copies Inkscape binary and all its dependencies into the app bundle. The &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; options strips libraries from debugging information (the bundle is therefore smaller). Omit this option if you want to keep debugging info.&lt;br /&gt;
&lt;br /&gt;
== Creating a disk image to distribute Inkscape ==&lt;br /&gt;
Inkscape.app created at the previous step is completely independent from the original location of MacPorts libraries and can therefore be distributed. It will only work on your platform though (PPC or Intel) and incompatibilities are known between X11 versions on different major versions of OS X (Panther, Tiger and Leopard). The general rule is that versions are not backward compatible.&lt;br /&gt;
&lt;br /&gt;
The most widespread way of distributing applications on Mac OS X is via .dmg images. You can created a dmg image of Inkscape, with a nice background and all, using the script:&lt;br /&gt;
&amp;lt;pre&amp;gt;./osx-dmg.sh -p Inkscape.app&amp;lt;/pre&amp;gt;&lt;br /&gt;
in the packaging directory for Mac OS X (where your app bundle should be, otherwise modify the path to Inkscape.app).&lt;br /&gt;
&lt;br /&gt;
== Automated build script ==&lt;br /&gt;
All essential steps are automated by a build script: &amp;lt;code&amp;gt;osx-build.sh&amp;lt;/code&amp;gt;. It has built-in help so to know how to use it just type:&lt;br /&gt;
&amp;lt;pre&amp;gt;./osx-build.sh help&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NB: Excluded steps involve Pre-compiliation of the Python modules and installing the additional nightly build features.&lt;br /&gt;
&lt;br /&gt;
= Compiling a Universal Binary of Inkscape with X11, using MacPorts=&lt;br /&gt;
&lt;br /&gt;
These instructions should work on both 10.4 and 10.5 machines with the latest Xcode version installed.&lt;br /&gt;
&lt;br /&gt;
== Build Universal dependencies ==&lt;br /&gt;
&lt;br /&gt;
The easiest way to do this is to create a new Macports installation. It is recommended that you install macports from source into a long prefix (of 50 character) such as &amp;quot;/opt/local-macports-with-a-really-long-directory-name/&amp;quot; -- this will allow enough space to later perform path rewriting on all the bundled libraries.  &lt;br /&gt;
&lt;br /&gt;
Once you have installed Macports, edit the $PREFIX/etc/macports/variants.conf file to have the following line: &lt;br /&gt;
&amp;lt;pre&amp;gt;+universal&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will cause Macports to install the Universal variant of each package you later ask it to install.&lt;br /&gt;
&lt;br /&gt;
If you already have non-universal versions of some ports installed, for each of these you may need to deactivate the port and rebuild it, e.g.&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo port -f uninstall cairo&lt;br /&gt;
sudo port clean cairo&lt;br /&gt;
sudo port -v install cairo +universal&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build Universal Inkscape ==&lt;br /&gt;
&lt;br /&gt;
First, Set your SDK, 10.5 for Leopard, 10.4u for TIger:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;CODE&amp;gt;export SDK=/Developer/SDKs/MacOSX10.5.sdk&amp;lt;/code&amp;gt;  &amp;amp;nbsp; &amp;amp;nbsp; (For Leopard)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;CODE&amp;gt;export SDK=/Developer/SDKs/MacOSX10.4u.sdk&amp;lt;/code&amp;gt;  &amp;amp;nbsp; &amp;amp;nbsp;  (For Tiger)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, set up your environment to point to the Macports libraries:&lt;br /&gt;
&amp;lt;pre&amp;gt;export MACPORTS=&amp;quot;/opt/local&amp;quot;&lt;br /&gt;
export PATH=$MACPORTS/bin:$MACPORTS/sbin:/usr/X11R6/bin:/bin:/sbin:/usr/bin:/usr/local/bin:/usr/sbin&lt;br /&gt;
#  automake seach path&lt;br /&gt;
export CPATH=&amp;quot;$MACPORTS/include&amp;quot;&lt;br /&gt;
#  configure search path&lt;br /&gt;
export CPPFLAGS=&amp;quot;-I$MACPORTS/include&amp;quot;&lt;br /&gt;
export LDFLAGS=&amp;quot;-L$MACPORTS/lib&amp;quot;&lt;br /&gt;
#  compiler arguments&lt;br /&gt;
export CFLAGS=&amp;quot;-O3 -Wall -isysroot $SDK -arch ppc -arch i386&amp;quot;&lt;br /&gt;
export CXXFLAGS=&amp;quot;$CFLAGS&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The final step is to configure and compile Inkscape.  Inkscape must be configured with the following options:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-osxapp&amp;lt;/code&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp;   Sets the correct path for Inkscape to be used from an .app bundle&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-dependency-tracking&amp;lt;/code&amp;gt;  &amp;amp;nbsp; &amp;amp;nbsp; Dependency tracking can't be used when compiling universal binaries.&lt;br /&gt;
&lt;br /&gt;
Inkscape can then be built (with make), installed, and packaged into a Universal .app bundle using the standard .app bundle building instruction above.&lt;br /&gt;
&lt;br /&gt;
= Compiling Inkscape with native GTK using MacPorts [experimental] =&lt;br /&gt;
This process is very similar to compiling an X11 version of Inkscape except for the building of dependencies: need to build native versions of Inkscape dependencies. At the moment (2007-12-17) this process does not produce a usable version of Inkscape but the more people try to use it, the quicker the bugs will be ironed out!&lt;br /&gt;
&lt;br /&gt;
== Native version of Inkscape dependencies ==&lt;br /&gt;
Thanks to the power of port &amp;quot;variants&amp;quot; and port &amp;quot;deactivation&amp;quot; you can install native versions of gtk, cairo, pango and such, alongside the regular X11 ones. To know which ports have a &amp;lt;code&amp;gt;quartz&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;no_x11&amp;lt;/code&amp;gt; variant, use the command:&lt;br /&gt;
&amp;lt;pre&amp;gt;port list variant:quartz variant:no_x11&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will give you an idea of what need to be replaced.&lt;br /&gt;
&lt;br /&gt;
Assuming your MacPorts tree has been already used to build regular versions of Inkscape, you first need to deactivate (suppress from the tree without really uninstalling) the X11 versions of gtk, cairo, cairomm and pango:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo port deactivate gtk2 cairo cairomm pango&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then install native variants:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo port install cairo +quartz+no_x11 cairomm pango +no_x11 poppler +quartz gtk2 +quartz&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing a second Macports tree (recommended approach) ==&lt;br /&gt;
Rather than deactivating and reactivating ports, you can also keep two MacPorts trees side by side, provided you install the second one from source. Let say I want to install a new tree for native versions in /opt/local/native, I would do&lt;br /&gt;
&amp;lt;pre&amp;gt;export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin&lt;br /&gt;
cd ~/MacPorts-1.x.x/&lt;br /&gt;
./configure --prefix=/opt/local-native --with-tclpackage=/Library/Tcl/macports-native&lt;br /&gt;
make&lt;br /&gt;
sudo make install&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can set this second tree up to always build packages with specific variants.  For example, you can edit the /opt/local-native/etc/macports/variants.conf file to have the following line:&lt;br /&gt;
&amp;lt;pre&amp;gt;+universal +no_x11 +quartz&amp;lt;/pre&amp;gt;&lt;br /&gt;
You can remove the +universal if you only want to build inkscape for your host architecture.&lt;br /&gt;
You may also need to set alternate applications_dir and  frameworks_dir variables in the /opt/local-native/etc/macports/macports.conf file so that applications and frameworks install by this macports (for example by python) don't clash with your standard  macports tree.&lt;br /&gt;
&lt;br /&gt;
Then you need to have only one version of the port command in the path at any time so you need to setup your .bashrc (or .bash_profile or .profile) accordingly. I use shell aliases to quickly and temporarily switch to the universal version:&lt;br /&gt;
&amp;lt;pre&amp;gt;alias portpathregular=&amp;quot;export PATH=/opt/local/bin:/opt/local/sbin:/Developer/Tools:/usr/local/bin: \&lt;br /&gt;
/usr/X11R6/bin:/bin:/sbin:/usr/bin:/usr/sbin&amp;quot;&lt;br /&gt;
alias portpathnative=&amp;quot;export PATH=/opt/local-native/bin:/opt/local-native/sbin:/Developer/Tools:/usr/local/bin:  \&lt;br /&gt;
/usr/X11R6/bin:/bin:/sbin:/usr/bin:/usr/sbin&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NB: the \ are just to mark line continuation here, suppress them and put everything in one line.&lt;br /&gt;
&lt;br /&gt;
== Install the rest ==&lt;br /&gt;
Eventually, follow the regular install procedure for the rest:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo port install libxslt boost boehmgc gtkmm lcms intltool popt&amp;lt;/pre&amp;gt;&lt;br /&gt;
If your MacPorts tree was already ready to compile Inkscape, you should not need to reinstall anything, with the possible exception of gtkmm, which may need to be rebuilt against the native version of gtk rather than against the X11 one (please someone confirm this).&lt;br /&gt;
&lt;br /&gt;
Get inkscape source code and go in the mac OS X specific packaging directory&lt;br /&gt;
&amp;lt;pre&amp;gt;cd packaging/macosx&amp;lt;/pre&amp;gt;&lt;br /&gt;
There edit &amp;lt;code&amp;gt;osx-build.sh&amp;lt;/code&amp;gt; to remove the configure option &amp;lt;code&amp;gt;--enable-osxapp&amp;lt;/code&amp;gt; because it puts inkscape in a .app bundle where it is started together with X11, which would defeat the purpose of this native compilation. You can also specify an alternative install prefix if you want. Then&lt;br /&gt;
&amp;lt;pre&amp;gt;./osx-build.sh u a c b i&amp;lt;/pre&amp;gt;&lt;br /&gt;
and a native version of Inkscape is installed in the prefix you specified or in the &amp;lt;code&amp;gt;Build/bin&amp;lt;/code&amp;gt; directory of Inkscape's source code. You can test it by&lt;br /&gt;
&amp;lt;pre&amp;gt; cd ../../Build/bin/&lt;br /&gt;
./inkscape&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NB: if you compiled a GTK theme engine against your old GTK install (i.e. the one with X11) and try to use it with the new install, it will complain, so edit &amp;lt;code&amp;gt;~/.gtkrc-2.0&amp;lt;/code&amp;gt; to remove the offending theme or recompile it with the new native GTK.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Enabling python effects =&lt;br /&gt;
moved to [[GettingEffectsWorking]]. They should work out of the box in the new versions anyway.&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
== User Examples ==&lt;br /&gt;
* Adam Strzeleki has outlined some improvements to this process on the Inkscape [http://www.nabble.com/Inkscape-native-Mac-OS-X-build---look-improvements-td14733036.html email list]. See his screenshot from January 10, 2008 [http://www.nabble.com/attachment/14733036/1/Inkscape%20OSX%20PL.gif here].&lt;br /&gt;
* JiHO has a video of his builds [http://jo.irisson.free.fr/?p=34 here] and [http://jo.irisson.free.fr/?p=62 here].&lt;br /&gt;
&lt;br /&gt;
== Apple Documentation ==&lt;br /&gt;
* [http://developer.apple.com/documentation/MacOSX/Conceptual/BPRuntimeConfig/BPRuntimeConfig.html Introduction to Runtime Configuration] Covers the Info.plist files, Preferences, Environment variables and has a list of the most important Properties that the Property List should contain.&lt;br /&gt;
&lt;br /&gt;
== Packaging ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.sveinbjorn.org/platypus Sveinbjorn Thordarson's Website] The author of Platypus, the Script Exec wrapper that launches the Inkscape binary.&lt;br /&gt;
* [http://freespace.ausgamers.com/2005/02/creating-os-x-application-bundles-step.html  Creating OS X application bundles step by step] Covers the bundle concepts, copying libraries into the bundle, editing libraries with the install_name_tool, the Info.plist file and adding an icon.&lt;br /&gt;
* [http://java.sun.com/developer/technicalArticles/JavaLP/JavaToMac3/ Bringing your Java Application to Mac OS X] I would regard this a little dated, and the detail is (unsurprisingly) Java-related, but it is a gentle introduction to the role of the .app bundle and give a most clear account of how to create one.&lt;br /&gt;
* The [http://gimp-app.sourceforge.net/gimp.app.howto.txt Gimp .app Howto] This is a very bare document, and would be of little help to you if you were new to making packages. Note that it seems to refer to a more mature Clipboard technique and Online help than we currently have; and we ought to move to parity in these areas.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Documentation]]&lt;/div&gt;</summary>
		<author><name>Ciradrak</name></author>
	</entry>
</feed>