Nếu câu hỏi này là về Makefileđầu ra mẫu của CMakeList.txttệp thì vui lòng kiểm tra các nguồn cmake-backend và tạo một nguồn như vậy Makefile. Nếu không thì thêm vào câu trả lời của @Roberto Tôi đang cố gắng làm cho nó đơn giản bằng cách ẩn các chi tiết.
Chức năng CMake
Trong khi Makelà công cụ linh hoạt cho các quy tắc và công thức, CMakelà một lớp trừu tượng cũng bổ sung tính năng cấu hình.
Đồng bằng của tôi CMakeLists.txtsẽ giống như sau,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
Lưu ý, việc CMakeẩn howbản dựng có thể được thực hiện. Chúng tôi chỉ xác định whatlà đầu vào và đầu ra.
Các CMakeLists.txtchứa danh sách các chức năng cuộc gọi được xác định bởi cmake.
(Hàm CMake) Vs Đưa ra các quy tắc
Trong Makefilenhững rules and recipesđược sử dụng thay cho functions. Ngoài functiontính năng -like, rules and recipescung cấp chuỗi. Tối giản của tôi Makefilesẽ trông giống như sau,
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Trong khi di executable.mkchúc giống như sau,
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)
Bắt đầu lại từ đầu, tôi sẽ bắt đầu với những thứ Makefilenhư sau,
all: testapp.bin
testapp.bin:sourcea.o sourcb.o
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) testapp.bin
Tôi lấy đoạn mã này từ đây và đã sửa đổi nó. Lưu ý rằng một số quy tắc ngầm được thêm vào tệp này có thể được tìm thấy trong tài liệu hướng dẫn makefile. Một số biến ẩn cũng có liên quan ở đây.
Lưu ý, điều đó Makefilecung cấp chi tiết recipecho thấy howviệc xây dựng có thể được thực hiện. Có thể ghi executable.mkđể giữ các chi tiết được xác định trong một tệp. Bằng cách đó, makefile có thể được giảm bớt như tôi đã trình bày trước đó.
Các biến nội bộ trong CMakevàMake
Bây giờ đã được nâng cao hơn một chút, CMakechúng ta có thể đặt cờ trình biên dịch như sau,
set(CMAKE_C_FLAGS "-Wall")
Vui lòng tìm hiểu thêm về CMakecác biến mặc định trong CMakeCache.txttệp. Các CMakemã trên sẽ tương đương với Makemã dưới đây,
CFLAGS = -Wall
Lưu ý rằng CFLAGS là một biến nội bộ Make, theo cùng một cách, CMAKE_C_FLAGSlà biến nội bộ trong CMake.
thêm đường dẫn bao gồm và thư viện trong CMake
Chúng ta có thể làm điều đó cmakebằng cách sử dụng các hàm.
target_include_directories(testapp PRIVATE "myincludes")
list(APPEND testapp_LIBRARIES
mytest mylibrarypath
)
target_link_libraries(testapp ${testapp_LIBRARIES})
Vs thêm bao gồm và đường dẫn thư viện trong Make
Chúng ta có thể thêm bao gồm và thư viện bằng cách thêm các dòng như sau,
INCLUDES += -Imyincludes
LIBS += -Lmylibrarypath -lmytest
Lưu ý rằng các dòng trên có thể được tạo từ các công cụ tạo tự động hoặc pkg-config. (mặc dù Makefile không phụ thuộc vào các công cụ tự động cấu hình)
CMake config / tweek
Thông thường, có thể tạo một số config.htệp giống như auto-configcác công cụ bằng cách sử dụng configure_filehàm. Có thể làm thêm các chức năng tùy chỉnh viết lừa. Và cuối cùng chúng ta có thể chọn một cấu hình như sau,
cmake --build . --config "Release"
Có thể thêm một số tùy chọn có thể định cấu hình bằng cách sử dụng option chức năng.
Cấu hình / tinh chỉnh Makefile
Nếu bằng cách nào đó, chúng ta cần biên dịch nó với một số cờ gỡ lỗi, chúng ta có thể gọi những thứ maketương tự,
make CXXFLAGS=NDEBUG
Tôi nghĩ rằng các biến nội bộ, Makefile-rulesvà CMake-functionslà khởi đầu tốt cho việc so sánh, chúc may mắn với việc đào sâu hơn.
cmaketôi cũng muốn điều này. Nhưng tôi nghi ngờ bạn sẽ tìm thấy nó bởi vì các khả năng không liên kết tốt giữa cái này với cái kia. Nếu bạn cố làm racmakevẻ như vậymake, bạn sẽ khiến bản thân trở nên tồi tệ. Tốt nhất chỉ nên bắt đầu lại từ đầu. Những thứ tầm thườngmakelại có liên quan khá nhiềucmakevà ngược lại.