Jak ważna jest nauka makefiles? [Zamknięte]

12

Pracuję w c ++ głównie jako hobby (jestem jeszcze w szkole i dlatego nie mam prawdziwej pracy). IDE generują dla mnie plik makefile, dlatego zastanawiam się, czy warto nauczyć się, jak je tworzyć. Przez „warto się uczyć” mam na myśli, czy powinienem porzucić wszystko i nauczyć się je pisać przed kontynuowaniem nauki c ++? Czy nauczenie się ich będzie naprawdę konieczne? Jeśli tak, czy powinienem się o nich dowiedzieć (ogólna składnia i zrozumienie, jak działają itp.), Czy naprawdę nauczyć się je pisać?

sinθ
źródło
1
większość projektów typu open source intensywnie wykorzystuje pliki makefile w taki czy inny sposób. Tak, powinieneś nauczyć się, jak działają makefile. Pisanie ich ręcznie to inna historia, której należy unikać, zamiast generować je za pomocą jakiegoś narzędzia, z wyjątkiem tego, że masz bardzo mało plików lub możesz używać ogólnych / niejawnych reguł i innych podobnych technik
permeakra
jeśli chcesz, aby inni kompilowali twoje źródło w systemie Linux i innym systemie operacyjnym opartym na Uniksie, musisz się ich nauczyć.
Możesz nauczyć się podstaw makefile, zależności i podstawień itp., W krótszym czasie niż przeczytanie wszystkich odpowiedzi na to pytanie :)
JohnB

Odpowiedzi:

14

Tak, zdecydowanie warto zrozumieć, jak działa Makefiles. Może nie być to dla ciebie istotne w tej chwili (ponieważ używasz IDE, które je generuje), ale są szanse, że wiedza będzie przydatna w przyszłości.

Przez „warto się uczyć” mam na myśli, czy powinienem porzucić wszystko i nauczyć się je pisać przed kontynuowaniem nauki c ++?

Szczerze mówiąc, to dziwne pojęcie „warte nauki” ...

Ale nie, nie sądzę, że musisz to zrobić.

Czy nauczenie się ich będzie naprawdę konieczne?

Nie możemy przewidzieć, czy naprawdę będziesz potrzebować tej wiedzy w przyszłości. Zależy to od tego, czy kontynuujesz programowanie w C ++ i w jakim kontekście to robisz.

Jeśli tak, czy powinienem się o nich dowiedzieć (ogólna składnia i zrozumienie, jak działają itp.), Czy naprawdę nauczyć się je pisać?

Poleciłbym oba. Jeśli nie możesz napisać pliku Makefile, dyskusyjne jest, że wiesz, co się dzieje.

Istnieje inny punkt widzenia, który mówi, że zbyt duża wiedza nie jest pomocna.

Jeśli zagłębisz się w to, dowiesz się, że istnieje wiele różnych wersji Make, a pisanie skomplikowanego pliku Makefile, który działa z wieloma wersjami Make na wielu platformach, jest ... trudne. Jednak w świecie open source, jest to „najlepsze praktyki” do wykorzystania narzędzi takich jak automake, autoconfi tak dalej, aby wygenerować Makefile itd. Jeśli to zrobisz, wiele wersji / platforma związanej złożoności jest uregulowana za kulisami .


Na koniec otagowałeś pytanie słowem „java”. Uważam, że nie powinieneś używać makedo budowania aplikacji Java (chyba że budujesz również biblioteki kodów natywnych). Istnieją narzędzia do budowania specyficzne dla języka Java, które są znacznie łatwiejsze w użyciu ... i wykonują lepszą pracę niż make.

Stephen C.
źródło
8

Jeśli pracujesz z systemami operacyjnymi typu open source lub uniksowymi, tak. Pociesz się, nie są tak skomplikowane. Nauka makepozwoli Ci zaoszczędzić dużo czasu na dłuższą metę.

