Bu soru dosyanın örnek bir Makefile
çıktısıyla CMakeList.txt
ilgiliyse, lütfen cmake-backend kaynaklarını kontrol edin ve böyle bir tane oluşturun Makefile
. @Roberto'nun cevabına eklenmiyorsa, detayları gizleyerek basitleştirmeye çalışıyorum.
CMake işlevi
Make
Kurallar ve tarif için esnek bir araç olsa CMake
da, yapılandırma özelliğini de ekleyen bir soyutlama katmanıdır.
Benim ovam şöyle CMakeLists.txt
görünecek,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
CMake
Yapının how
yapılabileceğini gizleyen unutmayın . what
Girdi ve çıktıyı sadece belirtmiştik .
CMakeLists.txt
Tarafından tanımlanan fonksiyon aramalar listesini içerir cmake
.
(CMake işlevi) Vs Kural koy
Gelen yerine kullanılmaktadır . Benzeri özelliğe ek olarak , zincirleme sağlayın. Minimalistim aşağıdaki gibi görünecek,Makefile
rules and recipes
functions
function
rules and recipes
Makefile
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
executable.mk
Aşağıdaki gibi görünecek olsa da ,
SOURCES=$(wildcard *.cpp)
OBJECTS=$(SOURCES:.cpp=.o)
DEPS=$(SOURCES:.cpp=.d)
%.bin:$(OBJECTS)
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) $(DEPS) $(TARGETS)
-include $(DEPS)
Ben ile başlamak zorundadır sıfırdan başlayarak Makefile
aşağıdaki gibi,
all: testapp.bin
testapp.bin:sourcea.o sourcb.o
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) testapp.bin
Bu pasajı buradan aldım ve değiştirdim. Makefile belgelerinde bulunabilecek bazı örtük kuralların bu dosyaya eklendiğine dikkat edin. Bazı örtük değişkenler de burada önemlidir.
Yapının yapılabileceğini gösteren Makefile
ayrıntıları sağlayan unutmayın . Tanımlanan detayları tek bir dosyada tutmak için yazmak mümkündür . Bu şekilde makefile, daha önce gösterdiğim gibi azaltılabilir.recipe
how
executable.mk
İç Değişkenler CMake
veMake
Şimdi biraz ilerledikçe, CMake
aşağıdaki gibi bir derleyici bayrağı ayarlayabiliriz,
set(CMAKE_C_FLAGS "-Wall")
Lütfen dosyadaki CMake
varsayılan değişkenler hakkında daha fazla bilgi edinin CMakeCache.txt
. CMake
Yukarıdaki kod eşit olacaktır Make
, aşağıdaki kod
CFLAGS = -Wall
Aynı şekilde CFLAGS
dahili bir değişken olduğuna dikkat Make
edin,CMAKE_C_FLAGS
iç değişkendirCMake
.
CMake'de dahil etme ve kitaplık yolu ekleme
Bunu cmake
fonksiyonları kullanarak yapabiliriz .
target_include_directories(testapp PRIVATE "myincludes")
list(APPEND testapp_LIBRARIES
mytest mylibrarypath
)
target_link_libraries(testapp ${testapp_LIBRARIES})
Make'e dahil etme ve kitaplık yolu ekleme Vs
Aşağıdakiler gibi satırlar ekleyerek include ve libraries ekleyebiliriz,
INCLUDES += -Imyincludes
LIBS += -Lmylibrarypath -lmytest
Yukarıdaki bu satırların auto-gen araçlarından veya pkg-config'den oluşturulabileceğini unutmayın. (Makefile otomatik yapılandırma araçlarına bağımlı olmasa da)
CMake yapılandır / tweek
Normalde, işlev kullanarak araçlar config.h
gibi bazı dosyalar oluşturmak mümkündür . Özel işlevler yazarken daha fazla hile yapmak mümkündür. Ve son olarak aşağıdaki gibi bir yapılandırma seçebiliriz,auto-config
configure_file
cmake --build . --config "Release"
option
Fonksiyonu kullanarak bazı yapılandırılabilir seçenekler eklemek mümkündür .
Makefile yapılandır / ince ayar
Bir şekilde onu bir hata ayıklama bayrağıyla derlememiz gerekirse, make
benzerini çağırabiliriz ,
make CXXFLAGS=NDEBUG
Bence iç değişkenler Makefile-rules
ve CMake-functions
karşılaştırma için iyi bir başlangıç, daha fazla kazmada iyi şanslar.
cmake
istedim. Ama bulacağınızdan şüpheliyim çünkü yetenekler birbiriyle o kadar iyi eşleşmiyor. Öylecmake
davranmaya çalışırsanızmake
, kendinizi ciddiye alırsınız. Sıfırdan başlamak için en iyisi. Önemsiz olanmake
şeyler oldukça ilgilidircmake
ve bunun tersi de geçerlidir.