Страница 1 из 1

Создание порта приложения для FreeBSD

Добавлено: 2010-08-18 20:40:08
goshanecr
Добрый день товарищи!
Несколько раз возникало желание создать порт чего-нибудь кажущегося нужным в FreeBSD, лазил по интернету в поисках подробного руководства и конечно же все ссылки ведут в хендбук.
Читал, но то ли руки растут не от туда, то ли мозг работает не в том направлении, то ли не работает вообще, но сделать ничего так и не удалось. Вроде смотришь Makefile в портах, там написано то всего ничего и всё собирается в итоге. Вот подумал может попробовать научиться портированию программ в фрю при помощи интерактивной помощи знатоков на этом форуме. Чувствуется что кто-нибудь обязательно пошлёт курить хендбук, говорю честно читал, пытался вникнуть но что-то руки так и не поднялись и не появилось понимания с чего же начать.
Если кто-то решится помочь, просто давать какие-то доходчивые объяснения непонятных моментов, разъяснить логику и т.д. то это будет полезным наглядным примером разжёванным и ясным.
Очередная цель для портирования появилась когда в линуксе разгадывал головоломки.
1. Скачал исходники
2. распаковал, почитал README. Сказано что требуется для игрушек этих GTK, и в случае портирования под какую-то отличную от Linux. OSX, Windows и ещё чего-то платформ, надо править mkfiles.pl который и создаёт Makefile для сборки приложения под разные платформы.

Ну и втупил собственно. Прошу не злиться на просьбу дилетанта разъяснить суть процесса, но вдруг кто-то готов потратить чуть-чуть времени и нервов :)

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-18 20:45:42
hizel
ну и где ваши наработки?
вы выбрали не очень удачное начало, кстати
с начала просто соберите, а уже потом делайте порт

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-18 21:32:26
hizel
там пёрл файл похоже для вендузятников вских

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-18 22:27:21
goshanecr
hizel Вот ты как ответил, я сразу понял что надо начинать делать для начала. Итак:
1. Попробовал собрать зайдя в папку с распакованными исходниками и сделав make
пошлёл вывод с массой ошибок в которых были ненайденные библиотеки типа gtk/gtk.h и т.п. с этим разобрался добавив пути в Makefile:
Было:

Код: Выделить всё

CFLAGS := -O2 -Wall -Werror -ansi -pedantic -g -I./ -Iicons/ `$(GTK_CONFIG) --cflags` $(CFLAGS)
После указания пути ко всем библиотекам (это видимо потом и будет в качестве необходимых для сборки порта зависимостей) стало:

Код: Выделить всё

CFLAGS := -O2 -Wall -Werror -ansi -pedantic -g -I./ -Iicons/ \
        -I/usr/local/include/gtk-2.0 -I/usr/local/include -I/usr/local/include/glib-2.0 -I/usr/local/include/pango-1.0 -I/usr/local/include/cairo -I/usr/local/include/atk-1.0 \
        `$(GTK_CONFIG) --cflags` $(CFLAGS)
библиотеки искались одна за другой в выводе make а затем чтобы найти путь по которому они есть у меня:

Код: Выделить всё

find /usr/local -name gtk.h
В итоге вывод make стал таким:

Код: Выделить всё

/mnt/400gb/Gosha/BSD-PORTS/Tatham_puzzle/src/puzzles-r8972/>make
cc   -O2 -Wall -Werror -ansi -pedantic -g -I./ -Iicons/  -I/usr/local/include/gtk-2.0 -I/usr/local/include -I/usr/local/include/glib-2.0 -I/usr/local/include/pango-1.0 -I/usr/local/include/cairo -I/usr/local/include/atk-1.0  `sh -c 'pkg-config gtk+-2.0  2>/dev/null || gtk-config ' --cflags` -O2 -pipe -msse -msse2 -msse3 -mmmx -m3dnow -mtune=athlon64 -fno-strict-aliasing -march=athlon-mp  -c ./blackbox.c -o blackbox.o
Illegal option --
cc   -O2 -Wall -Werror -ansi -pedantic -g -I./ -Iicons/  -I/usr/local/include/gtk-2.0 -I/usr/local/include -I/usr/local/include/glib-2.0 -I/usr/local/include/pango-1.0 -I/usr/local/include/cairo -I/usr/local/include/atk-1.0  `sh -c 'pkg-config gtk+-2.0  2>/dev/null || gtk-config ' --cflags` -O2 -pipe -msse -msse2 -msse3 -mmmx -m3dnow -mtune=athlon64 -fno-strict-aliasing -march=athlon-mp  -c icons/blackbox-icon.c -o blackbox-icon.o
Illegal option --
cc   -O2 -Wall -Werror -ansi -pedantic -g -I./ -Iicons/  -I/usr/local/include/gtk-2.0 -I/usr/local/include -I/usr/local/include/glib-2.0 -I/usr/local/include/pango-1.0 -I/usr/local/include/cairo -I/usr/local/include/atk-1.0  `sh -c 'pkg-config gtk+-2.0  2>/dev/null || gtk-config ' --cflags` -O2 -pipe -msse -msse2 -msse3 -mmmx -m3dnow -mtune=athlon64 -fno-strict-aliasing -march=athlon-mp  -c ./drawing.c -o drawing.o
Illegal option --
cc   -O2 -Wall -Werror -ansi -pedantic -g -I./ -Iicons/  -I/usr/local/include/gtk-2.0 -I/usr/local/include -I/usr/local/include/glib-2.0 -I/usr/local/include/pango-1.0 -I/usr/local/include/cairo -I/usr/local/include/atk-1.0  `sh -c 'pkg-config gtk+-2.0  2>/dev/null || gtk-config ' --cflags` -O2 -pipe -msse -msse2 -msse3 -mmmx -m3dnow -mtune=athlon64 -fno-strict-aliasing -march=athlon-mp  -c ./gtk.c -o gtk.o
Illegal option --
cc1: warnings being treated as errors
./gtk.c: In function 'main':
./gtk.c:2401: warning: 'error' may be used uninitialized in this function
*** Error code 1

