Jika pertanyaan ini tentang contoh Makefile
keluaran CMakeList.txt
file, 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 Make
alat fleksibel untuk aturan dan resep, CMake
merupakan lapisan abstraksi yang juga menambahkan fitur konfigurasi.
Dataran saya CMakeLists.txt
akan terlihat seperti berikut ini,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
Perhatikan, bahwa CMake
menyembunyikan how
build bisa dilakukan. Kami hanya menentukan what
adalah input dan output.
The CMakeLists.txt
berisi daftar fungsi-panggilan yang ditentukan oleh cmake
.
(Fungsi CMake) Vs Buat aturan
Dalam Makefile
satu rules and recipes
digunakan sebagai pengganti functions
. Selain function
fitur -like, rules and recipes
sediakan chaining. Minimalis saya Makefile
akan terlihat seperti berikut,
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Sedangkan tampilannya executable.mk
akan 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 Makefile
yang 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 Makefile
memberikan detail yang recipe
menunjukkan how
bahwa pembangunan bisa dilakukan. Dimungkinkan untuk menulis executable.mk
untuk menjaga detail yang ditentukan dalam satu file. Dengan cara itu makefile bisa dikurangi seperti yang saya tunjukkan tadi.
Variabel Internal dalam CMake
danMake
Sekarang sedikit lebih maju, di CMake
kita dapat mengatur bendera kompilator seperti berikut,
set(CMAKE_C_FLAGS "-Wall")
Cari tahu lebih lanjut tentang CMake
variabel default dalam CMakeCache.txt
file. The CMake
kode di atas akan setara dengan Make
kode di bawah ini,
CFLAGS = -Wall
Perhatikan bahwa CFLAGS
variabel internal dalam Make
, dengan cara yang sama, CMAKE_C_FLAGS
adalah variabel internal dalam CMake
.
menambahkan penyertaan dan jalur perpustakaan di CMake
Kita bisa melakukannya dengan cmake
menggunakan 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.h
file seperti auto-config
alat dengan menggunakan configure_file
fungsi. 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 option
fungsi tersebut.
Konfigurasi / tweak Makefile
Jika entah bagaimana kita perlu mengkompilasinya dengan beberapa flag debug, kita bisa memanggil make
like,
make CXXFLAGS=NDEBUG
Saya pikir variabel internal, Makefile-rules
dan CMake-functions
awal yang baik untuk perbandingan, semoga sukses dengan lebih banyak menggali.
cmake
saya menginginkan ini juga. Tapi saya ragu Anda akan menemukannya karena kemampuannya tidak memetakan dengan baik satu sama lain. Jika Anda mencoba membuatcmake
tindakan seperti itumake
, Anda akan membuat diri Anda gila, sungguh. Sebaiknya mulai dari awal. Hal-hal yang sepelemake
cukup terlibatcmake
, begitu pula sebaliknya.