pkgsrc pour FreeMiNT


Le but de ce projet est de porter l'infrastructure pkgsrc sur FreeMiNT.

Le projet sera considéré achevé quand le bootstrap aboutira à la création du kit binaire, qui est la seule façon de pouvoir faire fonctionner pkgsrc sur une machine vierge.

État : 🔧️

Prérequis

Télécharger pkgsrc

Les modifications à apporter à la configuration upstream

La commande bootstrap

Script pour appeler bootstrap

#!/bin/bash
# Custom launcher for bootstrap
if [ ! -f /bin/sh ]; then
  ln -s /bin/bash /bin/sh
fi
umask 0022
cd /usr/pkgsrc/bootstrap
env CONFIGURE_ENV='ac_cv_func_lchmod=no ac_cv_func_lchflags=no ac_cv_func_getopt=yes' ./bootstrap --prefix /c/usr/pkg --workdir /c/usr/pkgsrc/bootstrap/work --compiler gcc --unprivileged --cwrappers no --prefer-native yes

Source : go.sh on Forgejo

Détails

  • Environnement: désactiver lchmod et lchflags
  • prefix
  • workdir
  • compilateur
  • mode non priviligié car l'émulateur n'a pas les droits root
  • pas de wrappers
  • outils natifs de préférence

Résultats

bootstrap partiel

  • bmake est utilisable
  • Les pkgtools sont utilisables en versions minimales (sauf delete, absent)
  • pkg_info affiche les paquets installés à partir des sources (bmake, libnbcompat, ...)

bootstrap réussi

  • La plupart des appels à libfetch ont dû être désactivés
  • Disponible au téléchargement

success

Construction de pax

  • cd /usr/pkgsrc/archivers/pax; bmake install

pax-1-start pax-2-error

  • Échec sur symboles en double : pou corriger ce bogue, supprimer char *chdname; de extern.h et l'ajouter dans options.c (extern.h est inclus à la fois par options.c et ar_io.c d'où le doublon).
  • Bogue suivant : la valeur par défaut de umask :

pax-3-error

  • Run umask 0022 ; bmake clean install (diff plante encore)

pax-4-success

  • Remarquer que le binaire s'appelle nbpax

pax-5-nbpax

Les problèmes rencontrés

Résolution des problèmes

./bootstrap ne se lance pas

  • Cause: la commande sh n'existe pas sh
  • Résolution: créer le lien : cd bin; ln -s bash sh
  • Pourquoi: le script cherche sh qui n'est pas présent pas défaut

./bootstrap indique que les chemins par défaut ne conviennent pas

  • Cause: bootstrap interdit l'utilisation de liens dans les chemins d'accès symlinks
  • Résolution: Utiliser /c/usr/pkg au lieu de /usr/pkg.
  • Pourquoi: /usr est un lien vers c:/usr (directive sln dans mint.cnf)

./bootstrap ne peut pas être relancé sans tout effacer

  • Cause: bootstrap veut démarrer sur une base propre à chaque fois workexists
  • Résolution: Faire "sauter" le test dans le script bootstrap
  • Pourquoi: pas besoin d'effacer vu qu'on relance dans les mêmes conditions pour trouver les bogues
--- bootstrap.orig  2025-11-15 15:47:59.722597455 +0100
+++ bootstrap   2025-11-15 15:49:55.875815746 +0100
@@ -962,15 +962,18 @@
 check_prog whoamiprog whoami

 if [ -d "${wrkdir}" ] || [ -f "${wrkdir}" ]; then
-   die "\"${wrkdir}\" already exists, please remove it or use --workdir"
+#  die "\"${wrkdir}\" already exists, please remove it or use --workdir"
+   echo "\"${wrkdir}\" already exists, continue..."
 fi

 if [ -f "${prefix}/share/mk/sys.mk" ]; then
-   die "\"${prefix}\" already in use, remove it or use a different --prefix"
+#  die "\"${prefix}\" already in use, remove it or use a different --prefix"
+   echo "\"${prefix}\" already in use, continue..."
 fi

 if [ -d "${pkgdbdir}/bootstrap-mk-files-"* ]; then
-   die "\"${pkgdbdir}\" already in use, remove it or use a different --pkgdbdir"
+#  die "\"${pkgdbdir}\" already in use, remove it or use a different --pkgdbdir"
+   echo "\"${pkgdbdir}\" already in use, continue..."
 fi

 mkdir_p_early ${wrkdir}

