make

classic Classic list List threaded Threaded
13 messages Options
Reply | Threaded
Open this post in threaded view
|

make

Anton Maksimenkov-2
Доброго времени.

Подскажите, пожалуйста, как заставить make вытворить такой довольно
простой финт.
Есть папка, с проектом.
В ней две папки - srv и mycoolprog
+
|-Makefile
|-Makefile.inc
|-srv/
|-mycoolprog/

Makefile
SUBDIR= srv mycoolprog
.include <bsd.subdir.mk>

и Makefile.inc
CFLAGS+= -I${.CURDIR}/../srv
CFLAGS+= -I/usr/local/include -I/usr/local/include/postgresql
-I/usr/include/openssl -I/usr/include/sys/
CFLAGS+= -DDEBUG
LDFLAGS+= -L/usr/local/lib -L/usr/lib -lpq -lssl -lcrypto
OS!= uname
.if ${OS} == "FreeBSD"
NO_MAN= "YES"
.endif
.if ${OS} == "OpenBSD"
.endif

- их я срисовал по впечатлению от cnupm'а
(http://www.openbsd.ru/cgi-bin/cvsweb/src/cnupm/).
В который раз спасибо Олегу.

Далее, в папке mycoolprog тоже лежит Makefile
PROG= mycoolprog
SRCS= mycoolprog.c func.o <-- не работает
.include <bsd.prog.mk>

тоже слизанный с http://www.openbsd.ru/cgi-bin/cvsweb/src/cnupm/cnupm/.

В папке же srv лежит "как бы библиотека", func.c. Не библиотека, а
просто файлик с функциями; их использует mycoolprog.
Я бы хотел чтобы он превращался в .o файл, и чтобы mycoolprog при
сборке бы подхватывала этот func.o.
Ну и ессно так чтобы make потом "чуяла" где что изменилось и
пересобирала только нужное.
Например тот же func.o будет меняться редко и его каждый раз
пересобирать неохота.
Ну и конечно, если func.c меняется, то и он и mycoolprog должно пересобираться.
Вобщем, как обычно.

1) Если в srv положить похожий Makefile, он же пытается рабочий
бинарник собирать и ессно обламывается, хотя искомый objик в процессе
оставляет. Если PROG убрать, то вообще не собирает.
2) Если в mycoolprog в Makefile написать просто
SRCS= mycoolprog.c func.o
,то оно его не видит. Если написать
SRCS= mycoolprog.c ../srv/func.o
то видит.

Подскажите, как это дело правильно забороть?
--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: make

Dinar Talypov


По правильному,
надо просто указывать в SRCS, например
SRCS+= func.c lak.c ../srv/buhlo.c ../srv/puBo.c

При первой сборке собирется все, далее только то что нужно.


--
Dinar Talypov

Reply | Threaded
Open this post in threaded view
|

Re: make

Dinar Talypov
In reply to this post by Anton Maksimenkov-2


> Подскажите, как это дело правильно забороть?
Кстати, в догонку можно посмотреть Makefile в /usr/src/usr.sbin/bgpctl
там есть такая вещь как PATH
--
Dinar Talypov <[hidden email]>

Reply | Threaded
Open this post in threaded view
|

Re: make

Anton Maksimenkov-2
In reply to this post by Dinar Talypov
23 ноября 2010 г. 22:35 пользователь Dinar Talypov <[hidden email]> написал:
> надо просто указывать в SRCS, например
> SRCS+= func.c lak.c ../srv/buhlo.c ../srv/puBo.c

Не. Получается ошибка
cc: ../srv/func.o: No such file or directory
*** Error code 1

Хотя o-файлик он собирает, но в СВОЕЙ директории, а не в ../srv/
Мне надо чтобы .о оставался в srv/

> Кстати, в догонку можно посмотреть Makefile в /usr/src/usr.sbin/bgpctl
> там есть такая вещь как PATH

А вот это помогло.
.PATH:${.CURDIR}/../srv
SRCS= mycoolprog.c func.c

Тогда собирает.
Но блин, опять. Оно обжик func.o собирает в папке mycoolprog, а НЕ в srv.

Я, каюсь, сразу-то всю мечту не рассказал.
Идея была в том, чтобы использовать "библиотеку" func.o в нескольких
программках - mycoolprog, mycoolprog2, mycoolprog3...
И чтобы этот func.o лежал бы в папке srv, и каждый mycoolprog* при
сборке его подхватывал из папки srv. А не собирал у себя каждый раз.

Такое возможно?
--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: make

Dinar Talypov