EhevuTov
źródło
Uczysz się czytać czy uczysz się pisać?
Obie. Chcesz wiedzieć, jak to przeczytać, aby móc debugować problemy z oprogramowaniem, którego używasz, lub pisać, aby móc tworzyć własne.
EhevuTov
Potem muszę się nie zgodzić z częścią pisarską. Istnieje wiele innych - prawdopodobnie znacznie lepszych - sposobów automatyzacji kompilacji. Pisanie naprawdę użytecznych plików makef nie jest trywialne i nie jest konieczne.
3

Pliki makr są ważne w systemach UNIX (np. AIX, Linux, OS X). Myślę jednak, że ich absolutne znaczenie „musisz to wiedzieć” zmniejszyło się w ostatnich latach. Na przykład tak naprawdę nie można ich znaleźć w programowaniu systemu Windows (Visual Studio itp.), A XCode (w OS X) używa zupełnie innego systemu. Nie przepadam za Javą, ale myślę, że używają plików mrówek i tak dalej.

Istnieje bardzo fajny system o nazwie CMake, który generuje natywne pliki kompilacji dla systemu operacyjnego, na którym się uruchamiasz. Na przykład, jeśli napiszesz specyfikację projektu w CMake, możesz utworzyć projekt kompilacji Visual Studio w systemie Windows, projekt XCode na komputerze Mac i plik Makefile na systemie Linux. W pewnym sensie CMake zastępuje autoconf i automake.

Zwykle tworzę pliki CMake dla moich „dużych projektów”, ale wiem Make na wypadek, gdyby chciałem napisać „Makefile”. Jest dobry dla twojej znajomości kultury, ponieważ istnieje mnóstwo bibliotek oprogramowania, które używają Makefiles, i nieuchronnie będziesz musiał edytować określone kompilatory i lokalizacje bibliotek. Ale przekonasz się, że duże projekty (takie jak KDE) migrują w kierunku CMake i tym podobnych, ponieważ Make ma pewne ograniczenia, które odwracają ich brzydką głowę, gdy projekty stają się skomplikowane.

Eric Brown
źródło
Nauka CMake będzie o rząd wielkości bardziej korzystna. Pliki makefile mogą być postrzegane jako szczegół implementacji - nie zawracaj sobie głowy ich nauką (dopóki nie będzie to naprawdę zmuszone), podobnie jak pliki projektów Visual Studio.
2

Jestem stronniczy, ponieważ uważam, że makefile to straszny system. Powinieneś nauczyć się ogólnej składni, aby móc modyfikować istniejący plik makefile. Ale nie wydaje mi się, że uczenie się wszystkiego na ten temat ani tworzenie od podstaw nie jest przydatne.


źródło
Chcesz wyjaśnić, dlaczego pliki makefile są okropnym systemem? W porównaniu do czego?
JonnyJD
@JonnyJD: Jedną rzeczą jest to, że nie uważam, że dobry system kompilacji powinien zawierać pliki make w każdym podkatalogu. Ale jest źle, ponieważ nie jest dużo łatwiejszy w użyciu niż pisanie pliku nietoperza, który naprawdę coś mówi.
Brzmi bardziej, jakbyś nie lubił ręcznie generować plików kompilacji. Co samo w sobie nie jest niczym wielkim. Pliki makefile to wariant, który powinien być możliwy do odczytu i zapisu ręcznie. (modułowy, po prostu uprościł śledzenie zależności w porównaniu do bash / bat) Część zautomatyzowana to automake. Jedyną rzeczą, która tak naprawdę się różni, jest określenie zależności w graficznym interfejsie użytkownika i zapisanie tego wszystkiego w jednym pliku projektu. Lub jaki system budowania jest o wiele mniej straszny?
JonnyJD
2

Podobnie jak w przypadku wielu aspektów wyjścia IDE, typowy automatycznie generowany plik makefile ma często nieefektywną strukturę.

Przy odpowiednim poziomie zrozumienia często można znacznie poprawić wydajność (szybsze kompilacje itp.). Jednak, chyba że naprawdę wiesz, co się dzieje, bardziej prawdopodobne jest, że FUBAR będzie majstrował przy pliku z autogenem.