Stop in /mnt/400gb/Gosha/BSD-PORTS/Tatham_puzzle/src/puzzles-r8972.
Вижу вроде что предупреждения считаются за ошибки и ещё какая-то иллегальная опция, но как это решить не знаю. Не программер я, ну или очень не шибкий :) Как дальше решать?

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-18 22:41:03
hizel
исходники еще и не собираются

я в Makefile изменил
-GTK_CONFIG = sh -c 'pkg-config gtk+-2.0 $$0 2>/dev/null || gtk-config $$0'
+GTK_CONFIG = pkg-config gtk+-2.0

исходники вообще должны собираться?

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-18 23:01:20
hizel
кстати собирается без всяких пендантиков, -Wall и -Werror
и естественно собирать через gmake

вот теперь можете портерс хэндбук раскуривать

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-19 12:54:24
hizel
у меня собралось, а у вас? :)

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-19 16:17:49
Гость
Будешь делать порт, поменяй `:=' на `+=' в CFLAGS, а также потри -O2, -g, -Werror.
-Werror (точнее -Wall) слишком привязан к компилятору. Например, на gcc45 и clang ты некоторых варнингов не увидишь.
-O2 для портов наследуется из CFLAGS в (sys.mk и make.conf)
-g наследуется из DEBUG_FLAGS (bsd.port.mk и make.conf)

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-19 16:59:53
goshanecr
hizel писал(а):у меня собралось, а у вас? :)
У меня тоже собралось, сейчас жую хендбук :)
Гость писал(а):Будешь делать порт, поменяй `:=' на `+=' в CFLAGS, а также потри -O2, -g, -Werror.
-Werror (точнее -Wall) слишком привязан к компилятору. Например, на gcc45 и clang ты некоторых варнингов не увидишь.
-O2 для портов наследуется из CFLAGS в (sys.mk и make.conf)
-g наследуется из DEBUG_FLAGS (bsd.port.mk и make.conf)
Ок, подмутим :) Спасибо за помощь :)

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-19 17:23:11
goshanecr
Товарищи, имя дистрибутивного файла puzzles-r8972.tar.gz, мне в Makefile порта можно указать PORTVERSION=r8972 или надо указать имя файла в DISTFILES?

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-19 18:28:08
hizel
проще r8972

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-19 18:47:24
goshanecr
Так я тоже сначала думал так написать, потом прочитал что надо оформлять порт чрезвычайно аккуратно, что с косяками не примут, а в хендбуке только чисто циферные примеры этой переменной оказались а дальше написано "нестандартные именования пакетов в DISTFILES" :) Спасибо!

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-19 20:16:12
goshanecr
А стоит ли для данного набора игр сделать возможность выбора какие из них устанавливать? Или такое усложнение для такого простого порта не к месту?

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-19 20:32:43
hizel
двигались бы вы от простого к сложному,не усложняйте себе жизнь :]

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-19 20:53:51
goshanecr
Да так то вроде тут просто всё. Вопрос вот возник, среди скомпилированных мгр, есть например игра net и у меня в /usr/local/bin есть "самбовый" net, как разрулить эту ситуацию? В хендбуке написано что можно свой PREFIX указать, но делать это чрезвычайно не рекомендуется. Что-нибудь навроде PREFIX=${LOCALBASE}/bin/puzzles можно указать?

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-19 21:33:38
Гость
можной пойти по стопам sysutils/coreutils и использовать префикс в имени. Иначе можно задолбаться заполнять CONFLICTS.

