Kullanım
m4 [-EGgPs] [-Dname[=value]] [-d [[+-]flags]] [-I dirname] [-o filename] [-t macro] [-Uname]
[file ...]
Açıklama
m4 yardımcı aracı, herhangi bir dile (örneğin C, ratfor, fortran, lex ve yacc) ön uç olarak kullanılabilen bir makro işlemcidir. Herhangi bir girdi dosyası verilmezse m4 standart girdiden okuma yapar, aksi takdirde komut satırında belirtilen dosyalar verilen sırayla işlenir. Girdi dosyaları; normal dosyalar, m4 içe aktarma (include) yollarındaki dosyalar veya standart girdiyi belirten tek bir tire işareti (‘-’) olabilir. Aksi belirtilmedikçe, m4 işlenen metni standart çıktıya yazar.
Makro çağrıları ad(argüman1[, argüman2, ..., argümanN]) biçimindedir.
Makro adı ile açılış parantezi (‘(’) arasında herhangi bir boşluk olamaz. Makro adından sonra açılış parantezi gelmiyorsa, makro argümansız olarak işlenir.
Makro adları, başında bir harf veya alt çizgi ile başlar ve ardından alfasayısal karakterler veya alt çizgi karakterleri gelebilir; örneğin, geçerli makro adları “[a-zA-Z_][a-zA-Z0-9_]*” kalıbıyla eşleşir.
Makrolara verilen argümanlarda, tırnak içine alınmamış baştaki boşluk, sekme (tab) ve yeni satır (‘\n’) karakterleri yoksayılır. Dizgileri tırnak içine almak (alıntılamak) için sol ve sağ tek tırnak işaretlerini kullanın (örneğin, ‘ başında boşluk olan bir dizgi’). Tırnak karakterlerini changequote yerleşik makrosu ile değiştirebilirsiniz.
Çoğu yerleşik makro argümansız olarak bir anlam ifade etmez ve bu nedenle arkasından açılış parantezi gelmediğinde özel bir makro olarak tanınmaz.
Seçenekler aşağıdaki gibidir:
-Dname[=value], --define=name[=value] name sembolünü bir değerle (veya NULL) tanımlar.
-d [[+|-]flags], --debug=[[+|-]flags] Izleme bayraklarını ayarlar veya kaldırır. İzleme bayrakları aşağıdaki gibidir:
a makro argümanlarını yazdırır.
c makro açılımını birkaç satır halinde yazdırır.
e makro açılımının sonucunu yazdırır.
f dosya adı konumunu yazdırır.
l satır numarasını yazdırır.
q argümanları ve açılımı mevcut tırnak işaretleriyle tırnak içine alır.
t tüm makroların izlenmesiyle başlar.
x makro açılımlarını numaralandırır.
V tüm seçenekleri etkinleştirir.
Eğer "+" veya "-" kullanılırsa, belirtilen bayraklar sırasıyla aktif izleme bayrakları kümesine eklenir veya bu kümeden çıkarılır; aksi takdirde, belirtilen bayraklar aktif izleme bayrakları kümesinin yerini alır.
Bu seçeneğin argümansız olarak belirtilmesi, "aeq" argümanıyla belirtilmesine eşdeğerdir.
Varsayılan olarak, izleme "eq" olarak ayarlanmıştır.
-E, --fatal-warnings Uyarıları ölümcül (fatal) olarak ayarlar. Tek bir -E bayrağı belirtildiğinde, uyarılar verilse bile yürütme devam eder ancak m4 sıfır olmayan bir çıkış durumuyla sonlanır. Birden fazla -E bayrağı belirtildiğinde, ilk uyarının verilmesiyle yürütme durdurulur ve m4 sıfır olmayan bir çıkış durumuyla sonlanır. Bu davranış GNU m4 1.4.9 ve sonraki sürümlerle eşleşir.
-G, --traditional GNU uyumluluk modunu devre dışı bırakır (aşağıdaki -g seçeneğine bakın).
-g, --gnu GNU uyumluluk modunu etkinleştirir. Bu modda translit basit karakter aralıklarını (örneğin ‘a-z’) işler, düzenli ifadeler (regular expressions) Emacs davranışını taklit eder, birden fazla m4wrap çağrısı bir yığın (stack) olarak ele alınır, yönlendirme (diversion) sayısı sınırsızdır, makro tanımları için boş adlara izin verilir, dosyaları dahil etmek için undivert kullanılabilir ve eval ‘0rtaban:değer’ sayılarını anlar.
macOS işletim sisteminde bu seçenek varsayılan olarak etkindir. Geleneksel davranışa dönmek için -G seçeneğini kullanın.
-I dirname, --include=dirname dirname dizinini dahil etme (include) yoluna ekler.
-o filename, --error-output=filename Izleme çıktısını filename dosyasına gönderir.
-P, --prefix-builtins Tüm yerleşik makroların başına ‘m4_’ önekini ekler. Örneğin, define yazmak yerine m4_define kullanın.
-s, --synclines cpp(1) için uygun satır senkronizasyonu yönergeleri çıktısı üretir.
-t macro, --trace=macro macro için izlemeyi etkinleştirir.
-Uname, --undefine=name name sembolünün tanımını kaldırır.
Sözdizimi
m4 aşağıdaki yerleşik makroları sağlar. Bunlar yeniden tanımlanabilir ve bu durumda orijinal anlamlarını kaybederler. Aksi belirtilmedikçe dönüş değerleri boştur (null).
builtin(name) Olası yeniden tanımlamaları geçersiz kılarak, yerleşik bir makroyu adıyla çağırır.
changecom(startcomment, endcomment) Yorum başlangıç ve yorum bitiş dizilerini değiştirir. Yorum dizileri en fazla beş karakter uzunluğunda olabilir. Varsayılan değerler diyez işareti (#) ve yeni satır karakteridir.
Bu bir yorumdur
Argümansız olarak, yorumlar devre dışı bırakılır. Tek bir argümanla, yorum bitiş dizisi yeni satır karakteri olarak ayarlanır.
changequote(beginquote, endquote) Açılış tırnağı ve kapanış tırnağı dizilerini tanımlar. Tırnak dizileri en fazla beş karakter uzunluğunda olabilir. Varsayılan değerler ters tırnak (backquote) karakteri ve tek tırnak karakteridir.
`İşte tırnak içine alınmış bir dizgi'
Argümansız olarak, varsayılan tırnak işaretleri geri yüklenir. Tek bir argümanla, kapanış tırnağı dizisi yeni satır karakteri olarak ayarlanır.
decr(arg) arg argümanını 1 azaltır. arg argümanı geçerli bir sayısal dizgi olmalıdır.
define(name, value) İlk argüman olan name ile adlandırılan yeni bir makro tanımlar ve bu makroya ikinci argüman olan value değerini atar. Her ‘$n’ (n, 0 ile 9 arasındadır) ifadesi n. argümanla değiştirilir. ‘$0’ çağıran makronun adıdır. Tanımlanmamış argümanlar boş bir dizgiyle değiştirilir. ‘$#’ argüman sayısıyla değiştirilir; ‘$’ virgülle ayrılmış tüm argümanlarla değiştirilir; ‘$@’ ise ‘$’ ile aynıdır ancak tüm argümanlar sonraki açılımlara karşı tırnak içine alınır.
defn(name, ...) Her argüman için tırnak içine alınmış tanımı döndürür. Bu, makro tanımlarını (yerleşik makrolar dahil) yeniden adlandırmak için kullanılabilir.
divert(num) 10 adet çıktı kuyruğu vardır (0-9 arası numaralandırılmış). İşleme sonunda m4, nihai çıktıyı üretmek için tüm kuyrukları sayısal sırayla birleştirir. Başlangıçta çıktı kuyruğu 0'dır. divert makrosu yeni bir çıktı kuyruğu seçmenize olanak tanır (divert makrosuna geçersiz bir argüman aktarılması çıktının atılmasına neden olur).
divnum Geçerli çıktı kuyruğu numarasını döndürür.
dnl Bir sonraki yeni satır karakterine kadar olan (yeni satır dahil) girdi karakterlerini atar.
dumpdef(name, ...) Adlandırılmış ögelerin adlarını ve tanımlarını yazdırır veya argüman geçirilmezse her şeyi yazdırır.
errprint(msg) İlk argümanı standart hata çıktı akışına yazdırır.
esyscmd(cmd) İlk argümanını bir kabuğa (shell) aktarır ve kabuğun standart çıktısını döndürür. Kabuğun, standart girdisini ve standart hatasını m4 ile paylaştığını unutmayın.
eval(expr[,radix[,minimum]]) İlk argümanı 32 bitlik aritmetik kullanarak bir aritmetik ifade olarak hesaplar. Operatörler standart C üçlü (ternary), aritmetik, mantıksal, kaydırma, ilişkisel, bit düzeyinde ve parantez operatörleridir. C'de olduğu gibi sekizlik (octal), onluk (decimal) ve on altılık (hexadecimal) sayıları belirtebilirsiniz. İsteğe bağlı ikinci argüman radix, sonuç için tabanı belirtir ve isteğe bağlı üçüncü argüman minimum, sonuçtaki minimum basamak sayısını belirtir.
expr(expr) Bu, eval makrosunun bir takma adıdır.
format(formatstring, arg1, ...) printf(3) işlevine benzer bir şekilde, kaçış dizilerinin arg1 ve sonraki argümanlarla değiştirildiği formatstring dizgisini döndürür. Bu yerleşik makro yalnızca GNU-m4 uyumluluk modunda mevcuttur ve uygulanan yegane parametreler autoconf uyumluluğu için oradadır: sola hizalama bayrağı, isteğe bağlı bir alan genişliği, maksimum bir alan genişliği, * ile belirtilen alan genişlikleri ve %s ile %c veri türleri.
ifdef(name, yes, no) İlk argümanla adlandırılan makro tanımlanmışsa ikinci argümanı, aksi takdirde üçüncüyü döndürür. Üçüncü bir argüman yoksa değer NULL olur. "unix" sözcüğü önceden tanımlanmıştır.
ifelse(a, b, yes, ...) İlk argüman a ikinci argüman b ile eşleşirse, ifelse() üçüncü argüman yes değerini döndürür. Eşleşme başarısız olursa bu üç argüman atılır ve geriye sıfır veya bir argüman kalana kadar sonraki üç argüman kullanılır; başka bir eşleşme bulunamazsa bu son argüman veya NULL döndürür.
include(name) İlk argümanda belirtilen dosyanın içeriğini döndürür. Dosya olduğu gibi bulunamazsa, dahil etme yoluna bakın: önce komut satırında -I ile belirtilen dizinler, ardından iki nokta üst üste ile ayrılmış bir dizin listesi olarak M4PATH ortam değişkeni. Dosya dahil edilemezse, include bir hata mesajıyla sonlandırılır.
incr(arg) Argümanı 1 artırır. Argüman geçerli bir sayısal dizgi olmalıdır.
index(string, substring) İkinci argümanın ilk argümandaki indeksini döndürür (örneğin, index(the quick brown fox jumped, fox) 16 döndürür). İkinci argüman bulunamazsa index -1 döndürür.
indir(macro, arg1, ...) Adı ilk argüman olarak aktarılan makroyu, kalan argümanlar ilk, ... argümanlar olacak şekilde dolaylı olarak çağırır.
len(arg) İlk argümandaki karakter sayısını döndürür. Ek argümanlar yoksayılır.
m4exit(code) İlk argümanla belirtilen dönüş değeriyle (belirtilmemişse 0) derhal çıkış yapar.
m4wrap(todo) Genellikle temizlik amacıyla son EOF (dosya sonu) durumunda ne olacağını tanımlamanıza olanak tanır (örneğin, m4wrap("cleanup(tempfile)") ifadesi, diğer tüm işlemler tamamlandıktan sonra cleanup makrosunun çağrılmasına neden olur).
m4wrap() işlevine yapılan birden fazla çağrı, son EOF durumunda sırayla eklenir.
maketemp(template) mkstemp gibidir.
mkstemp(template) İlk argüman üzerinde mkstemp(3) işlevini çağırır ve değiştirilmiş dizgiyi döndürür. Bu, benzersiz geçici dosya adları oluşturmak için kullanılabilir.
paste(file) İlk argüman tarafından belirtilen dosyanın içeriğini herhangi bir makro işlemi yapmadan dahil eder. Dosya dahil edilemezse bir hata mesajıyla sonlandırılır.
patsubst(string, regexp, replacement) Bir dizgideki düzenli ifadeyi bir değiştirme dizgisiyle değiştirir. Standart değiştirme kalıpları geçerlidir: bir ve işareti (‘&’) düzenli ifadeyle eşleşen dizgiyle değiştirilir. ‘#’ bir basamak olmak üzere ‘#’ dizgisi, karşılık gelen geri başvuruyla (back-reference) değiştirilir.
popdef(arg, ...) Her argüman için pushdef ile saklanan tanımı geri yükler.
pushdef(macro, def) define ile aynı argümanları alır, ancak tanımı daha sonra popdef() tarafından alınmak üzere bir yığında kaydeder.
regexp(string, regexp, replacement) Bir dizgide bir düzenli ifade bulur. Başka argüman verilmezse, ilk eşleşme konumunu veya eşleşme yoksa -1 döndürür. Üçüncü bir argüman sağlanırsa, alt kalıpların değiştirildiği değiştirme dizgisini döndürür.
shift(arg1, ...) İlk argüman dışındaki tüm argümanları döndürür, kalan argümanlar tırnak içine alınır ve aralarına virgül konularak geri itilir. Tırnak içine alma, sonradan gerçekleştirilecek ek taramanın etkisini ortadan kaldırır.
sinclude(file) Hataları yoksayması dışında include makrosuna benzer.
spaste(file) Hataları yoksayması dışında paste() makrosuna benzer.
substr(string, offset, length) İkinci argümanla belirtilen ofsetten başlayan ve üçüncü argümanla belirtilen uzunluktaki ilk argümanın alt dizgisini döndürür. Üçüncü bir argüman yoksa dizginin geri kalanını döndürür.
syscmd(cmd) İlk argümanı kabuğa aktarır. Hiçbir şey döndürülmez.
sysval Son syscmd çağrısının dönüş değerini döndürür.
traceon(arg, ...) Belirtilen argümanlar için makro açılımlarının izlenmesini etkinleştirir veya herhangi bir argüman verilmezse tüm makrolar için etkinleştirir.
traceoff(arg, ...) Belirtilen argümanlar için makro açılımlarının izlenmesini devre dışı bırakır veya herhangi bir argüman verilmezse tüm makrolar için devre dışı bırakır.
translit(string, mapfrom, mapto) İlk argümandaki karakterleri, ikinci argümanla belirtilen kümeden üçüncü argümanla belirtilen kümeye dönüştürür (harf harf çevirir). tr(1) tarzı kısaltmaları kullanamazsınız.
undefine(name1, ...) Argümanları tarafından belirtilen makroların tanımını kaldırır.
undivert(arg, ...) Adlandırılmış çıktı kuyruklarını boşaltır (veya argüman yoksa tüm kuyrukları).
unix İşletim sistemi platformunu test etmek için önceden tanımlanmış bir makrodur.
line Geçerli dosyanın satır numarasını döndürür.
file Geçerli dosyanın adını döndürür.
Çıkış Durumu
m4 yardımcı aracı başarı durumunda 0 ile, bir hata oluştuğunda ise >0 ile çıkış yapar.
Ancak m4exit makrosunun ve -E bayrağının çıkış durumunu değiştirebileceğini unutmayın.
Ayrıca Bakınız
B. W. Kernighan ve D. M. Ritchie, The M4 Macro Processor, AT&T Bell Laboratories, Computing Science Technical Report, 59, Temmuz 1977.
Standartlar
m4 yardımcı aracı IEEE Std 1003.1-2008 (“POSIX.1”) spesifikasyonuyla uyumludur.
[-dEGgIPot] bayrakları ile builtin, esyscmd, expr, format, indir, paste, patsubst, regexp, spaste, unix, line ve file makroları bu spesifikasyona yapılan uzantılardır.
maketemp'in mkstemp için bir eş anlamlı olması değil, bunun yerine güvensiz bir geçici dosya adı oluşturma işlevi olması amaçlanmıştır. IEEE Std 1003.1-2008 (“POSIX.1”) tarafından kullanımdan kaldırılmakta (obsolescent) olduğu belirtilmiştir ve taşınabilirlik bir endişe kaynağıysa kullanılmamalıdır.
traceon ve dumpdef çıktılarının biçimi herhangi bir standartta belirtilmemiştir, değişmesi muhtemeldir ve bunlara güvenilmemelidir. Mevcut izleme biçimi, autoconf'un çalışabilmesini sağlamak için gnu-m4 modeline sıkı sıkıya dayanmaktadır.
Yerleşik pushdef ve popdef makroları, makro tanımlarını bir yığın olarak ele alır. Ancak define, yığınla tanımlanmamış bir şekilde etkileşime girer. Bu uygulamada, define yalnızca en üstteki tanımın yerini alır. Diğer uygulamalar bunun yerine yığındaki tüm tanımları silebilir.
Diğer birçok m4 uygulamasında, tüm yerleşik makrolar argümansız olarak genişler.
Diğer birçok m4 uygulaması, arabellek boyutları açısından vahim boyut sınırlamalarına sahiptir.
Yazarlar
Ozan Yigit oz@sis.yorku.ca ve Richard A. O'Keefe ok@goanna.cs.rmit.OZ.AU.
Marc Espie espie@cvs.openbsd.org tarafından sağlanan GNU-m4 uyumluluk uzantıları.
macOS 26.4 21 Haziran 2023 macOS 26.4