>
> > Кстати, в догонку можно посмотреть Makefile в /usr/src/usr.sbin/bgpctl
> > там есть такая вещь как PATH
>
> А вот это помогло.
> .PATH:${.CURDIR}/../srv
> SRCS= mycoolprog.c func.c
>
> Тогда собирает.
> Но блин, опять. Оно обжик func.o собирает в папке mycoolprog, а НЕ в srv.
А он всегда там будет, я так думаю :)

можно указать OBJS+= func.o

Хотя можно извратится, создать каталог obj и в другой папке сделать на него симлинк,
тогда все .o файлы будут лежать в одном каталоге


--
Dinar Talypov <[hidden email]>

Reply | Threaded
Open this post in threaded view
|

Re: make

Alexander Yurchenko-3
In reply to this post by Anton Maksimenkov-2
Правильней всего делать так.

libcool
coolprog1
coolprog2

В libcool собирать .a архив (aka статическая библиотека). В
coolprog[12] в Makefile писать
LIBS=-lcool
-L../libcool

23 ноября 2010 г. 20:12 пользователь Anton Maksimenkov
<[hidden email]> написал:

> Доброго времени.
>
> Подскажите, пожалуйста, как заставить make вытворить такой довольно
> простой финт.
> Есть папка, с проектом.
> В ней две папки - srv и mycoolprog
> +
> |-Makefile
> |-Makefile.inc
> |-srv/
> |-mycoolprog/
>
> Makefile
> SUBDIR= srv mycoolprog
> .include <bsd.subdir.mk>
>
> и Makefile.inc
> CFLAGS+=        -I${.CURDIR}/../srv
> CFLAGS+=        -I/usr/local/include -I/usr/local/include/postgresql
> -I/usr/include/openssl -I/usr/include/sys/
> CFLAGS+=        -DDEBUG
> LDFLAGS+=       -L/usr/local/lib -L/usr/lib -lpq -lssl -lcrypto
> OS!=    uname
> .if ${OS} == "FreeBSD"
> NO_MAN= "YES"
> .endif
> .if ${OS} == "OpenBSD"
> .endif
>
> - их я срисовал по впечатлению от cnupm'а
> (http://www.openbsd.ru/cgi-bin/cvsweb/src/cnupm/).
> В который раз спасибо Олегу.
>
> Далее, в папке mycoolprog тоже лежит Makefile
> PROG=   mycoolprog
> SRCS=   mycoolprog.c func.o <-- не работает
> .include <bsd.prog.mk>
>
> тоже слизанный с http://www.openbsd.ru/cgi-bin/cvsweb/src/cnupm/cnupm/.
>
> В папке же srv лежит "как бы библиотека", func.c. Не библиотека, а
> просто файлик с функциями; их использует mycoolprog.
> Я бы хотел чтобы он превращался в .o файл, и чтобы mycoolprog при
> сборке бы подхватывала этот func.o.
> Ну и ессно так чтобы make потом "чуяла" где что изменилось и
> пересобирала только нужное.
> Например тот же func.o будет меняться редко и его каждый раз
> пересобирать неохота.
> Ну и конечно, если func.c меняется, то и он и mycoolprog должно пересобираться.
> Вобщем, как обычно.
>
> 1) Если в srv положить похожий Makefile, он же пытается рабочий
> бинарник собирать и ессно обламывается, хотя искомый objик в процессе
> оставляет. Если PROG убрать, то вообще не собирает.
> 2) Если в mycoolprog в Makefile написать просто
> SRCS=   mycoolprog.c func.o
> ,то оно его не видит. Если написать
> SRCS=   mycoolprog.c ../srv/func.o
> то видит.
>
> Подскажите, как это дело правильно забороть?
> --
> antonvm
>



--
Alexander Yurchenko
Reply | Threaded
Open this post in threaded view
|

Re: make

Anton Maksimenkov-2
24 ноября 2010 г. 12:19 пользователь Alexander Yurchenko
<[hidden email]> написал:
> В libcool собирать .a архив (aka статическая библиотека).

Ну так-то да... тока вот я в своё время поленился сборку либы до
кроссплатформенности довести, вот и извиваюсь теперь :). Хотя cnupm в
этом плане, думаю, поможет.

Попутный вопрос. Вариант со статической библиотекой работает так же
быстро как и полная сборка с обжиком? Я просто не знаю деталей, чем
различается компоновка. Кажется, что в работе различаться почти что не
должно. Разве что сам бинарник как-то менее оптимально будет собран с
вытекающими из этого мелочами?
--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: make

Alexander Yurchenko-3
24 ноября 2010 г. 11:07 пользователь Anton Maksimenkov
<[hidden email]> написал:

