# Selbstgeschriebenes Programm Pfadangaben z.B. /etc

## JoHo42

Hi Leute,

ich habe mir ein kleines Programm geschrieben.

Dieses hat eine Configurationsdatei, die ich ganz gerne ins /etc

Verzeichnis ablegen moechte.

Wie sage ich meinem Programm wo der die suchen soll.

Einfach beim oeffnen /etc/ipnet.conf fest einbauen oder gibt es

da noch andere Moeglichkeiten?

Woher wissen die anderen Programme wo sie ihre Dateien finden,

wie z.B. Bitmaps, Configurationsdateien und Temporaeredateien?

Vielleicht noch an der Stelle eine zweite Frage.

Ich habe das Programm mit Kdevelop geschrieben.

Also ein Projekt mit Kdevelop angelegt und kann diese auch mit

make und make install installieren.

Wie kann ich den Make und Configuration files sagen, dass das Programm

nicht nur aus einem Executable besteht sondern auch noch eine Confdateie,

die ins /etc/ Verzeichnis gehoert?

Vielleicht noch als Info das Programm soll als root laufen.

Gruss Joerg

----------

## schachti

 *JoHo42 wrote:*   

> 
> 
> Woher wissen die anderen Programme wo sie ihre Dateien finden,
> 
> wie z.B. Bitmaps, Configurationsdateien und Temporaeredateien?
> ...

 

Einiges wird über Umgebungsvariablen der Shell konfiguriert, zum Beispiel landen temporäre Dateien in den meisten Programmen in $TMPDIR. Schau Dir doch zum Beispiel mal die Ausgabe von export an um zu sehen, was aktuell alles so gesetzt ist...

----------

## JoHo42

Irgendwie ist die Antwort nicht wirklich befriedigend.

Es gibt in export keine TMP Definition bei mir.

Wohl compiler und kde usw...

Da bleibt dann trotzdem noch die Frage, wie finden die Programme

z.B. die /usr/share/ Verzeichnis?

Um dort die Bitmaps oder sonstige Informationen abzuhohlen.

Gruss Joerg

----------

## Anarcho

Dazu sind viele Pfade tatsächlich zur Compile-time festgelegt. Oft gibt man einen prefix bei configure an, welcher dann einfach an allen festen Pfade vorangestellt wird.

Z.b. prefix=/ -> /etc/..

prefix=/usr/local/ -> /usr/local/etc/...

----------

## JoHo42

Hi,

Jetzt brauche ich aufklaerung, wie geht des mit dem Praefix?

Ich habe mir verschiedene andere Programme angeschaut, da waren

die Pfade auch nur fest eincompiliert.

Da waere die Nummer mit den Praefixen eine Loesung des Problems.

Brauche mehr Infos.

Gruss Joerg

----------

## Necoro

Was wo landet ist im Filesystem Hierarchy Standard (FHS) festgelegt (auch wenn sich die einzelnen Distributionen / Programme da nicht immer strikt dran halten). Das Präfix wird in der Regel zur Compilezeit (bei configure) übergeben ... und führt denn dazu, dass der Pfad für Konfigurationsdateien denn halt lautet: $PREFIX/etc  :Smile:  ... wenn $PREFIX "/" ist, landet es im normalen /etc ansonsten halt eine Hierarchie weiter unten.

Sollte dein Programm kein configure o.ä. haben, solltest du zB ein define in einer Headerdatei (o.ä. für andere Sprachen) haben, dass man denn bequem mit sed ändern kann ... alternativ auch ein kleines script was genau das macht  :Smile: 

----------

## JoHo42

Hi Necoro,

das FHS habe ich mir angeschaut und gibt mir die moeglichkeit zu wissen, welche Datei ich wo ablegen sollte.

Aber ueber die Praefix geschichte steht da nicht viel drin.

Gibt es dafuer irgendwo eine beschreibung, wie ich das in der config angebe?

Weil jetzt habe ich feste Pfade in einer Header Datei stehen.

Diese kann man wohl mit compiler Parameter in eine andere Sprache schalten,

aber irgendwie halte ich das nicht fuer sinnvoll.

Gruss Joerg

----------

## 69719

./confiure --prefix=/usr

----------

## JoHo42

Hi danke fuer die Antwort,

aber woher weiss der Source Code wie er die Pfade einstellen muss.

Wie muss ich im Source Code die defines einrichten?

Gruss Joerg

----------

## 69719

#include "config.h"

----------

## JoHo42

Welches config.h file?

Im Verzeichnis /usr findet ich 14 Dateien.

Gruss Joerg

----------

## franzf

Pfade einstellen und im Quelltext darauf zugreifen:

Ich nehm für meine Programme cmake und kann auch nix anderes! Deshalb hier kurz wie ich es da handhabe:

Beispiel-CMakeFiles.txt:

```
# definieren des Verzeichnisses für die Daten

SET (DATA_DIR "${CMAKE_INSTALL_PREFIX}/share/my_app_name")

# -D define für den Compiler hinzufügen:

ADD_DEFINITIONS ("-DDEFAULT_DATA_DIR=\\\"${DATA_DIR}\\\")
```

Nun kann man im Code auf diese Variable zugreifen:

```
// Irgendwo im Code:

QString dataDir = QString(DEFAULT_DATA_DIR);
```

Um diese Verzeichnisse nun zu ändern kann man mit dem cmake (äquivalent zu "./configure") folgendes machen:

```
cmake -DCMAKE_INSTALL_PREFIX=/usr .
```

was den Prefix von /usr/local (cmake-default für unix-systeme) auf /usr setzt und somit das data-dir von /usr/local/share/my_app_name auf /usr/share/my_app_name. Du kannst auch auf selbe Art&Weise direkt den Pfad für das DATA_DIR setzen mit -DDATA_DIR=/anderes/verzeichnis.

Das alles muss prinzipiell auch mit den autotools funktionieren, nur weiß ich nicht wie  :Wink: 

Grüße

Franz

----------

## JoHo42

OK wenn ich das richtig verstehe, hast du Dir ein Skript geschrieben,

welches die Pfade in deinen C Dateien einfach auswechselt.

Das Skript ist dann mit im cmake | ./configure Scriptdatei.

Das waere dann eine moeglichkeit.

Aber ich wuerde mich auch noch fuer die andere moeglichkeit mit

dem configure.h File.

Gruss Joerg

----------

## Necoro

 *JoHo42 wrote:*   

> Aber ich wuerde mich auch noch fuer die andere moeglichkeit mit
> 
> dem configure.h File.

 

configure legt diese configure.h (oder wars config.h) an, wenn man ./configure laufen lässt. kA was dazu in der ./configure stehen muss, les dir die autoconf doku durch

----------

## hoernerfranz

eine gute beschreibung, wie/wo/was bzgl. konfigurationsdateien bei kde behandelt wird,

gibts hier: http://techbase.kde.org/index.php?title=Development/Tutorials/KConfig

----------