chflags() n'existe pas

  • Cause: malgré les options, le code utilise toujours lchflags chflags
  • Résolution: ajouter une exception comme pour Linux.
  • Pourquoi: le code ne dépend par des options passées
  • Détail: fichier pkgtools/libnbcompat/files/lchflags.c
    --- lchflags.c.orig 2025-10-28 19:57:28.979683563 +0100
    +++ lchflags.c  2025-10-28 19:45:30.725554587 +0100
    @@ -48,7 +48,7 @@
    if (S_ISLNK(psb.st_mode)) {
        return 0;
    }
    -#if defined(__illumos__) || defined(__linux__)
    +#if defined(__illumos__) || defined(__linux__) || defined(__MINT__)
    errno = (path == NULL ? EINVAL : ENOSYS);
    return -1;
    #else

Incompatibilité entre off_t et la_int64_t

  • Cause: Une fonction déclare un offset de type off_t 32 bits mais la fonction de libarchive attend une valeur 64 bits la_int64_t
  • Résolution: Indiquer le bon type dans le code.
  • Pourquoi: sur architecture 64 bits, off_t est promu en 64 bits, mais reste 32 bits sur architecture 32 bits
  • Détail: fichier pkg_install/add/perform.c
--- perform.c.orig  2025-04-17 23:29:34.000000000 +0200
+++ perform.c   2025-11-15 17:15:00.116495241 +0100
@@ -654,7 +654,7 @@
    int r;
    const void *buff;
    size_t size;
