Bu soru dosyanın örnek bir Makefileçıktısıyla CMakeList.txtilgiliyse, 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
MakeKurallar ve tarif için esnek bir araç olsa CMakeda, yapılandırma özelliğini de ekleyen bir soyutlama katmanıdır.
Benim ovam şöyle CMakeLists.txtgörünecek,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
CMakeYapının howyapılabileceğini gizleyen unutmayın . whatGirdi ve çıktıyı sadece belirtmiştik .
CMakeLists.txtTarafı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,Makefilerules and recipesfunctionsfunctionrules and recipesMakefile
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
executable.mkAş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 Makefileaş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 Makefileayrı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.recipehowexecutable.mk
İç Değişkenler CMakeveMake
Şimdi biraz ilerledikçe, CMakeaşağıdaki gibi bir derleyici bayrağı ayarlayabiliriz,
set(CMAKE_C_FLAGS "-Wall")
Lütfen dosyadaki CMakevarsayılan değişkenler hakkında daha fazla bilgi edinin CMakeCache.txt. CMakeYukarıdaki kod eşit olacaktır Make, aşağıdaki kod
CFLAGS = -Wall
Aynı şekilde CFLAGSdahili bir değişken olduğuna dikkat Makeedin,CMAKE_C_FLAGS iç değişkendirCMake .
CMake'de dahil etme ve kitaplık yolu ekleme
Bunu cmakefonksiyonları 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.hgibi 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-configconfigure_file
cmake --build . --config "Release"
optionFonksiyonu 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, makebenzerini çağırabiliriz ,
make CXXFLAGS=NDEBUG
Bence iç değişkenler Makefile-rulesve CMake-functionskarşılaştırma için iyi bir başlangıç, daha fazla kazmada iyi şanslar.
cmakeistedim. Ama bulacağınızdan şüpheliyim çünkü yetenekler birbiriyle o kadar iyi eşleşmiyor. Öylecmakedavranmaya çalışırsanızmake, kendinizi ciddiye alırsınız. Sıfırdan başlamak için en iyisi. Önemsiz olanmakeşeyler oldukça ilgilidircmakeve bunun tersi de geçerlidir.