make: Tidak ada yang bisa dilakukan untuk `semua '

98

Saya akan melalui contoh pgm untuk membuat file make.

http://mrbook.org/tutorials/make/

Folder saya eg_make_creation berisi file-file berikut,

desktop:~/eg_make_creation$ ls
factorial.c  functions.h  hello  hello.c  main.c  Makefile

Makefile

# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=gcc
# Hwy!, I am comment no.2. I want to say that CFLAGS will be the
#options I'll pass to the compiler
CFLAGS=-c -Wall

all:hello

hello:main.o factorial.o hello.o
  $(CC) main.o factorial.o hello.o -o hello

main.o:main.c
  $(CC) $(CFLAGS) main.c

factorial.o:factorial.c
  $(CC) $(CFLAGS) factorial.c

hello.o:hello.c
  $(CC) $(CFLAGS) hello.c

clean:
  rm -rf *o hello

kesalahan:

desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.

Tolong bantu saya memahami untuk menyusun program ini.

Angus
sumber
12
Cobalah melakukan "bersihkan" diikuti dengan "bersihkan"
Paul R
11
Itu bukan kesalahan, itu hanya berarti helloup-to-date. Ubah cleanmenjadi rm -f *.o hellosebelum melakukan sesuatu yang tidak terduga, lalu jalankan make clean alldan lihat apakah itu berhasil.
Mat
1
Anda juga harus menambahkan .phony: all clean, karena alldan cleanbukan nama file.
Kerrek SB
3
Jangan menempatkan -c di CFLAGS Anda.
wildplasser

Jawaban:

123

Terkadang kesalahan "Tidak ada yang bisa dilakukan untuk semua" dapat disebabkan oleh spasi sebelum perintah di aturan makefile, bukan tab. Harap pastikan bahwa Anda menggunakan tab, bukan spasi di dalam aturan Anda.

all:
<\t>$(CC) $(CFLAGS) ...

dari pada

all:
    $(CC) $(CFLAGS) ...

Silakan lihat panduan pembuatan GNU untuk deskripsi sintaks aturan: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax

VirtualVDX
sumber
obj-m + = hello.o all: </t> make -C / lib / modules / $ (shell uname -r) / build M = $ (PWD) modules clean: make -C / lib / modules / $ ( shell uname -r) / build M = $ (PWD) clean
Narendra Jaggi
apakah file diatas adalah file yang valid ??
Narendra Jaggi
Dalam konteks makefile orang tua-anak, terkadang kesalahan "Tidak ada yang harus dilakukan untuk semua" dapat disebabkan oleh target turunan yang salah ditandai dideklarasikan .PHONY di Makefile induk.
donhector
Saya punya all : src/server/mod_wsgi.la, yang saya ubah all : </t> src/server/mod_wsgi.la. Saya sekarang mendapatkan kesalahan: make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127setelah sudo make. Ada bantuan?
Kawah Bulan
@Mooncrater Lihat gnu.org/software/make/manual/make.html#Rule-Syntax . Di sini terbaca: Baris resep dimulai dengan karakter tab (atau karakter pertama dalam nilai variabel .RECIPEPREFIX; lihat Variabel Khusus). Baris resep pertama mungkin muncul di baris setelah prasyarat, dengan karakter tab, atau mungkin muncul di baris yang sama, dengan titik koma. Bagaimanapun, efeknya sama. Jadi, prasyarat Anda hanya menjadi resepnya. Anda tidak perlu tab dalam kasus ini.
VirtualVDX
31

Hapus hellofile dari folder Anda dan coba lagi.

The allTarget tergantung pada hellosasaran. The hellotarget pertama mencoba untuk menemukan yang sesuai file dalam filesystem. Jika ia menemukannya dan diperbarui dengan file dependennya — tidak ada yang bisa dilakukan.

Weekens
sumber
obj-m + = hello.o all: </t> make -C / lib / modules / $ (shell uname -r) / build M = $ (PWD) modules clean: make -C / lib / modules / $ ( shell uname -r) / build M = $ (PWD) clean
Narendra Jaggi
apakah yang di atas adalah file make yang valid?
Narendra Jaggi
21

Ketika Anda hanya memberi make, itu membuat aturan pertama dalam makefile Anda, yaitu "semua". Anda telah menentukan bahwa "semua" bergantung pada "halo", yang bergantung pada main.o, factorial.o, dan hello.o. Jadi 'make' mencoba untuk melihat apakah file-file itu ada.

Jika ada, 'make' akan melihat apakah dependensinya, misalnya main.o memiliki dependensi main.c, telah berubah. Jika sudah berubah, buat ulang, jika tidak, lewati aturan. Demikian pula secara rekursif terus membangun file yang telah berubah dan akhirnya menjalankan perintah paling atas, "semua" dalam kasus Anda untuk memberi Anda eksekusi, 'halo' dalam kasus Anda.

Jika mereka tidak hadir, buatlah secara membabi buta membangun segala sesuatu di bawah aturan.

Datang ke masalah Anda, ini bukan kesalahan tetapi 'make' mengatakan bahwa setiap dependensi dalam makefile Anda adalah yang terbaru dan tidak perlu membuat apa pun!

Chethan Ravindranath
sumber
16

Make berperilaku dengan benar. hellosudah ada dan tidak lebih tua dari .cfile, dan oleh karena itu tidak ada lagi pekerjaan yang harus diselesaikan. Ada empat skenario di mana make perlu membangun (ulang):

  • Jika Anda memodifikasi salah satu .cfile Anda , maka itu akan menjadi lebih baru dari hello, dan kemudian harus dibangun kembali ketika Anda menjalankan make.
  • Jika Anda menghapus hello, maka jelas harus membangunnya kembali
  • Anda dapat memaksa make untuk membangun kembali semuanya dengan -Bopsi tersebut.make -B all
  • make clean allakan menghapus hellodan membutuhkan pembangunan kembali. (Saya sarankan Anda melihat komentar @ Mat tentangrm -f *.o hello
Aaron McDaid
sumber
4

Saya pikir Anda melewatkan satu tab di baris ke-9. Baris yang mengikuti semua: halo harus berupa tab kosong. Pastikan Anda memiliki tab kosong di baris ke-9. Ini akan membuat interpreter mengerti bahwa Anda ingin menggunakan resep default untuk makefile.

Techie
sumber
4

Itu bukan kesalahan; perintah make di unix bekerja berdasarkan stempel waktu. Ie katakanlah jika Anda telah membuat perubahan tertentu factorial.cppdan mengkompilasi menggunakan makemaka make menunjukkan informasi bahwa hanya cc -o factorial.cppperintah yang dijalankan. Lain kali jika Anda menjalankan perintah yang sama yaitu maketanpa membuat perubahan apa pun pada file apa pun dengan .cppekstensi, kompilator mengatakan bahwa file keluaran adalah yang terbaru. Kompilator memberikan informasi ini sampai kita membuat perubahan tertentu pada apapun file.cpp.

Keuntungan dari makefileini adalah mengurangi waktu kompilasi ulang dengan mengkompilasi hanya file yang dimodifikasi dan dengan menggunakan file object ( .o) dari file yang tidak dimodifikasi secara langsung.

muneshwar
sumber
0

Saya sampai pada kesalahan yang aneh dan sulit di-debug ini melalui rute yang berbeda. Masalah saya akhirnya adalah bahwa saya menggunakan aturan pola dalam langkah membangun ketika target dan ketergantungan berada di direktori yang berbeda. Sesuatu seperti ini:

foo/apple.o: bar/apple.c $(FOODEPS)

%.o: %.c
    $(CC) $< -o $@

Saya memiliki beberapa dependensi yang disiapkan dengan cara ini, dan mencoba menggunakan satu resep pola untuk semuanya. Jelas, substitusi tunggal untuk "%" tidak akan berhasil di sini. Saya membuat aturan eksplisit untuk setiap ketergantungan, dan saya menemukan diri saya kembali di antara anak anjing dan unicorn!

foo/apple.o: bar/apple.c $(FOODEPS)
    $(CC) $< -o $@

Semoga ini bisa membantu seseorang!

sfaleron.dll
sumber