Jika pertanyaan ini tentang contoh Makefilekeluaran CMakeList.txtfile, silakan periksa sumber cmake-backend dan buat satu seperti itu Makefile. Jika tidak, maka menambahkan balasan @Roberto saya mencoba membuatnya sederhana dengan menyembunyikan detailnya.
Fungsi CMake
Sedangkan Makealat fleksibel untuk aturan dan resep, CMakemerupakan lapisan abstraksi yang juga menambahkan fitur konfigurasi.
Dataran saya CMakeLists.txtakan terlihat seperti berikut ini,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
Perhatikan, bahwa CMakemenyembunyikan howbuild bisa dilakukan. Kami hanya menentukan whatadalah input dan output.
The CMakeLists.txtberisi daftar fungsi-panggilan yang ditentukan oleh cmake.
(Fungsi CMake) Vs Buat aturan
Dalam Makefilesatu rules and recipesdigunakan sebagai pengganti functions. Selain functionfitur -like, rules and recipessediakan chaining. Minimalis saya Makefileakan terlihat seperti berikut,
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Sedangkan tampilannya executable.mkakan seperti berikut ini,
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)
Mulai dari awal saya akan mulai dengan Makefileyang berikut ini,
all: testapp.bin
testapp.bin:sourcea.o sourcb.o
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) testapp.bin
Saya mendapatkan potongan ini dari sini dan memodifikasinya. Perhatikan bahwa beberapa implisit-rules ditambahkan ke file ini yang dapat ditemukan di dokumentasi makefile. Beberapa variabel implisit juga relevan di sini.
Catatan, itu Makefilememberikan detail yang recipemenunjukkan howbahwa pembangunan bisa dilakukan. Dimungkinkan untuk menulis executable.mkuntuk menjaga detail yang ditentukan dalam satu file. Dengan cara itu makefile bisa dikurangi seperti yang saya tunjukkan tadi.
Variabel Internal dalam CMakedanMake
Sekarang sedikit lebih maju, di CMakekita dapat mengatur bendera kompilator seperti berikut,
set(CMAKE_C_FLAGS "-Wall")
Cari tahu lebih lanjut tentang CMakevariabel default dalam CMakeCache.txtfile. The CMakekode di atas akan setara dengan Makekode di bawah ini,
CFLAGS = -Wall
Perhatikan bahwa CFLAGSvariabel internal dalam Make, dengan cara yang sama, CMAKE_C_FLAGSadalah variabel internal dalam CMake.
menambahkan penyertaan dan jalur perpustakaan di CMake
Kita bisa melakukannya dengan cmakemenggunakan fungsi.
target_include_directories(testapp PRIVATE "myincludes")
list(APPEND testapp_LIBRARIES
mytest mylibrarypath
)
target_link_libraries(testapp ${testapp_LIBRARIES})
Vs menambahkan penyertaan dan jalur pustaka di Make
Kita dapat menambahkan penyertaan dan pustaka dengan menambahkan baris seperti berikut,
INCLUDES += -Imyincludes
LIBS += -Lmylibrarypath -lmytest
Perhatikan bahwa baris di atas dapat dibuat dari alat auto-gen atau pkg-config. (meskipun Makefile tidak bergantung pada alat konfigurasi otomatis)
Konfigurasi CMake / tweek
Biasanya dimungkinkan untuk menghasilkan beberapa config.hfile seperti auto-configalat dengan menggunakan configure_filefungsi. Dimungkinkan untuk melakukan lebih banyak trik menulis fungsi kustom. Dan terakhir kita bisa memilih konfigurasi seperti berikut,
cmake --build . --config "Release"
Dimungkinkan untuk menambahkan beberapa opsi yang dapat dikonfigurasi menggunakan optionfungsi tersebut.
Konfigurasi / tweak Makefile
Jika entah bagaimana kita perlu mengkompilasinya dengan beberapa flag debug, kita bisa memanggil makelike,
make CXXFLAGS=NDEBUG
Saya pikir variabel internal, Makefile-rulesdan CMake-functionsawal yang baik untuk perbandingan, semoga sukses dengan lebih banyak menggali.
cmakesaya menginginkan ini juga. Tapi saya ragu Anda akan menemukannya karena kemampuannya tidak memetakan dengan baik satu sama lain. Jika Anda mencoba membuatcmaketindakan seperti itumake, Anda akan membuat diri Anda gila, sungguh. Sebaiknya mulai dari awal. Hal-hal yang sepelemakecukup terlibatcmake, begitu pula sebaliknya.