Nếu câu hỏi này là về Makefile
đầu ra mẫu của CMakeList.txt
tệ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 Make
là công cụ linh hoạt cho các quy tắc và công thức, CMake
là 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.txt
sẽ 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 how
bản dựng có thể được thực hiện. Chúng tôi chỉ xác định what
là đầu vào và đầu ra.
Các CMakeLists.txt
chứ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 Makefile
những rules and recipes
được sử dụng thay cho functions
. Ngoài function
tính năng -like, rules and recipes
cung cấp chuỗi. Tối giản của tôi Makefile
sẽ trông giống như sau,
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Trong khi di executable.mk
chú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ứ Makefile
như 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 đó Makefile
cung cấp chi tiết recipe
cho thấy how
việ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 CMake
vàMake
Bây giờ đã được nâng cao hơn một chút, CMake
chú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ề CMake
các biến mặc định trong CMakeCache.txt
tệp. Các CMake
mã trên sẽ tương đương với Make
mã 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_FLAGS
là 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 đó cmake
bằ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.h
tệp giống như auto-config
các công cụ bằng cách sử dụng configure_file
hà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ứ make
tương tự,
make CXXFLAGS=NDEBUG
Tôi nghĩ rằng các biến nội bộ, Makefile-rules
và CMake-functions
là 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.
cmake
tô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 racmake
vẻ 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ườngmake
lại có liên quan khá nhiềucmake
và ngược lại.