> 24 ноября 2010 г. 12:19 пользователь Alexander Yurchenko
> <[hidden email]> написал:
>> В libcool собирать .a архив (aka статическая библиотека).
>
> Ну так-то да... тока вот я в своё время поленился сборку либы до
> кроссплатформенности довести, вот и извиваюсь теперь :). Хотя cnupm в
> этом плане, думаю, поможет.
>
> Попутный вопрос. Вариант со статической библиотекой работает так же
> быстро как и полная сборка с обжиком? Я просто не знаю деталей, чем

.a -- это просто ar архив с .o файлами, сборка ничем не отличается от
прямой линковки с объектником.

> различается компоновка. Кажется, что в работе различаться почти что не
> должно. Разве что сам бинарник как-то менее оптимально будет собран с
> вытекающими из этого мелочами?
> --
> antonvm
>



--
Alexander Yurchenko
Reply | Threaded
Open this post in threaded view
|

Re: make

Anton Maksimenkov-2
In reply to this post by Anton Maksimenkov-2
Хочется странного...
А есть вариант, чтобы оно ещё и .h файлы проверяло?
Сейчас они тока через #include участвуют, но может как-то указать
чтобы отслеживались...
--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: make

Alexander Yurchenko-3
29 ноября 2010 г. 15:04 пользователь Anton Maksimenkov
<[hidden email]> написал:
> Хочется странного...
> А есть вариант, чтобы оно ещё и .h файлы проверяло?
> Сейчас они тока через #include участвуют, но может как-то указать
> чтобы отслеживались...

make depend

> --
> antonvm
>



--
Alexander Yurchenko
Reply | Threaded
Open this post in threaded view
|

Re: make

Anton Maksimenkov-2
И вот ещё такая штука... "Пропала из виду" errno.

Ругается так:
srvc: In function 'do_accept':
srvc:134: error: 'errno' undeclared (first use in this function)
srvc:134: error: (Each undeclared identifier is reported only once
srvc:134: error: for each function it appears in.)
*** Error code 1

на такой вот код:
void
do_accept (struct kevent const *const kep)
{
        int s;
        struct sockaddr_storage sin;
        auto socklen_t sinsiz = sizeof(sin);

        sin.ss_len = sinsiz;
        if ((s = accept(kep->ident, (struct sockaddr *)&sin, &sinsiz)) == -1) {
тут->> if (errno == EWOULDBLOCK) {
                        printf("accept EWOULDBLOCK");
                        return;
                } else {
                        syslog(LOG_ERR, "error in accept(): %m");
                        return;
                }
        }
        //...

Если явно объявлено, например глобально, extern int errno, то компилится норм.
Два вопроса, ну или... вобщем вот:
 - как так получается, что она "пропадает" (ведь #include <errno.h> объявлено)?
 - явное объявление исправляет или "затыкает ошибку"?
(есть подозрение: а "работает ли" errno после этого, смысле
устанавливается ли как надо, например для вышеприведённого кода?
потому как судя по /usr/include/errno.h тут не так всё просто).
--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: make

Anton Maksimenkov-2
30 ноября 2010 г. 0:09 пользователь Anton Maksimenkov
<[hidden email]> написал:
> Ругается так:
> srvc: In function 'do_accept':
> srvc:134: error: 'errno' undeclared (first use in this function)
> srvc:134: error: (Each undeclared identifier is reported only once
> srvc:134: error: for each function it appears in.)
> *** Error code 1

Обнаружил. После того, как в Makefile добавляются строчки:

CFLAGS+= -I/usr/local/include -I/usr/local/include/postgresql
-I/usr/include/openssl -I/usr/include/sys/
LDFLAGS+= -L/usr/local/lib -L/usr/lib -lpq -lssl -lcrypto

Конкретно, из-за -I/usr/include/sys/ и начинается. Там, в
/usr/include/sys/, лежит свой errno.h, который "не тот". Да и вообще.
Эту -I/usr/include/sys/ я даже не помню уже зачем взял (из одной
старой програмки вытащил).
Может там чо-то для фряхи такое было надобно, толи для линукса, толи
для посгриса, толи для ssl, толи... ну не помню.

Убрал пока, и радуюсь.
По крайней мере на опене; на фре собирать ещё не пробовал (попробую -
отпишусь, может кому-то пригодится).
--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: make

Andrey N. Oktyabrski-2

On 11/30/10 10:03, Anton Maksimenkov wrote:
> Убрал пока, и радуюсь.
> По крайней мере на опене; на фре собирать ещё не пробовал (попробую -
> отпишусь, может кому-то пригодится).
возьми уже mk-configure ;-)