หากคำถามนี้เกี่ยวกับ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.txt
cmake
(ฟังก์ชัน CMake) Vs สร้างกฎ
ในจะถูกนำมาใช้แทน นอกเหนือจากคุณสมบัติที่เหมือนกันแล้วให้มีการผูกมัด มินิมอลลิสต์ของฉันจะมีลักษณะดังต่อไปนี้Makefile
rules and recipes
functions
function
rules and recipes
Makefile
-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_FLAGS
CMake
เพิ่มเส้นทางรวมและไลบรารีใน 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
และในทางกลับกัน