Question

J'ai eu du mal à faire en sorte que mes makefiles fonctionnent comme je le veux. Tout d’abord, je voudrais dire que c’est POSIX, comme dans http: / /www.opengroup.org/onlinepubs/009695399/utilities/make.html J'ai besoin que mon système de compilation fonctionne avec les BSD et les GNU (Linux).

Ce qui me manque, c’est un makefile sans maintenance. Je veux simplement compiler tous les fichiers .c et .asm dans src / et placer les fichiers objets dans objs /, puis lier le tout dans objs / à un fichier binaire.

Je peux faire beaucoup, mais je ne parviens pas à séparer les fichiers source et obj.

Je suis d'accord si cela nécessite un peu de script shell intégré (en utilisant / bin / sh, défini par POSIX), mais je ne peux tout simplement pas faire en sorte que les dépendances fonctionnent correctement. Je veux qu'il construise le fichier objet uniquement si le fichier source est plus récent.

Mon plus proche est le suivant:

${C_OBJS}: ${HDRS} ${*:objs/%=src/%}.c
    ${CC} ${CFLAGS} -c ${*:objs/%=src/%}.c -o $*.o

Cela pose le problème que je dois quand même spécifier C_OBJS = objs / foo.o, etc.

Était-ce utile?

La solution

La version POSIX de make ne prend pas explicitement en charge les noms de fichiers contenant des barres obliques, et ne prévoit pas non plus de séparer les fichiers source situés dans un répertoire différent des fichiers objets. Et, comme l'a noté @caskey, il ne prend en charge aucune notation utilisant des caractères '%', bien qu'il note que de telles règles existent et recommande de les réserver pour une utilisation en tant que métacaractères.

Par conséquent, vous ne pouvez probablement pas faire ce que vous voulez avec POSIX standard make.

En pratique, vous pouvez souvent faire ce que vous cherchez avec des implémentations spécifiques de makefile, mais la cmake résultante a une portabilité limitée.

Pensez à utiliser un système de génération de makefile quelconque - autoconf ou les outils automatiques (libtool, automake, <=>, etc.). Ou l’un des nombreux remaniements des concepts de base de <=>:

  • scons
  • ant
  • gâteau
  • cuisinier
  • soutiens-gorge
  • ... et une douzaine de personnes que j'ai oubliées ou que je n'ai pas entendu parler de ...

Autres conseils

La marque POSIX ne supporte pas les constructions comme?

  objs/%.o : src/%.c
    ${CC} ${CFLAGS} -c $< -o $@

Oublié le point d'interrogation à la fin, j'espère que mon commentaire sera plus clair.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top