หากคำถามนี้เกี่ยวกับMakefileผลลัพธ์ตัวอย่างของCMakeList.txtไฟล์โปรดตรวจสอบแหล่งที่มาของ cmake-backend และสร้างขึ้นMakefileมา หากไม่ใช่การเพิ่มการตอบกลับของ @Roberto ฉันพยายามทำให้ง่ายโดยซ่อนรายละเอียด
ฟังก์ชัน CMake
ในขณะที่Makeเป็นเครื่องมือที่ยืดหยุ่นสำหรับกฎและสูตรอาหารCMakeเป็นชั้นของนามธรรมที่เพิ่มคุณสมบัติการกำหนดค่าด้วย
ธรรมดาของฉันCMakeLists.txtจะมีลักษณะดังต่อไปนี้
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
โปรดทราบว่าการCMakeซ่อนhowโครงสร้างสามารถทำได้ เราระบุเพียงwhatอินพุตและเอาต์พุต
มีรายชื่อของฟังก์ชั่นการโทรที่ถูกกำหนดโดยCMakeLists.txtcmake
(ฟังก์ชัน CMake) Vs สร้างกฎ
ในจะถูกนำมาใช้แทน นอกเหนือจากคุณสมบัติที่เหมือนกันแล้วให้มีการผูกมัด มินิมอลลิสต์ของฉันจะมีลักษณะดังต่อไปนี้Makefilerules and recipesfunctionsfunctionrules and recipesMakefile
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
ในขณะที่executable.mkจะมีลักษณะดังต่อไปนี้
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)
เริ่มจากจุดเริ่มต้นฉันจะเริ่มต้นด้วยสิ่งMakefileต่อไปนี้
all: testapp.bin
testapp.bin:sourcea.o sourcb.o
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) testapp.bin
ฉันได้รับตัวอย่างนี้จากที่นี่และแก้ไข โปรดทราบว่ามีการเพิ่มกฎโดยนัยบางอย่างลงในไฟล์นี้ซึ่งสามารถพบได้ในเอกสาร makefile ตัวแปรโดยนัยบางตัวก็เกี่ยวข้องเช่นกัน
โปรดทราบว่าMakefileมีรายละเอียดที่recipeแสดงhowการสร้างที่สามารถทำได้ เป็นไปได้ที่จะเขียนexecutable.mkเพื่อเก็บรายละเอียดที่กำหนดไว้ในไฟล์เดียว ด้วยวิธีนี้ makefile สามารถลดลงได้ตามที่ฉันแสดงไว้ก่อนหน้านี้
ตัวแปรภายในในCMakeและMake
ตอนนี้เริ่มขั้นสูงแล้วCMakeเราสามารถตั้งค่าสถานะคอมไพเลอร์ดังต่อไปนี้
set(CMAKE_C_FLAGS "-Wall")
โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับCMakeตัวแปรเริ่มต้นในCMakeCache.txtไฟล์ CMakeโค้ดข้างต้นจะเทียบเท่ากับMakeรหัสด้านล่าง
CFLAGS = -Wall
ทราบว่าCFLAGSเป็นตัวแปรภายในในMakeทางเดียวกันเป็นตัวแปรภายในCMAKE_C_FLAGSCMake
เพิ่มเส้นทางรวมและไลบรารีใน CMake
เราสามารถทำได้ในการcmakeใช้ฟังก์ชัน
target_include_directories(testapp PRIVATE "myincludes")
list(APPEND testapp_LIBRARIES
mytest mylibrarypath
)
target_link_libraries(testapp ${testapp_LIBRARIES})
เทียบกับการเพิ่มการรวมและเส้นทางไลบรารีใน Make
เราสามารถเพิ่มรวมและไลบรารีได้โดยเพิ่มบรรทัดดังต่อไปนี้
INCLUDES += -Imyincludes
LIBS += -Lmylibrarypath -lmytest
โปรดทราบว่าบรรทัดด้านบนนี้สามารถสร้างได้จาก auto-gen tools หรือ pkg-config (แม้ว่า Makefile จะไม่ขึ้นอยู่กับเครื่องมือกำหนดค่าอัตโนมัติ)
CMake กำหนดค่า / สองครั้ง
โดยปกติคุณสามารถสร้างconfig.hไฟล์บางไฟล์ได้เช่นเดียวกับauto-configเครื่องมือโดยใช้configure_fileฟังก์ชัน เป็นไปได้ที่จะใช้ฟังก์ชันที่กำหนดเองในการเขียนหลอกมากขึ้น และในที่สุดเราก็สามารถเลือก config ดังต่อไปนี้
cmake --build . --config "Release"
เป็นไปได้ที่จะเพิ่มตัวเลือกที่กำหนดค่าได้โดยใช้optionฟังก์ชัน
Makefile กำหนดค่า / ปรับแต่ง
หากเราจำเป็นต้องคอมไพล์ด้วยแฟล็ก debug เราสามารถเรียกสิ่งที่makeคล้ายกัน
make CXXFLAGS=NDEBUG
ฉันคิดว่าตัวแปรภายในMakefile-rulesและCMake-functionsเป็นการเริ่มต้นที่ดีสำหรับการเปรียบเทียบขอให้โชคดีกับการขุดเพิ่มเติม
cmakeก็ต้องการสิ่งนี้เช่นกัน แต่ฉันสงสัยว่าคุณจะพบเพราะความสามารถนั้นไม่ได้จับคู่ความสามารถนั้นกับอีกด้านหนึ่ง ถ้าคุณพยายามcmakeทำตัวเหมือนmakeคุณจะทำให้ตัวเองบ้าคลั่งอย่างจริงจัง ดีที่สุดเพียงเริ่มต้นจากศูนย์ สิ่งที่เป็นเรื่องเล็กน้อยmakeมีส่วนเกี่ยวข้องค่อนข้างมากcmakeและในทางกลับกัน