Код: Выделить всё

--- Makefile~
+++ Makefile
@@ -3,24 +3,20 @@
 # This file was created by `mkfiles.pl' from the `Recipe' file.
 # DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.
 
-# You can define this path to point at your tools if you need to
-# TOOLPATH = /opt/gcc/bin
-CC := $(TOOLPATH)$(CC)
 # You can manually set this to `gtk-config' or `pkg-config gtk+-1.2'
 # (depending on what works on your system) if you want to enforce
 # building with GTK 1.2, or you can set it to `pkg-config gtk+-2.0'
 # if you want to enforce 2.0. The default is to try 2.0 and fall back
 # to 1.2 if it isn't found.
-GTK_CONFIG = sh -c 'pkg-config gtk+-2.0 $$0 2>/dev/null || gtk-config $$0'
+GTK_CONFIG = pkg-config gtk+-2.0
 
-CFLAGS := -O2 -Wall -Werror -ansi -pedantic -g -I./ -Iicons/ `$(GTK_CONFIG) \
-		--cflags` $(CFLAGS)
+CFLAGS += -Wall -ansi -pedantic -I./ -Iicons/ `$(GTK_CONFIG) --cflags`
 XLIBS = `$(GTK_CONFIG) --libs`
 ULIBS =#
 INSTALL=install
 INSTALL_PROGRAM=$(INSTALL)
 INSTALL_DATA=$(INSTALL)
-prefix=/usr/local
+prefix?=/usr/local
 exec_prefix=$(prefix)
 bindir=$(exec_prefix)/bin
 gamesdir=$(exec_prefix)/games
@@ -617,7 +613,10 @@ GAMES += untangle
 version.o: version.c version2.def
 	$(CC) $(COMPAT) $(XFLAGS) $(CFLAGS) `cat version2.def` -c version.c
 version2.def: FORCE
-	if test -z "$(VER)" && test -f manifest && md5sum -c manifest; then \
+	@if test -z "$(VER)" && test -f manifest && while read md5sum file; do \
+		if [ "`md5 -r $$file`" != "$$md5sum $$file" ]; then \
+			echo "*** checksum mismatch: $$file"; \
+		fi; done <manifest; then \
 		cat version.def > version2.def.new; \
 	elif test -z "$(VER)" && test -d .svn && svnversion . >/dev/null 2>&1; then \
 		echo "-DREVISION=`svnversion .`" >version2.def.new; \
@@ -632,7 +631,7 @@ version2.def: FORCE
 .PHONY: FORCE
 install:
 	for i in $(GAMES); do \
-		$(INSTALL_PROGRAM) -m 755 $$i $(DESTDIR)$(gamesdir)/$$i \
+		$(INSTALL_PROGRAM) -m 755 $$i $(DESTDIR)$(bindir)/puzzles-$$i \
 		|| exit 1; \
 	done
 

Код: Выделить всё

$ export prefix=$HOME/aaa
$ mkdir -p $prefix/bin
$ gmake -j3
$ gmake install
$ ls -1 $prefix/bin
puzzles-blackbox
puzzles-bridges
puzzles-cube
puzzles-dominosa
puzzles-fifteen
puzzles-filling
puzzles-flip
puzzles-galaxies
puzzles-guess
puzzles-inertia
puzzles-keen
puzzles-lightup
puzzles-loopy
puzzles-magnets
puzzles-map
puzzles-mines
puzzles-net
puzzles-netslide
puzzles-pattern
puzzles-pegs
puzzles-rect
puzzles-samegame
puzzles-signpost
puzzles-singles
puzzles-sixteen
puzzles-slant
puzzles-solo
puzzles-tents
puzzles-towers
puzzles-twiddle
puzzles-unequal
puzzles-untangle

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-19 21:40:44
Гость
goshanecr писал(а):Товарищи, имя дистрибутивного файла puzzles-r8972.tar.gz, мне в Makefile порта можно указать PORTVERSION=r8972 или надо указать имя файла в DISTFILES?
Можно сделать так

Код: Выделить всё

PORTNAME= puzzles
PORTVERSION= 8972
DISTVERSIONPREFIX= r

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-19 22:05:56
goshanecr
Ух... Всё за меня сделали а я в итоге учусь :)

Re: Создание порта приложения для FreeBSD

Добавлено: 2010-08-19 23:39:07
Гость
Не все. На создание скелета порта обычно уходит больше времени, чем на исправление багов компиляции/инсталляции.

Конфликты имен - не единственная деталь, коя плохо расписана в handbook. Подобные вопросы лучше спрашивать на freebsd-ports@. Там больше шанс, что вредный совет заметят.