2010-01-25 8 views
9

Oltre al fatto che bmake è un equivalente BSD di GNU make, non ho potuto capire chiaramente i vantaggi rispetto a GNU make. Qualcuno può aiutarmi? Sono stato in grado di trovare solo uno resource che è stato un po 'utile. Più aiuto o suggerimenti sono apprezzati.Merits of bmake

Grazie, Prabhu

risposta

2

non sto usando, ma la mia comprensione è che il BSD make è un programma make + una libreria standard di modelli (vale a dire più o meno l'equivalente di GNU make + automake e forse autoconf).

2

Ogni volta che si confrontano le utilità GNU con le utilità BSD, tenere presente che la maggior parte delle persone che effettuano confronti considereranno le licenze come una funzionalità o un bug di per sé e che metà degli sviluppatori che fanno un confronto preferiscono una licenza permissiva e metà favorire una licenza virale GPL-like. Questo non vuol dire che non ci siano vere differenze (a volte ci sono, ma spesso è un lavaggio).

bmake non è così ingombrante come GNU make ed entrambi sono compatibili con la maggior parte dei makefile scritti a mano (e se si generano makefile con autotools, gli autotools sono in grado di generare makefile compatibili con uno o entrambi).

L'unico chiaro vantaggio per quanto posso dire è che utilizzarlo soddisferà le persone che sono patologicamente impaurite dalla GPL. Ma l'autore di bmake afferma che è il risultato del tentativo di applicare patch a pmake (il normale make di BSD) per accettare l'output degli autotools. Considerato il problema che ho provato a capire per capire i makefile generati dagli autotools, sono sospettoso di quanto successo abbia avuto. Altre persone fanno altre affermazioni, alcune delle quali non hanno senso.

Alla fine, se ci si attiene agli elementi standard dei makefile e non ci si allontana troppo da POSIX, non dovrebbe essere troppo importante per utilizzarlo.

2

Il marchio BSD può generare target, in base a condizioni o all'interno di loop. Questo è abbastanza utile a volte.

10

BSD make e GNU make sono entrambi sostituzioni gratuite per la marca originale AT & T. La principale differenza è avere una sintassi diversa per le funzionalità avanzate. Ecco come mettere l'output di un comando di shell in una variabile in BSD marca:

# BSD make 
TODAY != date +%Y-%m-%d 

E in GNU make:

# GNU make 
TODAY = $(shell date +%Y-%m-%d) 

Non appena qualcuno scrive $(shell ...) in un Makefile, si requries GNU rendere. A causa della diversa sintassi, alcuni pacchetti richiedono GNU make per la build, e alcuni richiedono BSD make.

BSD make ha iniziato la sua vita come pmake, abbreviazione di make parallelo. Il suo autore, Adam de Boor, ha descritto PMake in PMake -- A Tutorial. Il merito era la nuova capacità di eseguire lavori in parallelo, come in make -j 3. Questa modalità parallela ha rotto la compatibilità eseguendo tutti i comandi per ciascun target in una singola shell, non in una shell per riga. GNU make ha una modalità parallela, anche -j, che mantiene una shell per riga. NetBSD make(1) ora ha make -B -j 3 per eseguire la modalità parallela con una shell per riga. OpenBSD make(1) ora esegue sempre la modalità parallela con una shell per linea.

4.3BSD-Reno incluso PMake come make e bsd. *. Mk include i file. Questi includono i file sono la migliore caratteristica del marchio BSD.src/bin/sed/Makefile in 4.3BSD-Tahoe (la versione precedente a 4.3BSD-Reno) definisce diversi obiettivi come clean, depend, install e così via. src/usr.bin/sed/Makefile in 4.3BSD-Reno ha solo quattro righe non vuote:

# @(#)Makefile 4.6 (Berkeley) 5/11/90 

PROG= sed 
SRCS= sed0.c sed1.c 

.include <bsd.prog.mk> 

Qui bsd.prog.mk imposta automaticamente OBJS a sed0.o sed1.o, definisce un obiettivo sed per LINK sed da quegli oggetti, definisce altri obiettivi come pulito, dipenderà, installare e fa sì che make install installi sia sed che la sua pagina manuale sed.1. C'è anche bsd.lib.mk per la costruzione di librerie.

Quando si utilizza bsd. *. Mk, ciascun Makefile può creare solo un programma o una libreria. Per crearne un altro, ci deve essere un secondo Makefile in un'altra directory. Quindi, src/usr.sbin/smtpd/ in OpenBSD ha sei sottodirectory, dove ogni sottodirectory contiene solo un Makefile, perché smtpd crea sei programmi.

È anche raro usare bsd. *. Mk per costruire qualsiasi cosa eccetto BSD stesso. Molti pacchetti portabili da sviluppatori BSD, come OpenSSH (da OpenBSD) o mksh (da MirBSD), non richiedono BSD make e non usano file bsd. *. Mk.

Il file bsd.port.mk è al centro di FreeBSD Ports, il sistema che crea pacchetti software per FreeBSD. (NetBSD pkgsrc chiama questo file bsd.pkg.mk.) Questo sistema ha rivali in altri linguaggi di scripting. Homebrew usa Ruby. MacPorts usa Tcl.

In passato, la marca GNU era più portatile della marca BSD. Poiché BSD fa parte di BSD, è raro trovare BSD make su altri sistemi. Ora c'è portable bmake per altri sistemi. Questa è una versione portatile di NetBSD make. L'uso più comune di bmake portabile è eseguire pkgsrc su sistemi non NetBSD. Corro pkgsrc su OS X, con bmake avviato da pkgsrc.

+1

gmake 4.x ha aggiunto il supporto per la sintassi '! ='. –

3

Sto scrivendo BSD Owl, un sistema di creazione portatile basato su BSD Make. Ho iniziato a scrivere Makefile nel 2000 con GNU Make e rapidamente passato a BSD Make. Lasciatemi delineare le ragioni che hanno guidato la mia scelta.

documentazione e letteratura disponibile

Questo è il punto principale, davvero. Mentre il progetto GNU ha fornito al mondo del software libero una parte di software impressionante e importante, la documentazione non distingue nettamente tra user manual and reference manual, una caratteristica coerente della documentazione GNU. Di conseguenza, la documentazione di GNU Make è un documento huge (ben oltre 200 pagine) che alterna un'attenta descrizione di ogni aspetto del sistema con esempi di giocattoli. Quando l'ho usato, non ho mai trovato questi esempi utili, perché non sono affatto vicini a casi d'uso reali e hanno sempre avuto bisogno di diversi minuti per localizzare o spostare le informazioni che dovevo cercare. Il corpus di letteratura disponibile per GNU Make è davvero enorme, tuttavia è molto difficile trovare esempi interessanti che possano guidarci nella scrittura di un sistema di compilazione portatile completo come . Forse è perché i progetti si basano su automake invece di scrivere direttamente i Makefile. Forse è perché non ho cercato abbastanza duramente.

Lo stato delle cose era molto meglio sul lato di FreeBSD. Infatti,

  • Esiste un tutorial o un manuale utente di Adam de Boor.
  • Il manual page funge anche da manuale di riferimento ed è ben inferiore a 30 pagine.
  • Il sistema di generazione di FreeBSD e il sistema di porte di FreeBSD sono un insieme di makefile scritti a mano.

Naturalmente la pagina di manuale di BSD Make non è così dettagliata come il manuale di GNU Make, ma è molto più densa e più facile da usare. I sistemi di build di FreeBSD sono allo stesso tempo (a) una prova del concetto che BSD Make può orchestrare la costruzione di progetti complessi di grandi dimensioni e (b) una vetrina di tecniche avanzate nell'arte della scrittura Makefile.

Programmazione caratteristiche

Una cosa molto divertente è che le caratteristiche di programmazione di GNU Make sembrano molto più potente di quello BSD Fai fornire. Tuttavia, li ho trovati incredibilmente difficili da usare, soprattutto a causa dell'ordine di espansione, e per la mancanza di esempi utili. BSD Make ha molti meno costrutti e funzioni, ma sono molto solidi e facili da usare: la maggior parte del codice che ho bisogno di scrivere sono condizionali e loop per definire liste di bersagli e BSD Make lo fa in modo molto semplice e affidabile. caratteristiche

avanzata

BSD Costruttore ha una funzione avanzata che GNU Make non ha - per quanto ne so - è chiamata la meta modalità. La parte più difficile della scrittura di Makefile consiste nel specificare correttamente gli elenchi di prerequisiti in un pacchetto. Alcuni software come mkdep(1) cercano di automatizzare il processo analizzando le fonti. BSD Make ha un approccio diverso: scriviamo un Makefile con dipendenze probabilmente errate (incomplete), ma abbastanza precisi per costruire con successo il pacchetto. Durante il processo, BSD esegue il monitoraggio I/O utilizzando filemon(4) per determinare l'elenco effettivo dei prerequisiti.