Zdecydowanie polecam, aby zrozumieć, co się dzieje ... niezależnie od tego, czy zdecydujesz się rozpocząć edycję istniejącego, czy utworzyć własny, to osobny problem.

Andrzej
źródło
2

Możliwość skutecznego użycia makelub coś w tym rodzaju pozwala zaznaczyć pole „rozumie, jak modelować zależności między częściami programu złożonymi z więcej niż jednego modułu”.

Blrfl
źródło
1

Nauka pisania plików Makefile jest dobrym pomysłem z wielu powodów.

  1. Make to język, który pozwala kodować zależności między komponentami za pomocą reguł. Zdobędziesz duże doświadczenie w pisaniu kodu w ten sposób i poszerzy to twoje narzędzia do myślenia o rozwiązywaniu problemów programistycznych.
  2. Zasady, których uczysz się z Make, mogą być używane w Ant, Maven i Rake, jeśli zdecydujesz się nauczyć programowania w świecie Java lub Ruby.
  3. Wiele IDE ma magiczne pliki, które zawierają informacje o konfiguracji, aby pomóc Ci zbudować oprogramowanie. Jeśli mi nie wierzysz, spróbuj napisać skrypt, aby zbudować oprogramowanie bez IDE. Pisząc własne pliki Makefile, zdajesz sobie sprawę z zależności między kodem, bibliotekami i zmiennymi środowiskowymi. W miarę powiększania się systemów okazuje się to użytecznym narzędziem do debugowania systemu.
Jay Godse
źródło
0

Zawsze powinieneś próbować zrozumieć używany system kompilacji.

To niekoniecznie oznacza, że ​​musisz być w stanie ręcznie utworzyć wszystkie pliki kompilacji. Ważną częścią jest zrozumienie, co robi system kompilacji dla twojego projektu i ogólna umiejętność ręcznego kompilowania małych projektów (jak w „wpisywaniu poleceń na terminalu”).

Po prostu myślę, że tworzenie (prostych) plików Makefile jest najłatwiejszym krokiem do zrozumienia, co się dzieje, ale możesz mieć inne sposoby zrozumienia, jak budować różne rzeczy.

Dlaczego / kiedy uczyć się Makefiles

Jeśli nadal programujesz tylko dla systemu Windows i nie oczekujesz, że ktokolwiek skompiluje Twój kod, możesz go skompilować tak, jak chcesz.

Jeśli chcesz zaprogramować kompilator jako agnostyczny (jak w „pozwól innym decydować, jakiego kompilatora lub IDE chcą użyć”), powinieneś nauczyć się innego systemu kompilacji niż pozwolić swojemu IDE „sobie z tym poradzić”.

Jeśli chcesz programować na różne platformy, z pewnością musisz użyć szeroko rozpowszechnionego systemu kompilacji.

To wciąż nie oznacza, że ​​musisz dokładnie wiedzieć, jak działają automatycznie generowane pliki Makefile. Musisz tylko wiedzieć, jak działają pliki wejściowe dla systemu kompilacji. Zdarza się, że czasami mają podobną składnię.


Osobiście bardzo lubię Makefiles i używam ich do wielu rzeczy. Nie tylko kompilowanie kodu. Tworzę plik Makefile dla każdego większego pliku pdf, który tworzę (z LaTeX) i dla każdego projektu, w którym muszę zautomatyzować kilka zadań (budowanie, pakowanie, przesyłanie, aktualizacja zależności z repozytoriów źródłowych, ręczne kopie zapasowe pull / push)

Jednak dużo pracuję na terminalu i pracuję z Linuksem. Nie używam tak zwanego IDE innego niż vim (potężny edytor tekstu) i narzędzia konsoli. To może być dla ciebie zupełnie inne.

Jeśli kiedykolwiek narzekałeś na konieczność uruchamiania różnych powtarzających się poleceń tylko w celu „zaktualizowania” / pakietu / przesłania / .. „projektu”, to nauka pisania plików Makefiles może być dla Ciebie pomocna.

Jeśli masz i używasz narzędzi / GUI / IDE do wszystkiego, możesz nie wyciągnąć niczego z tej wiedzy.

JonnyJD
źródło