Die Bündelung eine scons basierte Quelle




Wir verwenden SCons für alle aufbauen müssen, und wir möchten eine Bibliothek in Open-Source-verteilen.


Jetzt sind die meisten Software verwendet configure machen und als Build-Mechanismus machen installieren, wir fragten uns, wie wir unsere Bibliothek bündeln soll.


Wir haben die folgenden Lösungen:


* bündeln Genau wie die Art und Weise ist es, erfordern scons zu bauen.
* Fügen Sie einen Dummy-configure und Make-Datei, die gerade scons nennen.
* In autoconf und eine Make-Datei.


Wie wird es wahrgenommen, eine Software zu erhalten erfordert Python und scons zu bauen?
Wenn Ihre Bibliothek Cross-Plattform und kann auch auf Windows kompiliert werden, dann scons verwendet, ist die richtige Wahl.
<p>starten sie von <a href="http://www.ubuntu.com/server">buntu server</a> und bauen sie auf. es verwendet die gleichen repos wie die desktop-distribution und sie können verschiedene desktop-konfigurationen installieren.</p><p>ich schlage nur vor, dass sie sich von den großen metapaketen wie ubuntu-desktop fernhalten, oder sie werden am ende die vollständige distribution sehen.</p><p>wenn sie nur den ubuntu-desktop reduzieren (anstatt ihn aufzubauen) möchten, müssen sie ihn entfernen (was von vielen dingen abhängt) und alle automatisch erfüllten abhängigkeiten in manuell installierte konvertieren. wenn sie nicht dazu in der lage sind, bereinigen sie sie automatisch, da sie (neben anderen tools) "veraltete" pakete bereinigen. dies sind pakete, die keine abhängigkeit oder benutzerauswahl erfüllen.</p> <p>einfach. hier ist das beispiel aus meinem kopf:</p><h1>die oberste ebene <code>cmakelists.txt</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) # you can tweak some common (for all subprojects) stuff here. for example: set(cmake\_disable\_in\_source\_build on) set(cmake\_disable\_source\_changes on) if ("${cmake\_source\_dir}" strequal "${cmake\_binary\_dir}") message(send\_error "in-source builds are not allowed.") endif () set(cmake\_verbose\_makefile on) set(cmake\_color\_makefile on) # remove 'lib' prefix for shared libraries on windows if (win32) set(cmake\_shared\_library\_prefix "") endif () # when done tweaking common stuff, configure the components (subprojects). # note: the order matters! the most independent ones should go first. add\_subdirectory(components/b) # b is a static library (depends on boost) add\_subdirectory(components/c) # c is a shared library (depends on b and external xxx) add\_subdirectory(components/a) # a is a shared library (depends on c and b) add\_subdirectory(components/executable) # executable (depends on a and c) </code></pre><h1><code>cmakelists.txt</code> in <code>components/b</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) project(b c cxx) find\_package(boost 1.50.0 required) file(glob cpp\_files source/*.cpp) include\_directories(${boost\_include\_dirs}) add\_library(${project\_name} static ${cpp\_files}) # required on unix os family to be able to be linked into shared libraries. set\_target\_properties(${project\_name} properties position\_independent\_code on) target\_link\_libraries(${project\_name}) # expose b's public includes (including boost transitively) to other # subprojects through cache variable. set(${project\_name}\_include\_dirs ${project\_source\_dir}/include ${boost\_include\_dirs} cache internal "${project\_name}: include directories" force) </code></pre><h1><code>cmakelists.txt</code> in <code>components/c</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) project(c c cxx) find\_package(xxx required) file(glob cpp\_files source/*.cpp) add\_definitions(${xxx\_definitions}) # note: boost's includes are transitively added through b\_include\_dirs. include\_directories(${b\_include\_dirs} ${xxx\_include\_dirs}) add\_library(${project\_name} shared ${cpp\_files}) target\_link\_libraries(${project\_name} b ${xxx\_libraries}) # expose c's definitions (in this case only the ones of xxx transitively) # to other subprojects through cache variable. set(${project\_name}\_definitions ${xxx\_definitions} cache internal "${project\_name}: definitions" force) # expose c's public includes (including the ones of c's dependencies transitively) # to other subprojects through cache variable. set(${project\_name}\_include\_dirs ${project\_source\_dir}/include ${b\_include\_dirs} ${xxx\_include\_dirs} cache internal "${project\_name}: include directories" force) </code></pre><h1><code>cmakelists.txt</code> in <code>components/a</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) project(a c cxx) file(glob cpp\_files source/*.cpp) # xxx's definitions are transitively added through c\_definitions. add\_definitions(${c\_definitions}) # note: b's and boost's includes are transitively added through c\_include\_dirs. include\_directories(${c\_include\_dirs}) add\_library(${project\_name} shared ${cpp\_files}) # you could need `${xxx\_libraries}` here too, in case if the dependency # of a on c is not purely transitive in terms of xxx, but a explicitly requires # some additional symbols from xxx. however, in this example, i assumed that # this is not the case, therefore a is only linked against b and c. target\_link\_libraries(${project\_name} b c) # expose a's definitions (in this case only the ones of c transitively) # to other subprojects through cache variable. set(${project\_name}\_definitions ${c\_definitions} cache internal "${project\_name}: definitions" force) # expose a's public includes (including the ones of a's dependencies # transitively) to other subprojects through cache variable. set(${project\_name}\_include\_dirs ${project\_source\_dir}/include ${c\_include\_dirs} cache internal "${project\_name}: include directories" force) </code></pre><h1><code>cmakelists.txt</code> in <code>components/executable</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) project(executable c cxx) file(glob cpp\_files source/*.cpp) add\_definitions(${a\_definitions}) include\_directories(${a\_include\_dirs}) add\_executable(${project\_name} ${cpp\_files}) target\_link\_libraries(${project\_name} a c) </code></pre><hr><p>um es klar zu machen, hier ist die entsprechende quellbaumstruktur:</p><pre><code>root of the project ├───components │ ├───executable │ │ ├───resource │ │ │ └───icons │ │ ├───source | | └───cmakelists.txt │ ├───a │ │ ├───include │ │ │ └───a │ │ ├───source | | └───cmakelists.txt │ ├───b │ │ ├───include │ │ │ └───b │ │ ├───source | | └───cmakelists.txt │ └───c │ ├───include │ │ └───c │ ├───source | └───cmakelists.txt └───cmakelists.txt </code></pre><p>es gibt viele punkte, an denen dies angepasst/angepasst oder geändert werden kann, um bestimmte anforderungen zu erfüllen. dies sollte jedoch zumindest den einstieg erleichtern.</p><p><strong> hinweis: </strong>ich habe diese struktur in mehreren mittelgroßen und großen projekten erfolgreich eingesetzt.</p> Naja, der Quelltext von frei lizenzierter Software wird üblicherweise in einem Online-Quellcodeverwaltungssystem organisiert. Diese Verwaltungssysteme müssen von irgendjemandem gehostet werden, es gibt aber auch kostenlose Angebote wie SourceForge (Subversion) oder GitHub (git). Und von der dort eingesetzten Software hängt es dann auch mehr oder weniger ab, wie man idealerweise zwecks Beteiligung vorgeht. Bei SourceForge muss der Projekt-Administrator dem SourceForge-Account des Entwicklers Schreibberechtigung einrichten, damit letzterer, nachdem er mittels Subversion die aktuelle Fassung des Codes heruntergeladen und seine Änderungen vorgenommen hat, diese auch wieder ins Online-Repository hochladen kann. Bei GitHub klont man sich gleich den ganzen Code auf den eigenen GitHub-Account ("Fork" genannt), lädt sich mittels git die eigene Online-Kopie lokal herunter, ändert diese, lädt in den eigenen Fork hoch und hinterlegt dem Projekt-Administrator des Originals eine Benachrichtigung, dass dieser doch die Änderungen des Forks in die offizielle Version übernehmen soll. Es empfiehlt sich generell, über die Ticket-Systeme der Projekte die Arbeit an offenen Aufgaben abzusprechen oder für das eigene Anliegen ein neues Ticket zu öffnen, was vor allem bei SourceForge auch darum wichtig ist, um konfligierende Änderungen und das dadurch notwendige Merging möglichst zu vermeiden, sodass die "Bewerbung" bei GitHub-Projekten allgemein einfacher ist, weil man da erstmal unabhängig arbeiten kann.