-   off_t offset;
+   la_int64_t offset;

    for (;;) {
        r = archive_read_data_block(reader, &buff, &size, &offset);

getopt est défini plusieurs fois

  • Cause: l'utilisation de la fonction ne semble pas dépendre des options getopt
  • Résolution: Faire "sauter" le test dans le script configure (voir ci-dessous) et mettre "CONFIGURE_ARGS+= --enable-db" dans /usr/pkgsrc/pkgtools/libnbcompat/Makefile. Supprimer dans /usr/pkgsrc/bootstrap/work/libnbcompat les fichiers lobnbcompat.a, .o, config.status, config.log et dans nbcompat, les fichiers config.h et nbconfig.h
  • Pourquoi: En mettant 'no', le test qui suit devient faux et la version BSD n'est plus utilisée
  • Détail: dans usr/pkgsrc/pkgtools/libnbcompat/files/configure, ajouter l.5913: "enable_bsd_getopt=no" et supprimer la ligne 720
--- configure.orig  2025-03-05 12:54:23.000000000 +0100
+++ configure   2025-11-15 18:13:26.849578264 +0100
@@ -717,7 +717,6 @@
 ac_user_opts='
 enable_option_checking
 enable_db
-enable_bsd_getopt
 '
       ac_precious_vars='build_alias
 host_alias
@@ -5910,7 +5909,7 @@
 fi

 done
-
+enable_bsd_getopt=no
 if test "$enable_bsd_getopt" = yes; then
    if test "$ac_cv_have_decl_optreset" = no; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Using included getopt and getopt_long" >&5

awk est introuvable

  • Cause: /bin/awk n'est pas installé sur le système de base awk
  • Résolution : ajouter awk à partir de l'archive disponible, mais se trouve dans /usr/bin. Actualiser le fichier tools.FreeMiNT.mk
  • Pourquoi : awk, comme d'autres outils, est nécessaire. Le système de base de NetBSD inclut déjà de très nombreuses commandes, dont awk
--- tools.FreeMiNT.mk.orig  2023-03-05 00:29:24.000000000 +0100
+++ tools.FreeMiNT.mk   2025-11-15 19:54:09.123705473 +0100
@@ -3,7 +3,7 @@
 # System-supplied tools for the FreeMiNT operating system.

 TOOLS_PLATFORM.[?=     [           # shell builtin
-TOOLS_PLATFORM.awk?=       /bin/awk
+TOOLS_PLATFORM.awk?=       /usr/bin/awk
 TOOLS_PLATFORM.basename?=  /bin/basename
 TOOLS_PLATFORM.byacc?=     /usr/bin/yacc
 TOOLS_PLATFORM.bzcat?=     /usr/bin/bzcat

Erreur: dlopen() est requis

  • Cause : inconnue dlopen
  • Résolution : inconnue
  • Pourquoi : inconnu

Erreur d'accès au dossier libnbcompat/work/.destdir/pkg

  • Cause : un dossier pkg est créé avec les droits ̀d---------` operation_not_permitted
  • Résolution : pas encore trouvée. Un contournement consiste à modifier WRKOBJDIR directement dans le script bootstrap. Utiliser WRKOBJDIR= /ram
  • Pourquoi : pas encore trouvé
--- bootstrap.old   2025-11-15 15:49:55.875815746 +0100
+++ bootstrap   2025-11-15 22:05:25.508120615 +0100
@@ -1414,7 +1414,7 @@
 # opsys specific fiddling
 opsys_finish

-echo "WRKOBJDIR=       ${wrkdir}/wrk" >> ${BOOTSTRAP_MKCONF}
+echo "WRKOBJDIR=       /ram" >> ${BOOTSTRAP_MKCONF}

 echo "" >> ${TARGET_MKCONF}
 echo "" >> ${BOOTSTRAP_MKCONF}

Des fichiers sont introuvables

  • Cause: la fonction cp -r échoue
  • Résolution: A diagnostiquer. Fonctionne correctement avec les outils mintelf mais pas avec ceux de type mint.
  • Pourquoi: Erreur memory exhausted. Problème de récurisivité sans doute

Erreur umask

  • Cause: la valeur par défaut est 0000 umask
  • Résolution: exécuter 'umask 0022' avant de lancer le script bootstrap.
  • Pourquoi: 0022 est la valeur minimale attendue. En théorie elle devrait être définie par le script mais la bonne valeur semble nécessaire avant l'appel à umask

Plantage de diff

  • Cause : inconnue diff
  • Résolution : inconnu
  • Pourquoi : à chercher
  • Détails :
    • diff f1 f2 fonctionne
    • diff -u f1 f2 fonctionne si les fichiers sont identiques
    • diff -u f1 f2 plante si les fichiers sont différents

Plantage de sed

  • Cause : inconnue sed
  • Résolution : inconnue
  • Pourquoi : à chercher

Plantage de wc

  • Cause : mbrtowc() and iswspace() plantent wc
  • Résolution : remplacer ces deux fonctions par des fonctions qui n'utilisent pas les wchar
  • Pourquoi : sans doute un bug dans la MiNTLib
    • Récupérer le source ici
    • Remplacer iswspace(*WC) par isspace(*WC)
    • Remplacer r = mbrtowc(wc, p, len, st); par r = fake_mbrtowc(wc, p, len, st);
    • Ajouter :
      size_t fake_mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) {
          if (s == NULL)
              return 0;
          if (n == 0)
              return (size_t)-2;
          if (pwc)
              *pwc = (unsigned char)*s;
          return (*s != '\0') ? 1 : 0;
      }
    • Recompiler gcc wc.c -o wc

Echec avec mman.h (netpgpverify)

  • Cause: les fichiers libverify.c et pgpsum.c incluent mman.h mman
  • Résolution: Remplacer les appels mmap()/munmap() par malloc()/free().
  • Pourquoi: mmap() n'est pas disponible sur FreeMiNT
  • pkgsrc/security/netpgpverify/files/libverify.c
--- libverify.c.orig    2020-11-01 12:28:35.000000000 +0100
+++ libverify.c 2025-11-16 06:56:37.670741897 +0100
@@ -27,7 +27,9 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/param.h>
+#if 0
 #include <sys/mman.h>
+#endif

 #include <arpa/inet.h>

@@ -473,9 +475,27 @@
    }
    fstat(fileno(mem->fp), &st);
    mem->size = (size_t)st.st_size;
+#if 0  
    mem->mem = mmap(NULL, mem->size, PROT_READ, MAP_SHARED, fileno(mem->fp), 0);
    mem->dealloc = UNMAP_MEM;
    return 1;
+#endif
+#if 1
+   mem->mem = malloc(mem->size);
+   if (mem->mem == NULL) {
+       fprintf(stderr, "malloc failed for '%s'\n", f);
+       fclose(mem->fp);
+       return 0;
+   }
+   if (fread(mem->mem, 1, mem->size, mem->fp) != mem->size) {
+       fprintf(stderr, "short read on '%s'\n", f);
+       free(mem->mem);
+       fclose(mem->fp);
+       return 0;
+   }
+    mem->dealloc = FREE_MEM;
+    return 1;
+#endif 
 }

 /* DTRT and free resources */
@@ -488,7 +508,9 @@
        mem->size = 0;
        break;
    case UNMAP_MEM:
+#if 0  
        munmap(mem->mem, mem->size);
+#endif     
        fclose(mem->fp);
        break;
    }
  • pkgsrc/security/netpgpverify/files/pgpsum.c
--- pgpsum.c.orig   2020-05-04 03:37:28.000000000 +0200
+++ pgpsum.c    2025-11-16 07:01:19.621761352 +0100
@@ -26,7 +26,9 @@

 #include <sys/types.h>
 #include <sys/stat.h>
+#if 0
 #include <sys/mman.h>
+#endif

 #include <inttypes.h>
 #include <stdio.h>
@@ -225,14 +227,35 @@
        goto done;
    }
    cc = (size_t)(st.st_size);
+#if 0
    if ((mem = mmap(NULL, cc, PROT_READ, MAP_SHARED, fileno(fp), 0)) == MAP_FAILED) {
        fprintf(stderr, "%s - can't mmap", name);
        goto done;
    }
+#endif
+#if 1
+    mem = malloc(cc);
+    if (mem == NULL) {
+        fprintf(stderr, "%s - can't allocate %zu bytes\n", name, cc);
+        goto done;
+    }
+    if (fread(mem, 1, cc, fp) != cc) {
+        fprintf(stderr, "%s - short read or read error\n", name);
+        free(mem);
+        mem = NULL;
+        goto done;
+    }
+#endif 
    ret = calcsum(data, size, mem, cc, hashed, hashsize, doarmor);
 done:
    if (data) {
+#if 0
        munmap(mem, cc);
+#endif
+#if 1
+        if (mem)
+            free(mem);
+#endif     
    }
    fclose(fp);
    return ret;

Le dossier /usr/pkg existe déjà

  • Cause: le script bootstrap vérifie l'existence du dossier
  • Résolution: Supprimer le test dans le script bootstrap
  • Pourquoi: même raison que pour workdir

La commande hostname renvoie (null)

  • Cause: hostname n'est pas défini hostname
  • Résolution: Créer un fichier /etc/hostname et mettre le nom de l'ordinateur dedans.
  • Pourquoi: la commande renvoie le contenu de ce fichier

Blocage sur la recherche de fichiers plus récents que le fichier configure

  • Cause: configure cherche s'il existe des fichiers plus récents que lui auquel cas il faudra le relancer mais ce test échoue
  • Résolution: faire 'find . -name configure -exec touch {} \;' sur le dossier.
  • Pourquoi: à cause des modifications apportées aux fichiers .c pendant les tentatives de patchs pour faire fonctionner bootstrap, ces fichiers ont des dates actualisées et donc plus récentes que celle du script configure qui les utilise. En donnant à tous les fichiers configure la date en actuelle, aucun autre fichier ne peut être plus récent, et le test passe. La cause du blocage est inconnue (lenteur des tests des dates des fichiers ?).

commande introuvable --modversion

  • Cause: la commande pkg-config est introuvable ou renvoie une chaine vide command_not_found
  • Résolution: installer pkg-config s'il est absent, ou le copier dans .tools/bin/ s'il y a un script du même nom mais qui ne renvoie rien.
  • Pourquoi: soit pkg-config est absent, soit c'est un script qui ne renvoie rien (auquel cas le test d'une version supérieure à 0.9.0 échoue, alors que la version existante renvoie 0.15.0)
cp /usr/bin/pkg-config /ram/pkgtools/libnbcompat/work/.tools/bin/
cp /usr/bin/pkg-config /ram/pkgtools/boostrap-mk-files/work/.tools/bin/
cp /usr/bin/pkg-config /ram/pkgtools/pkg_install/work/.tools/bin/

L'entrée de tsort contient un nombre impair de tokens

  • Cause : inconnue

tsort

  • Résolution : inconnue
  • Pourquoi : inconnu

Commande introuvable ac_fn_c_try_link

  • Cause : inconnue

ac_fn_c_try_link

  • Résolution : inconnue
  • Pourquoi : inconnu

Echec de la liaison de pkg_install avec libfetch

  • Cause : le fichier libfetch.a est bien créé mais il ne contient aucun symbole ! undefined_ref

  • Résolution : Supprimer de tous les programmes qui utilisent libfetch les appels de fonctions à cette bibliothèque. Attention, les fichiers concernés (parse-config.c, pkg_io.c, audit.c et main.c) sont à copier depuis leur emplacement dans /usr/pkgsrc/pkgtools/pkg_install/files vers l'emplacement correspondant dans /ram/pkgtools/pkg_install/work/pkg_install-20250417/.

  • Pourquoi : la commande tsort échoue

  • File /usr/pkgsrc/pkgtools/pkg_install/files/lib/parse-config.c

--- parse-config.c.orig 2020-12-11 11:06:53.000000000 +0100
+++ parse-config.c  2025-11-16 09:36:36.580951685 +0100
@@ -46,9 +46,11 @@
 #include <string.h>
 #endif

+#if 0
 #ifndef BOOTSTRAP
 #include <fetch.h>
 #endif
+#endif

 #include "lib.h"

@@ -240,9 +242,11 @@
    }
    config_cache_connections_host = xasprintf("%d", cache_connections_host);

+#if 0
 #ifndef BOOTSTRAP
    fetchConnectionCacheInit(cache_connections, cache_connections_host);
 #endif
+#endif

    snprintf(fetch_flags, sizeof(fetch_flags), "%s%s%s%s",
        (do_cache_index) ? "c" : "",
  • File /usr/pkgsrc/pkgtools/pkg_install/files/lib/pkg_io.c
--- pkg_io.c.orig   2023-11-08 02:24:29.000000000 +0100
+++ pkg_io.c    2025-11-16 09:43:49.598979501 +0100
@@ -79,7 +79,10 @@
 {
    struct fetch_archive *f = client_data;
    struct url_stat us;
-
+#if 1
+    return ENOENT;
+#endif 
+#if 0
    f->fetch = fetchXGet(f->url, &us, fetch_flags);
    if (f->fetch == NULL)
        return ENOENT;
@@ -87,8 +90,10 @@
    f->restart = 1;
    f->url->offset = 0;
    return 0;
+#endif 
 }

+#if 0
 static ssize_t
 fetch_archive_read(struct archive *a, void *client_data,
     const void **buffer)
@@ -140,13 +145,14 @@
    free(f);
    return 0;
 }
+#endif

 static struct archive *
 open_archive_by_url(struct url *url, char **archive_name)
 {
    struct fetch_archive *f;
    struct archive *a;
-
+#if 0
    f = xmalloc(sizeof(*f));
    f->url = fetchCopyURL(url);

@@ -162,6 +168,11 @@
    }

    return a;
+#endif
+#if 1
+    *archive_name = NULL;
+    return NULL;
+#endif 
 }
 #endif /* !BOOTSTRAP */

@@ -201,6 +212,7 @@
 #ifdef BOOTSTRAP
    return NULL;
 #else
+#if 0
    if ((u = fetchParseURL(url)) == NULL)
        return NULL;

@@ -209,9 +221,14 @@
    fetchFreeURL(u);
    return a;
 #endif
+#if 1
+    return NULL;
+#endif
+#endif
 }

 #ifndef BOOTSTRAP
+#if 0
 static int
 strip_suffix(char *filename)
 {
@@ -227,6 +244,7 @@
    } else
        return 0;
 }
+#endif

 static int
 find_best_package_int(struct url *url, const char *pattern,
@@ -235,7 +253,10 @@
    char *cur_match, *url_pattern, *best_match = NULL;
    struct url_list ue;
    size_t i;
-
+#if 1
+    return -1;
+#endif
+#if 0
    if (*best_url) {
        if ((best_match = fetchUnquoteFilename(*best_url)) == NULL)
            return -1;
@@ -296,6 +317,7 @@
    free(best_match);
    fetchFreeURLList(&ue);
    return 0;
+#endif
 }

 void
@@ -334,7 +356,7 @@
 {
    struct url *url, *best_match = NULL;
    struct pkg_path *pl;
-
+#if 0
    if (toplevel) {
        url = fetchParseURL(last_toplevel);
        if (url != NULL) {
@@ -354,7 +376,7 @@
            fetchFreeURL(url);
        }
    }
-
+#endif
    return best_match;
 }
 #endif /* !BOOTSTRAP */
@@ -392,7 +414,7 @@
 #ifndef BOOTSTRAP
    fname = last_slash + 1;
    *last_slash = '\0';
-
+#if 0
    best_match = find_best_package(full_fname, fname, 0);

    if (search_path && best_match == NULL)
@@ -404,6 +426,10 @@
        return NULL;
    a = open_archive_by_url(best_match, archive_name);
    fetchFreeURL(best_match);
+#endif
+#if 1
+   return NULL;
+#endif
 #endif /* !BOOTSTRAP */
    return a;
 }
  • File /usr/pkgsrc/pkgtools/pkg_install/files/admin/audit.c
--- audit.c.orig    2018-02-27 00:45:02.000000000 +0100
+++ audit.c 2025-11-16 09:54:00.974240159 +0100
@@ -86,8 +86,9 @@
 parse_options(int argc, char **argv, const char *options)
 {
    int ch;
-
+#if 0
    optreset = 1;
+#endif 
    /*
     * optind == 0 is interpreted as partial reset request
     * by GNU getopt, so compensate against this and cleanup
@@ -298,7 +299,9 @@
    ssize_t cur_fetched;
    struct url *url;
    struct url_stat st;
+#if 0  
    fetchIO *f;
+#endif 
    int fd;
    struct stat sb;
    char my_flags[20];
@@ -310,7 +313,11 @@

    if (verbose >= 2)
        fprintf(stderr, "Fetching %s\n", pkg_vulnerabilities_url);
-
+#if 1
+    errx(EXIT_FAILURE,
+           "Could not parse location of pkg_vulnerabilities: no support for MiNT");
+#endif
+#if 0
    url = fetchParseURL(pkg_vulnerabilities_url);
    if (url == NULL)
        errx(EXIT_FAILURE,
@@ -382,6 +389,7 @@
    free(buf);

    exit(EXIT_SUCCESS);
+#endif 
 }

 static int
  • File /usr/pkgsrc/pkgtools/pkg_install/files/admin/main.c
--- main.c.orig 2025-02-18 13:04:31.000000000 +0100
+++ main.c  2025-11-16 09:55:26.829210996 +0100
@@ -734,6 +734,7 @@
            errx(EXIT_FAILURE, "invalid license");
        }
    }
+#if 0
 #ifndef BOOTSTRAP
    else if (strcasecmp(argv[0], "findbest") == 0) {
        struct url *url;
@@ -806,6 +807,7 @@
        pkg_sign_gpg(argv[0], argv[1]);
    }
 #endif
+#endif
    else {
        usage();
    }

Référence indéfinie vers optreset

  • Cause : la variable externe optreset n'est pas trouvée optreset
  • Résolution : inconnue
  • Pourquoi : optreset n'est pas défini dans la MiNTLib

Les commandes bmake et pkg_xxx sont introuvables

  • Cause : La variable PATH doit être modifiée manuellement pkgtools_not_found
  • Résolution : Éditer le fichier mint.cnf et modifier le PATH setenv PATH /usr/pkg/sbin;/usr/pkg/bin;/sbin;/bin;/usr/sbin;/usr/bin
  • Pourquoi : comportement normal, RTFM

La licence est refusée

  • Cause : les licences non libres sont refusées par défaut license
  • Résolution : ajouter la licence concerné dans le fichier /usr/pkg/etc/mk.conf
  • Pourquoi : comportement normal, RTFM

fetch échoue lors de l'appel de bmake

  • Cause : les fichiers sources du paquets sont absentes et il n'y a pas de réseau distfiles
  • Résolution : télécharger l'archive voulue et la copier dans le dossier /usr/pkgsrc/distfiles
  • Pourquoi : comportement normal, RTFM

Erreur sur strerror_r : les types int et char * ne correspondent pas

  • Cause : la valeur de retour char * est comparée à un int strerror
  • Résolution : à chercher
  • Pourquoi : POSIX attend une valeur de retour de type int, GNU renvoie char *

Impossible d'écrire l'archive à cause des droits d'accès

  • Cause : destdir contient des liens entre /ram et /c cannot_write_archive
  • Résolution : supprimer les liens, les remplacer par une copie du fichier et relancer bmake package
  • Pourquoi :

Précédent Suivant