2010-10-30 14 views
38

Linux ve Windows için aynı Makefile sahip olmak isterim. Linux'ta GNU make ve Windows'ta mingw32-make (GNU make) varsayılanını kullanıyorum.Windows ve Unix benzeri sistemler arasında fark yaratan Makefile

Makefile'nin Windows veya Linux'ta çalışıp çalışmadığını tespit etmesini istiyorum. Ben Windows (\) ve Linux üzerinde farklı dizin ayırıcı kullanmak istiyorum Ayrıca

clean: 
    rm $(DESTDIR_TARGET) 

:

clean: 
    del $(DESTDIR_TARGET) 

Fakat Linux üzerinde:


Örneğin Windows üzerinde make clean komut benziyor (/).


O Makefiledaki Windows işletim sistemini algılamak mümkün mü?

PS: Ben Windows üzerinde Linux taklit etmek istemiyorum (vb CygWin)

Orada benzer soru şudur: OS detecting makefile, ama burada cevap bulamadık.

+4

, Windows hem eğik çizgi "/" ve "\" eşdeğerdir idare edebilmektedir. – Ency

+0

Önemli bir proje için bu, autotools bazı taşınabilirlik şeyler ele icar değerinde olup olmadığını merak ediyorum? – Cascabel

+0

@Jefromi: autotools temel UNIX araç setini (sh, m4, sed, rm, ...) varsayar. @tomp: Onları windows (MSYS veya GnuWin) 'dan yükleyebilir ve çabalarınızı daha zorlu taşınabilirlik sorunları üzerinde geçirebilirsiniz. – ephemient

cevap

38

gibi olacaktır.

ifdef SYSTEMROOT 
    RM = del /Q 
    FixPath = $(subst /,\,$1) 
else 
    ifeq ($(shell uname), Linux) 
     RM = rm -f 
     FixPath = $1 
    endif 
endif 

clean: 
    $(RM) $(call FixPath,objs/*) 

% SystemRoot% dizini Linux üzerinde tüm Windows bilgisayarlara ayarlanmış ancak edilmelidir olduğu pencereler yoludur çünkü.

Bloklar daha sonra farklı programların değişkenlerini ve eğik eğik çizgileri ters eğik çizgilere dönüştürmek için bir işlevi ayarlar.

Dışarıdan komut çağırdığınızda $ (call FixPath, yol) yöntemini kullanmanız gerekir (iç komutlar düzgün çalışıyor).

/ :=/

ve bu format daha iyi gibi eğer o

objs$(/)* 

: Ayrıca böyle bir şey kullanabilirsiniz.

+2

Bunun için teşekkürler. Windows ve Linux'ta GCC'de MinGW arasında geçiş yaparım, bu harika çalışıyor. – Imbue

+1

Mingw içinde – SystemParadox

+1

büyük harfiyle SYSTEMROOT olmalıdır. Ayrıca, yalnızca Windows – kebs

7

Bazı dosyaları kaldırmak için $ (RM) değişkenini kullanmalısınız.

3

Linux ve Windows için aynı Makefile sahip olmak isterim.

Belki sadece pencerelerde kurulacak bir env değişkeni bularak bu çözüldü CMake

36

SystemRoot hüner Windows XP üzerinde benim için işe yaramadı ama bu yaptı:

ifeq ($(OS),Windows_NT) 
    #Windows stuff 
    ... 
else 
    #Linux stuff 
    .... 
endif