Bei mir sieht das dann so aus:


<https://github.com/skreutzer>


ist aber nicht gerade als repräsentativ zu betrachten. <p>das <a href="http://svnbook.red-bean.com/">subversion-buch</a> ist eine hervorragende informationsquelle für strategien zum anordnen ihres repositorys, zum verzweigen und zum markieren.</p><p>siehe auch:</p><p> <a href="https://stackoverflow.com/questions/35646/do-you-continue-development-in-a-branch-or-in-the-trunk">entwickeln sie sich in einer filiale oder im stamm weiter</a> </p><p> <a href="https://stackoverflow.com/questions/34975/branching-strategies">verzweigungsstrategien</a> </p> <p>die erste antwort ist gut und gibt einige strukturelle antworten, aber ein anderer ansatz besteht darin, darüber nachzudenken, was sie tun. bei modulen geht es darum, methoden bereitzustellen, die sie für mehrere klassen verwenden können - stellen sie sich diese als "bibliotheken" vor (wie sie es in einer rails app) sehen würden. bei klassen geht es um objekte, bei modulen um funktionen.</p><p>beispielsweise sind authentifizierungs- und autorisierungssysteme gute beispiele für module. authentifizierungssysteme funktionieren über mehrere klassen auf app-ebene (benutzer sind authentifiziert, sitzungen verwalten die authentifizierung, viele andere klassen verhalten sich je nach authentifizierungsstatus anders), sodass authentifizierungssysteme als gemeinsam genutzte apis fungieren.</p><p>sie können ein modul auch verwenden, wenn sie methoden für mehrere apps gemeinsam nutzen (auch hier ist das bibliotheksmodell gut).</p> <p><strong> <em> update (2016):</em> </strong></p><p>wenn sie nur einen soap -client benötigen, gibt es eine gut gepflegte bibliothek mit dem namen <a href="https://pypi.org/project/zeep/">zeep</a> . es unterstützt sowohl python 2 als auch 3 :)</p><hr><p><strong> <em> update:</em> </strong></p><p>zusätzlich zu dem, was oben erwähnt wurde, verweise ich auf die <a href="https://wiki.python.org/moin/webservices#soap">python webservices</a> seite, die mit allen aktiv gepflegten und empfohlenen modulen immer auf dem neuesten stand ist <strong> [~ # ~] soap [~ # ~] </strong> und alle anderen webservicetypen.</p><hr><p>leider glaube ich im moment nicht, dass es eine "beste" python soap bibliothek gibt. jeder der verfügbaren mainstreams hat seine eigenen vor- und nachteile.</p><p>ältere bibliotheken:</p><ul> <li> <p> <a href="http://soapy.sourceforge.net">soapy</a> : war das "beste", wurde aber nicht mehr gepflegt. funktioniert nicht mit python 2.5+</p> </li> <li> <p> <a href="http://pywebsvcs.sourceforge.net">[~ # ~] zsi [~ # ~]</a> : die verwendung ist sehr schmerzhaft und die entwicklung ist langsam. hat ein modul namens "soappy", das sich von soapy (oben) unterscheidet.</p> </li> </ul><p>"neuere" bibliotheken:</p><ul> <li> <p> <a href="https://fedorahosted.org/suds">[~ # ~] suds [~ # ~]</a> : sehr pythonisch und einfach zu erstellende wsdl-verbrauchende soap clients. das erstellen von soap servern ist etwas schwieriger. (dieses paket funktioniert nicht mit python3. für python3 siehe suds-py3)</p> </li> <li> <p> <a href="https://pypi.org/project/suds-py3/">suds-py3</a> : die python3-version von suds</p> </li> <li> <p> <a href="https://github.com/arskom/spyne">spyne</a> : das erstellen von servern ist einfach und das erstellen von clients etwas anspruchsvoller. dokumentation fehlt etwas.</p> </li> <li> <p> <a href="http://pypi.python.org/pypi/ladon">ladon</a> : das erstellen von servern ist ähnlich wie in soaplib (mit einem dekorateur). ladon stellt mehr schnittstellen als soap gleichzeitig zur verfügung, ohne dass zusätzlicher benutzercode erforderlich ist.</p> </li> <li> <p> <a href="http://code.google.com/p/pysimplesoap/">pysimplesoap</a> : sehr leichtgewichtig, aber nützlich für client und server - enthält eine web2py-serverintegration, die mit web2py geliefert wird.</p> </li> <li> <a href="https://github.com/kiorky/soappy">soappy</a> : im unterschied zu dem aufgegebenen soappy, das über den obigen zsi-link gehostet wird, wurde diese version tatsächlich bis 2011 beibehalten, jetzt scheint sie auch aufgegeben zu werden.</li> <li> <a href="http://www.python.org/pypi/soaplib">soaplib</a> : einfach zu verwendende python bibliothek zum schreiben und aufrufen von soap-webdiensten. mit soaplib geschriebene webservices sind einfach, leichtgewichtig, funktionieren gut mit anderen soap implementierungen und können als wsgi-anwendungen bereitgestellt werden.</li> <li> <a href="https://bitbucket.org/sboz/osa">osa</a> : eine schnell und einfach zu verwendende soap python client-bibliothek.</li> </ul><p>davon habe ich suds nur persönlich benutzt und es hat mir sehr gut gefallen.</p> <p>ein schlüsselbund ist eine "gespeicherte datenbank" - ich verwende diesen begriff leichtfertig - ihrer anmeldeinformationen, die auf ihrem lokalen pc gespeichert sind. es wird von einem magischen voodoo-verschlüsselungsschema umschlossen (pkcs # 11 - wird für die sichere speicherung auf wechselmedien verwendet), sodass es vor neugierigen blicken relativ sicher ist.</p><p>es bietet ein gemeinsames backend für (hier framework einfügen, wir werden gnome als beispiel verwenden), um ihre anmeldeinformationen zu cruden (erstellen, lesen, aktualisieren, löschen), ohne "ihre eigene lösung zu rollen". es bleibt eine konsistente schnittstelle für programmierer, die dieses spezielle framework verwenden. kde stellt einen eigenen schlüsselbund zur verfügung, gnome hat eine weitere implementierung.</p><p>evolution, firefox und net-man nutzen alle diese schnittstelle. wenn sie ihre e-mail-server-anmeldeinformationen in evolution ablegen, werden sie aufgefordert, diese informationen im schlüsselbund zu speichern. wenn sie sich dafür entscheiden, werden die daten an den schlüsselbunddienst weitergeleitet und voilà gespeichert. evolution muss den schlüsselbunddienst erst beim start aufrufen, um diese informationen abzurufen.</p><p>die große idee dabei ist, dass andere personen, die auf ihren pc zugreifen und das master-passwort für ihren schlüsselbund nicht kennen, nicht auf ihre gespeicherten anmeldeinformationen zugreifen können. das gleiche prinzip wird vom addon von lastpass.com für ihren browser angewendet. (nur es ist verteilt, was bedeutet, dass ich es auf mehreren instanzen von browsern auf pcs verwenden kann.)</p><p>zusammenfassend biete ich dieses snippet von der gnome-keyring-seite <a href="http://live.gnome.org/gnomekeyring">befindet sich hier</a> an</p><blockquote> <p>gnome-schlüsselbund ist eine sammlung von komponenten in gnome, die geheimnisse, kennwörter, schlüssel und zertifikate speichern und anwendungen zur verfügung stellen.</p> <p>der gnome-schlüsselring ist in die anmeldung des benutzers integriert, sodass sein geheimer speicher entsperrt werden kann, wenn sich der benutzer in seiner sitzung anmeldet.</p> <p>gnome keyring basiert auf einem standard namens pkcs # 11, der eine standardmethode für anwendungen zum verwalten von zertifikaten und schlüsseln auf smartcards oder zur sicheren speicherung darstellt.</p> </blockquote> hallo zusammen,

[bild] tobias:

dann werde ich noch manuell einen config-backup-download machen und den gleich wieder einspielen.

das funktioniert, also zumindest werden die interfaces nicht mehr durcheinander gewürfelt oder gar nicht initialisiert.

eventuell hat die opnsense ein problem unt… <p>der weg zu gehen ist das hochladen <strong>einmal für jede ubunt</strong> version.</p><p>launchpad erstellt keine pakete für ubuntu-versionen, die nicht mehr unterstützt werden, und erstellt nur ein paket für eine bestimmte ubuntu-version. die zielversion wird (wie sie bereits wissen) in der datei <code>changelog</code> durch den neuesten eintrag angegeben!</p><p>denken sie daran, dass die pakete, von denen ihr programm abhängt, möglicherweise nicht in allen ubuntu-versionen in derselben version verfügbar sind.</p><p>sie sprechen auch von "multi-architektur" (architektur = cup-typ, z. b. x86, lpia, amd64). dies macht keinen unterschied, da jedes hochgeladene paket für alle verfügbaren architekturen erstellt wird, solange sie <code>architecture: any</code> in der paketdefinition (<code>debian/control</code>) datei, dies ermöglicht ihnen auch, das paket von verschiedenen paketen für verschiedene architekturen abhängig zu machen (das paket muss mehrmals definiert werden)</p> <p>ja, es ist möglich.<br> solange das betriebssystem unterstützt wird, können sie mehrere cuda-toolkits installieren. um keine probleme zu haben, empfehle ich jedoch, <code>runfile</code> installer zu verwenden, da sie angeben können, welche und wo diese installiert werden sollen.<br> eine sache, um die man sich kümmern muss, ist der symlink, der für cuda erstellt wurde. bei der installation von cuda suchen in der regel viele apps und/oder frameworks nach dem symlink, der am häufigsten auf die neueste/einzige version von cuda verweist, die auf einem system verfügbar ist.<br> nehmen sie also die erforderlichen änderungen in ihrer anwendungsspezifischen konfigurationsdatei vor, um auf die richtige cuda-installationsversion zu verweisen. das installationsprogramm erstellt normalerweise immer einen ordner mit dem namen <code>cuda-x.x</code> (z. b. cuda-9.1), den sie auch anstelle des symlinks (<code>/usr/local/cuda</code>) verwenden können.<br> wenn eine anwendung von ihnen nur den symlink <code>/usr/local/cuda</code> überprüft und sie die konfiguration nicht ändern können, können sie diesen symlink auf die version von cuda verweisen lassen, die diese anwendung benötigt, und die konfigurieren sie die anderen apps so, dass ihre entsprechenden versionen über ihre konfigurationsdateien verwendet werden.</p>