[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r942 - GNUnet-docs/WWW/test
From: |
durner |
Subject: |
[GNUnet-SVN] r942 - GNUnet-docs/WWW/test |
Date: |
Tue, 14 Jun 2005 13:12:36 -0700 (PDT) |
Author: durner
Date: 2005-06-14 13:12:29 -0700 (Tue, 14 Jun 2005)
New Revision: 942
Modified:
GNUnet-docs/WWW/test/hacking.php3
GNUnet-docs/WWW/test/hacking_application.php3
GNUnet-docs/WWW/test/hacking_future.php3
GNUnet-docs/WWW/test/hacking_organization.php3
GNUnet-docs/WWW/test/hacking_rpc.php3
GNUnet-docs/WWW/test/hacking_testcases.php3
GNUnet-docs/WWW/test/hacking_threading.php3
GNUnet-docs/WWW/test/hacking_util.php3
GNUnet-docs/WWW/test/hacking_win32_build.php3
Log:
Reformat
Modified: GNUnet-docs/WWW/test/hacking.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking.php3 2005-06-14 19:50:58 UTC (rev 941)
+++ GNUnet-docs/WWW/test/hacking.php3 2005-06-14 20:12:29 UTC (rev 942)
@@ -8,49 +8,50 @@
HR();
ANCHOR("design");H3("System Design");
+BP();
W("This section is intented to be an introduction to programmers that want to
extend the framework.");
W("GNUnet has a layered design.");
W("The basic goal for the layering is this:");
+EP();
img("gnunet-design.png", "GNUnet layering", "CENTER", 401, 421, 0, 10, 10);
-P();
?>
-<table border=5>
+<table border="0" cellspacing="0" cellpadding="0">
<tr>
-<th><?php W("Layer"); ?></th>
-<th><?php W("Example"); ?></th>
-<th><?php W("code in"); ?></th>
+<th class="tbl"><?php W("Layer"); ?></th>
+<th class="tbl"><?php W("Example"); ?></th>
+<th class="tbl"><?php W("code in"); ?></th>
<tr>
-<th><?php W("User Interface(s)"); ?></th>
-<td><?php W("gnunet-search"); ?></td>
-<td>applications/fs/tools/</td>
+<th class="tbl"><?php W("User Interface(s)"); ?></th>
+<td class="tbl"><?php W("gnunet-search"); ?></td>
+<td class="tbl">applications/fs/tools/</td>
</tr>
<tr>
-<th><?php W("Application Logic"); ?></th>
-<td><?php W("file sharing"); echo ", "; W("statistics"); ?></td>
-<td>applications/fs/module/, applications/stats/</td>
+<th class="tbl"><?php W("Application Logic"); ?></th>
+<td class="tbl"><?php W("file sharing"); echo ", "; W("statistics"); ?></td>
+<td class="tbl">applications/fs/module/, applications/stats/</td>
</tr>
<tr>
-<th><?php W("Core"); ?></th>
-<td><?php W("gnunetd"); ?></td>
-<td>server/</td>
+<th class="tbl"><?php W("Core"); ?></th>
+<td class="tbl"><?php W("gnunetd"); ?></td>
+<td class="tbl">server/</td>
</tr>
<tr>
-<th><?php W("Transport"); ?></th>
-<td><?php W("UDP"); echo " "; W("TCP"); ?></td>
-<td>transports/</td>
+<th class="tbl"><?php W("Transport"); ?></th>
+<td class="tbl"><?php W("UDP"); echo " "; W("TCP"); ?></td>
+<td class="tbl">transports/</td>
</tr>
</table>
-<br clear=all>
<?php
-P();
+BP();
W("The GNUnet core is structured into a complex set of smaller modules.");
W("These modules are responsible for specific aspects of the system, like
sessionkey exchange, peer advertisements, topology management or the
transports.");
W("The following picture illustrates the dependencies between these
fundamental modules in the GNUnet core:");
-P();
+EP();
img("overview.png", "GNUnet Core Overview", "CENTER", 746, 598, 0, 10, 10);
-P();
+BP();
W("The responsibilities of the individual modules are split as follows:");
+EP();
echo "<dl>";
DT("identity");
DD("Keeping track of known peers, how much we trust them and what their
current addresses are");
@@ -71,8 +72,9 @@
DT("core");
DD("Loading of modules, registering of handlers, event loops.");
echo "</dl>";
-P();
+BP();
W("The following sections describe various aspects of the GNUnet code in more
detail:");
+EP();
include("hacking_index.inc");
include("html_footer.php3");
Modified: GNUnet-docs/WWW/test/hacking_application.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_application.php3 2005-06-14 19:50:58 UTC
(rev 941)
+++ GNUnet-docs/WWW/test/hacking_application.php3 2005-06-14 20:12:29 UTC
(rev 942)
@@ -5,12 +5,14 @@
include("html_header.php3");
H4("How do I write a new application service for GNUnet?");
+BP();
W("The directory %s contains the minimal piece of code that you will need to
start.",
extlink_("doxygen/html/template_8c-source.html","src/applications/template/"));
W("You may also want to look at %s for a simple working example.",
extlink_("doxygen/html/chat_8c-source.html","src/applications/chat/"));
-BR();
+P();
W("Most simple applications will consist of two pieces of code:");
+EP();
echo "<ol><li>";
W("The first is a dynamic library that plugs into the GNUnet core.");
W("This library must provide a single function which is invoked by the core
when <tt>gnunetd</tt> starts.");
@@ -32,15 +34,17 @@
W("While any IPC mechanism should theoretically work, the preferred way that
is used by all existing GNUnet applications is using %s, a simple TCP
connection that communicates with the %s.",
ARRAY(extlink_("doxygen/html/tcpio_8c.html","tcpio"),
extlink_("doxygen/html/tcpserver_8c-source.html","tcpserver")));
-P();
+BR();
W("The simplest way for a user interface to connect to the GNUnet core via TCP
is to use the helper methods defined %s as part of the gnunet-util library; the
library defines methods for %s and getting a client socket that is connected to
<tt>gnunetd</tt>.",
ARRAY(extlink_("doxygen/html/port_8c-source.html","port.c"),
extlink_("doxygen/html/printhelp_8c-source.html","parsing the command
line options")));
echo "</li></ol>";
-P();
+
ANCHOR("portability");H4("Portability");
+BP();
W("The official GNUnet source maintained by the GNUnet developers supports the
platforms listed on the downloads page.");
W("These ports require some guidelines to be obeyed:");
+EP();
echo "<ul>";
echo "<li>";
W("Avoid platform specific code outside src/util/");
Modified: GNUnet-docs/WWW/test/hacking_future.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_future.php3 2005-06-14 19:50:58 UTC (rev
941)
+++ GNUnet-docs/WWW/test/hacking_future.php3 2005-06-14 20:12:29 UTC (rev
942)
@@ -5,10 +5,12 @@
include("html_header.php3");
ANCHOR("future");H3("Future Work");
+BP();
W("Code contributions (GPL) are generally welcome.");
W("Before writing a larger patch, you may want to discuss the idea on the
developer mailinglist first.");
-BR();
+P();
W("Some ideas (in random order, contacts listed are people that seem to have
given the idea some thought and/or may even have some code):");
+EP();
echo "<ul>";
LI("improve performance (create simulator/testbed, improve heuristics)");
LI("improve documentation");
@@ -23,7 +25,9 @@
LI("port to OS X");
LI("improve HTTP compatibility of HTTP transport service");
echo "</ul>";
+BP();
W("And if you want to go totally crazy:");
+EP();
echo "<ul>";
LI("distributed computation (sandboxing!?)");
LI("add steganography to existing transport protocols");
Modified: GNUnet-docs/WWW/test/hacking_organization.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_organization.php3 2005-06-14 19:50:58 UTC
(rev 941)
+++ GNUnet-docs/WWW/test/hacking_organization.php3 2005-06-14 20:12:29 UTC
(rev 942)
@@ -6,15 +6,16 @@
ANCHOR("libraries");H3("GNUnet libraries");
+BP();
W("GNUnet is divided into several libraries.");
W("Some libraries are statically linked (rare), some are shared libraries and
many are plugins into the GNUnet core.");
-BR();
+P();
W("Static libraries are used for more internal re-use of code.");
W("For example, the static gnunet-core library is used by the GNUnet deaemon
and by various testcases and diagnostic tools.");
-BR();
+P();
W("Shared libraries are used whenever multiple tools share code.");
W("The general OS abstraction library, gnunet-util as well as libraries like
libgnunet-ecrs that are used by multiple user interfaces belong into this
category.");
-BR();
+P();
W("Finally, plugins are used for all of the code that is dynamically loaded by
the gnunet daemon when needed.");
W("This keeps the code for gnunetd small and modular.");
W("Modules fall into two subcategories, services and applications.");
@@ -27,11 +28,13 @@
W("Application modules typically also provide one or more shared libraries to
make it easier to write user interfaces for these applications.");
W("By convention, the names of the header files for these convenience
libraries end in <tt>_lib.h</tt>.");
W("Note that the application modules themselves do not define a header file
since they are accessed using a set of client-server messages exchanged using
code from gnunet-util and the GNUnet core.");
-P();
+EP();
ANCHOR("overview");H3("Important header files and libraries");
+BP();
W("The most important modules in GNUnet are:");
+EP();
echo "<ul>\n";
LI(extlink_("#protocols","gnunet_protocols.h"));
LI(intlink_("hacking_util.php3","gnunet_util.h"));
@@ -41,28 +44,32 @@
ANCHOR("protocols");H4("gnunet_protocols.h");
+BP();
W("The <tt>gnunet_protocols.h</tt> include file also defines all GNUnet
message ID numbers.");
W("While these ID numbers belong to individual modules, defining them all in
one place makes it trivial to avoid conflicting assignments.");
W("Thus, whenever a new type of message is defined, it should be given a
globally unique number in <tt>gnunet_protocols.h</tt> as soon as possible.");
W("The most important sets of constants are the client-server protocol message
types, the peer-to-peer protocol message types, the transport service
identifiers and the ECRS block types.");
-P();
+EP();
ANCHOR("transport");H4("gnunet_transport.h");
+BP();
W("This header primarily defines the functions that any GNUnet transport
service must implement.");
W("The semantic of the transport service are essentially those of UDP:");
W("out-of-order, unreliable, unencrypted delivery of bounded-size messages.");
W("Each transport type can also define its own addressing scheme.");
-P();
+EP();
ANCHOR("core");H4("gnunet_core.h");
+BP();
W("This header defines the API that can be used by GNUnet modules.");
W("It provides functions to register listeners for certain events (like
messages from peers and local user interface clients), to load additional
services, and to send messages to other peers.");
-P();
+EP();
ANCHOR("flow");H3("Global data-flow in GNUnet");
+BP();
W("There are two typical flows for data in GNUnet.");
W("Note that this text describes the flow of the data, several threads and
processes are involved in this.");
-BR();
+P();
W("First, a client such as %s or %s connects (via a secure TCP connection,
typically
loopback) to the %s.",
ARRAY(extlink_("doxygen/html/gnunetsearch_8c.html","gnunet-search"),
@@ -78,13 +85,13 @@
extlink_("doxygen/html/gnunet__transport__service_8h.html","transport")));
W("The peer-to-peer message is then transmitted via a transport service, such
as the %s transport.",
extlink_("doxygen/html/udp_8c.html","udp"));
-BR();
+P();
W("The second path comes into play after gnunetd receives a message on any
transport mechanism.");
W("The message is %s according to its message type.",
extlink_("doxygen/html/handler_8c.html#a14","demultiplexed"));
W("If it is a query the GAP and FS modules perform a lookup and eventually
send a reply.");
W("The reply goes the same path back, eventually reaching the other peer where
it is then passed to the user interface.");
-P();
+EP();
include("html_footer.php3");
?>
Modified: GNUnet-docs/WWW/test/hacking_rpc.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_rpc.php3 2005-06-14 19:50:58 UTC (rev
941)
+++ GNUnet-docs/WWW/test/hacking_rpc.php3 2005-06-14 20:12:29 UTC (rev
942)
@@ -5,7 +5,7 @@
include("html_header.php3");
H2("The GNUnet RPC service");
-P();
+BP();
W("The GNUnet RPC service offers link-to-link reliable remote procedure
calls.");
W("The link-to-link restriction means that the peers have to be able to
connect directly.");
W("In other words, the GNUnet RPC service does not do any routing.");
@@ -22,9 +22,10 @@
W("Just like invoking an RPC can be synchronous or asynchronous, the RPC
functions themselves can be synchronous or asynchronous.");
W("RPC functions that themselves perform RPC calls must almost always be
defined as asynchronous to avoid possibly deadlocking the system.");
W("Note that the size of RPC messages (paramters, return values) is currently
limited by the MTU (minus headers) of the underlying transport used by
GNUnet.");
-P();
+EP();
H3("Arguments and return values");
+BP();
W("GNUnet RPC functions use the opaque RPC_Param datastructure for passing
arguments and return values.");
W("RPC_Param allows naming parameters and returning any number of return
values.");
W("Naming parameters has the advantage that it is easy to add additional
arguments in later versions.");
@@ -34,10 +35,13 @@
W("The %s header file defines various helper functions to access RPC_Param
datastructures.",
extlink_("doxygen/html/gnunet__rpc__service_8h.html",
"gnunet_rpc_service.h"));
+EP();
H3("Using the RPC service");
+BP();
W("In order to use the RPC service an application module must first request it
from the GNUnet core.");
W("The following code illustrates how to do this:");
+EP();
?>
<pre>
CoreAPIForApplicaton * coreAPI = ...;
Modified: GNUnet-docs/WWW/test/hacking_testcases.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_testcases.php3 2005-06-14 19:50:58 UTC (rev
941)
+++ GNUnet-docs/WWW/test/hacking_testcases.php3 2005-06-14 20:12:29 UTC (rev
942)
@@ -5,22 +5,23 @@
include("html_header.php3");
H2("Writing testcases for GNUnet");
-P();
H3("Fundamentals");
+BP();
W("Ideally, any non-trivial GNUnet code should be covered by automated
testcases.");
W("Testcases should reside in the same place as the code that is being
tested.");
W("The name of source files implementing tests should contain the word
<tt>test</tt>.");
W("Typically it is desireable to have testcases both for low-level functions
and high-level abstractions.");
W("For example, while the cryptographic functions would be tested as part of
the session key exchange, they should also still be tested independently.");
-P();
+EP();
H3("Integration with GNU autotools");
-P();
+BP();
W("Testcases in GNUnet should be integrated with the autotools build system.");
W("This way, developers and anyone building binary packages will be able to
run all testcases simply by running <tt>make check</tt>.");
W("The final testcases shipped with the distribution should output at most
some brief progress information and not display debug messages.");
W("The success or failure of a testcase must be indicated by returning zero
(success) or non-zero (failure) from the main method of the testcase.");
W("The integration with the autotools is relatively straightforward and only
requires modifications to the <tt>Makefile.am</tt> in the directory containing
the testcase.");
W("For three testcases testing the code in <tt>foo.c</tt>, <tt>bar.c</tt> and
<tt>etc.c</tt>, the <tt>Makefile.am</tt> would contain the following lines:");
+EP();
PRE("check_PROGRAMS = footest bartest etctest\n" .
"TESTS = $(check_PROGRAMS)\n" .
"footest_SOURCES = footest.c\n" .
@@ -29,19 +30,22 @@
"bartest_LDADD = $(top_builddir)/src/util/libgnunetutil.la\n" .
"etctest_SOURCES = etctest.c\n" .
"etctest_LDADD = $(top_builddir)/src/util/libgnunetutil.la\n");
+BP();
W("Naturally, other libraries used by the testcase may be specified in the
<tt>LDADD</tt> directive as necessary.");
-BR();
+P();
W("Often testcases depend on additional input files, such as a configuration
file.");
W("These support files have to be listed using the <tt>EXTRA_DIST</tt>
directive in order to ensure that they are included in the distribution.");
W("Example:");
+EP();
PRE("EXTRA_DIST = check.conf\n");
-P();
+BP();
W("Executing <tt>make check</tt> will run all testcases in the current
directory and all subdirectories.");
W("Testcases can be compiled individually by running <tt>make footest</tt> and
then invoked directly using <tt>./footest</tt>.");
W("Note that due to the use of plugins in GNUnet, it is typically necessary to
run <tt>make install</tt> before running any testcases.");
W("Thus the canonical command <tt>make check install</tt> has to be changed to
<tt>make install check</tt> for GNUnet.");
-P();
+EP();
H3("Common problems and solutions");
+BP();
W("When testing GNUnet, the splitting of the code into a daemon and clients
often complicates testing.");
W("The solution to this is to have the testcase <tt>fork</tt> a
<tt>gnunetd</tt> process and then execute appropriate client actions (to test
the client APIs or the core module or both).");
W("If necessary, multiple daemons can be forked using different ports (!) to
simulate a network.");
@@ -49,6 +53,7 @@
W("Also note that some client libraries were not written to communicate with
multiple daemons over multiple trusted TCP connections at the same time, which
may complicate testing in such situations.");
W("Note that on exit, the testcase should shutdown <tt>gnunetd</tt> with a
kill signal.");
W("The following code illustrates spawning and killing a <tt>gnunetd</tt>
process from a testcase:");
+EP();
PRE("pid_t daemon; \n" .
"daemon = fork();\n" .
"if (daemon == 0) {\n" .
@@ -73,15 +78,16 @@
" if (WEXITSTATUS(status) == 0)\n" .
" return -1; /* server had error */\n" .
"}\n");
-P();
+BP();
W("An alternative way to just test modules (in particular if there is no
client API to start with) is to implement a mock-version of the GNUnet core API
and emulate a <tt>gnunetd</tt> environment for the module.");
W("An example for this is the %s.",
extlink_("doxygen/html/fragmentationtest_8c.html", "fragmentationtest.c"));
-BR();
+P();
W("Another uncommonly used alternative is to have the testcase process itself
load the modules by initiating the full <tt>gnunetd</tt> startup sequence.");
W("For that, the testcase must link against <tt>libgnunetcore</tt>.");
W("For an example see %s.",
extlink_("doxygen/html/gnunet-transport-check_8c.html",
"gnunet-transport-check.c"));
+EP();
include("html_footer.php3");
?>
Modified: GNUnet-docs/WWW/test/hacking_threading.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_threading.php3 2005-06-14 19:50:58 UTC (rev
941)
+++ GNUnet-docs/WWW/test/hacking_threading.php3 2005-06-14 20:12:29 UTC (rev
942)
@@ -5,11 +5,13 @@
include("html_header.php3");
H4("Threading and Synchronization");
+BP();
W("GNUnet is inherently multi-threaded.");
W("Thus writing applications for GNUnet requires taking synchronization issues
into account.");
W("GNUnet provides a minimal set of threading abstractions in the %s module,
including semaphores, mutexes, recursive mutexes and thread creation.",
extlink_("doxygen/html/semaphore_8c-source.html","semaphore"));
W("When writing code for GNUnet, the following basic rules must be followed:");
+EP();
echo "<ol><li><strong>";
W("The core may call registered callback handlers at any time, and also
concurrently.");
W("The application modules are responsible for synchronizing access to their
internal state properly.");
@@ -21,7 +23,7 @@
W("The rationale behind this rule is that the core may have a thread A that
holds an internal lock L and calls a callback on the service.");
W("If simultaneously another thread B holds a lock S of the service and calls
back on the core, this may result in a deadlock if that callback blocks trying
to aquire lock L and thread A blocks trying to aquire lock S.");
W("If thread A does not hold any internal locks when calling on the core, this
situation can be safely avoided.");
-P();
+BR();BR();
W("Programming with this paradigm is not very difficult.");
W("Still, it often requires a simple trick if the callback to the core
requires an argument that is typically kept in the shared global state.");
W("The trick is, to copy the shared global state into a local buffer while
holding the lock, then releasing the lock and finally doing the callback on the
core.");
@@ -37,7 +39,7 @@
W("Encryption operations are also not a problem.");
W("The only problem in practice are <em>blocking socket operations</em>.");
W("Blocking socket operations occur pretty much only apply to TCP sockets.");
-P();
+BR();BR();
W("The TCP transport service avoids blocking operations using <tt>select</tt>
calls and IO buffers.");
W("If a message can not be buffered (buffer full) and sending would block, the
TCP transport layer discards the message (or: why we like unreliable
operational semantics).");
W("Client-server TCP connections are more problematic.");
@@ -47,11 +49,11 @@
W("Similarly, the client blocks when sending messages to gnunetd.");
W("Since the client-server TCP connection is supposed to use a fast (loopback,
LAN) connection and since gnunetd uses a thread per client connection, blocking
on this connection is acceptable.");
W("The problem with blocking here is that it leaves the possibility of an
<em>inter-process deadlock</em>.");
-P();
+BR();BR();
W("The deadlock can occur if the TCP thread that receives and processes
messages from the client blocks on a write to the client (TCP buffer queue
full) and thus gnunetd no longer reads from the TCP pipe.");
W("If the client blocks on a write to gnunetd and thus no longer reads from
its end of the TCP connection, both processes block forever. This problem is
typically hard to diagnose since it involves two processes and may only occur
after the TCP buffers of the operating system are full.");
W("A typical symptom is that <tt>netstat -tn</tt> shows two local TCP
connections with very full receive and send buffers that do not change.");
-P();
+BR();BR();
W("The solution to the problem is that every client (not peer, remember that
clients are trusted and can thus be expected to follow the protocol correctly)
must always be in a state where it has a thread that can receive and process
messages from gnunetd.");
W("That thread should never block, neither by doing a direct write to gnunetd
nor by aquireing a lock that could be hold by another thread while that thread
writes to gnunetd.");
W("A typical solution to this problem is to use one thread that processes
replies and another thread that generates requests.");
@@ -59,7 +61,7 @@
W("The %s code is an example for code that handles this type of problem.",
extlink_("doxygen/html/requestmanager_8c-source.html", "RequestManager"));
echo "</li></ol>";
-P();
+
H5("Notes");
echo "<ul><li>";
W("You should never use pthread_detach.");
Modified: GNUnet-docs/WWW/test/hacking_util.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_util.php3 2005-06-14 19:50:58 UTC (rev
941)
+++ GNUnet-docs/WWW/test/hacking_util.php3 2005-06-14 20:12:29 UTC (rev
942)
@@ -5,7 +5,7 @@
include("html_header.php3");
H2("libgnunet_util");
-P();
+BP();
W("<tt>libgnunet_util</tt> is a helper library that is supposed to contain all
platform dependent code (except for user interfaces).");
W("It is also supposed to offer basic services that most if not all GNUnet
binaries require.");
@@ -14,6 +14,7 @@
extlink_("doxygen/html/gnunet__util_8h.html",
"gnunet_util.h"));
W("The functions provided by <tt>libgnunet_util</tt> fall roughly into the
following categories:");
+EP();
?>
<ul>
<li><?php extlink("doxygen/html/timer_8c.html",
@@ -50,15 +51,15 @@
<?php
-
+BP();
W("Ideally, porting GNUnet should only require porting the gnunet_util
library.");
W("More testcases for the gnunet-util APIs are therefore a great way to make
porting of GNUnet easier.");
+EP();
-
-BR();
ANCHOR("crypto");
H3("Cryptography");
+BP();
W("The gnunet-util APIs also provide the cryptographic primitives used in
GNUnet.");
W("GNUnet uses 2048 bit RSA keys for the session key exchange and for signing
messages by peers.");
W("Most researchers in cryptography consider 2048 bit RSA keys as very secure
and practically unbreakable for a very long time unless extraordinary advances
in cryptography are made.");
@@ -68,7 +69,7 @@
W("Note that GNUnet does not use RSA to encrypt files or ordinary individual
peer-to-peer messages.");
W("No sane protocol uses public key cryptography for the bulk of the messages
since public key encryption is extremely expensive compared to symmetric
ciphers.");
W("GNUnet follows the well-established practice to use public key cryptography
to exchange an initial pair of symmetric keys that is then used for the rest of
the communication).");
+EP();
-
include("html_footer.php3");
?>
\ No newline at end of file
Modified: GNUnet-docs/WWW/test/hacking_win32_build.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_win32_build.php3 2005-06-14 19:50:58 UTC
(rev 941)
+++ GNUnet-docs/WWW/test/hacking_win32_build.php3 2005-06-14 20:12:29 UTC
(rev 942)
@@ -5,16 +5,18 @@
include("html_header.php3");
H3("Building GNUnet and libextractor on Microsoft Windows 32-bit Platforms");
+BP();
W("This document is a guide to building GNUnet and libextractor on Windows
platforms.");
-BR();
+P();
W("The Windows build uses a UNIX emulator for Windows, %s, to build the
executable modules.",
extlink_("http://www.mingw.org/", "MinGW"));
W("These modules run natively on Windows and do not require additional
emulation software besides the usual %s.",
extlink_("download.php3", "dependencies"));
-BR();
-W("GNUnet development is mostly done under Linux and especially CVS checkouts
may not build out of the box.");
+P();
+W("GNUnet development is mostly done under Linux and especially SVN checkouts
may not build out of the box.");
W("We regret any inconvenience, and if you have problems, please %s or ask the
%s for assistance.",
ARRAY(extlink_("faq.php3#bugs", "report them"), extlink_("mailinglist.php3",
"mailinglist")));
+EP();
H4("Hardware and OS requirements");
echo "<ul>";
LI("Pentium II or equivalent processor, 350 MHz or better");
@@ -193,23 +195,28 @@
</li>
</ol>
<?php H4("Building libextractor and GNUnet");
+BP();
W("See %s for basic instructions on building libextractor and GNUnet.",
extlink_("user_gnunet.php3",
"Installation"));
-BR();
+P();
W("By default, all modules that are created in this way contain debug
information and are quite large.");
W("To compile release versions (small and fast) set the variable CFLAGS:");
-BR();
+P();
PRE("# CFLAGS='-O2' ./configure --prefix=\$HOME --with-extractor=\$HOME");
+EP();
H4("Installer");
+BP();
W("The GNUnet installer is made with %s.",
extlink_("http://nsis.sourceforge.net/",
"NSIS"));
W("The installer script is located in contrib\win in the GNUnet source tree.");
-P();
+EP();
H4("Source");
+BP();
W("The sources of all dependencies are available %s.",
extlink_("download/win/3rd_party_sources.tar",
"here"));
+EP();
include("html_footer.php3");
?>
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r942 - GNUnet-docs/WWW/test,
durner <=