Nie dalej jak wczoraj przysłuchiwałem się rozmowie s1m0n‘a z n1x0n‘em na #dragonfly odnośnie mod_exec w ProFTPd. Generalnie chodziło o źródła samego modułu, który od wersji 1.3.3 serwera nie jest już zewnętrznym modułem. Ale stabilną wersją serwera jest wciąż 1.3.2d, a 1.3.3 to ciągle release candidate (na dzień dzisiejszy rc4).
Niemniej chcielibyśmy sprawdzić czy się buduje bez błędów. Załóżmy, że mamy FreeBSD, korzystamy z ftp/proftpd, a chcemy wykonać tylko make build dla ftp/proftpd-devel. Standardowo próba zakończy się niepowodzeniem (dla jakiegokolwiek celu):
[root@ /usr/ports/ftp/proftpd-devel]# make fetch
===> proftpd-devel-1.3.3.r4_1,1 conflicts with installed package(s):
proftpd-1.3.2d
They install files into the same place.
Please remove them first with pkg_delete(1).
*** Error code 1
Stop in /usr/ports/ftp/proftpd-devel.
W zasadzie dla install można to zrozumieć, ale fetch, build czy nawet samo makesum? Jak najprościej sobie z tym poradzić?
Można po partyzancku usunąć linijkę zaczynającą się od CONFLICTS= z Makefile. No, ale staramy się zawsze elegancko rozwiązywać problemy, więc przeglądamy zawartość wspomnianego pliku Makefile w poszukiwaniu interesujących nas celów (ang. target). Niczym po nitce do kłębka trafiamy do bsd.port.post.mk (w /usr/ports/Mk), a z niego do bsd.port.mk, gdzie mamy istną kopalnię wiedzy o budowie portów w ogóle.
Oprócz celów mamy tam też możliwe zmienne (ang. variable), które możemy wykorzystywać podczas budowania istniejących bądź tworzenia własnych portów.
Przed każdym celem wykonywany jest check-conflicts, który sprawdza czy zmienna CONFLICTS jest ustawiona oraz (&&) czy nie ma zdefiniowanej DISABLE_CONFLICTS, która to wyłącza sprawdzanie konfliktów. I o ten kawałek kodu właśnie nam chodziło! Spróbujmy więc tym raze wykorzystać nabytą wiedzę:
[root@ /usr/ports/ftp/proftpd-devel]# DISABLE_CONFLICTS=true make extract
===> Vulnerability check disabled, database not found
===> Found saved configuration for proftpd-devel-1.3.3.r4_1,1
=> proftpd-1.3.3rc4.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch from ftp://ftp.proftpd.org/distrib/source/.
proftpd-1.3.3rc4.tar.gz 100% of 4728 kB 988 kBps
===> Extracting for proftpd-devel-1.3.3.r4_1,1
=> MD5 Checksum OK for proftpd-1.3.3rc4.tar.gz.
=> SHA256 Checksum OK for proftpd-1.3.3rc4.tar.gz.
No i udało się! Przy okazji – extract rozpakuje źródła (DISTFILES) do katalogu roboczego (WRKDIR).
Oczywiście zmiennej DISABLE_CONFLICTS używamy świadomie (nie wstawiamy w /etc/make.conf na stałe)!
Dla chcących jeszcze bardziej pogłębić swoją wiedzę z zakresu portów FreeBSD, polecam podręcznik „FreeBSD Porter’s Handbook„.