{"id":457513,"date":"2025-04-26T15:00:45","date_gmt":"2025-04-26T15:00:45","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=457513"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2025-04-26T15:00:45","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=457513","title":{"rendered":"<span>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0439 .\/configure<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0418\u0437\u0432\u0438\u043d\u0438\u0442\u0435, \u043d\u043e \u0432 2025 \u0433\u043e\u0434\u0443 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043c\u0435\u0448\u043d\u043e:  <\/p>\n<pre><code class=\"bash\">$ time .\/configure ... .\/configure  13.80s user 12.72s system 69% cpu 38.018 total $ time make -j48 ... make -j48  12.05s user 4.70s system 593% cpu 2.822 total<\/code><\/pre>\n<p>\u042f \u0437\u0430\u043f\u043b\u0430\u0442\u0438\u043b \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u0435\u043d\u044c\u0433\u0438 \u0437\u0430 24 \u044f\u0434\u0440\u0430 CPU, \u0430 <code><strong>.\/configure<\/strong><\/code> \u0443\u043c\u0443\u0434\u0440\u044f\u0435\u0442\u0441\u044f \u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e 69% \u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430! \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u044d\u0442\u043e\u0442 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0442\u0441\u044f \u0432 <strong>13.5 \u0440\u0430\u0437 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435<\/strong>, \u0447\u0435\u043c \u043f\u043e\u0442\u043e\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>.\/configure<\/code> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0448\u043b\u0438. \u0422\u0438\u043f\u0430: \u0435\u0441\u0442\u044c \u043b\u0438 \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043f\u043e\u043b\u044f \u2014 \u0447\u0442\u043e\u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u044b\u0439 \u043a\u043e\u0434. \u042d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u0441\u044f, \u043d\u043e \u0430\u0432\u0442\u043e\u0442\u0443\u043b\u044b (autoconf, cmake, meson \u0438 \u043f\u0440\u043e\u0447\u0438\u0435) \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435 \u0443\u043c\u0435\u044e\u0442 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c.  <\/p>\n<p>\u0422\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 configure \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"vala\">CFLAGS=\"-g\" if $CC $CFLAGS -Wall empty.c; then     CFLAGS=\"$CFLAGS -Wall\" fi  : &amp;gt;config.h if $CC $CFLAGS have_statx.c; then     echo \"#define HAVE_STATX 1\" &amp;gt;&amp;gt;config.h else     echo \"#define HAVE_STATX 0\" &amp;gt;&amp;gt;config.h fi ... <\/code><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0434\u0443\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0425\u043e\u0442\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0438\u0445 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0433\u043d\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u2014 make!<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e?  \u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0423 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 <code>configure.mk<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0442\u044c <code>Makefile<\/code>  \u0438 <code>config.h<\/code> \u0447\u0435\u0440\u0435\u0437 <code>make -j<\/code>:<\/p>\n<pre><code class=\"vala\"># configure.mk # The default goal generates both outputs, and merges the logs together config: Makefile config.h     cat Makefile.log config.h.log &gt;$@.log     rm Makefile.log config.h.log<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u044b.  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <\/p>\n<pre><code class=\"vala\"># configure.mk  # \u0414\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439: CC ?= cc CPPFLAGS ?= -D_GNU_SOURCE CFLAGS ?= -g LDFLAGS ?=  # \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0438\u0445, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043b\u0435\u0448\u0435\u0439: export _CC=${CC} export _CPPFLAGS=${CPPFLAGS} export _CFLAGS=${CFLAGS} export _LDFLAGS=${LDFLAGS}  #\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c Makefile: Makefile:     printf 'CC := %s\\n' \"$$_CC\" &gt;$@     printf 'CPPFLAGS := %s\\n' \"$$_CPPFLAGS\" &gt;&gt;$@     printf 'CFLAGS := %s\\n' \"$$_CFLAGS\" &gt;&gt;$@     printf 'LDFLAGS := %s\\n' \"$$_LDFLAGS\" &gt;&gt;$@ <\/code><\/pre>\n<p>\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 export \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043b\u0435\u0448\u0435\u0439 \u0438\u0437 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0442\u0438\u043f\u0430 \u0442\u0430\u043a\u0438\u0445:<\/p>\n<pre><code class=\"bash\">$ .\/configure CPPFLAGS='-DMACRO=\\\"string\\\"'<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0444\u043b\u0430\u0433\u043e\u0432 (-Wall, -pthread, \u0438 \u0442.\u0434.) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 <code>flags.sh<\/code>:<\/p>\n<pre><code class=\"bash\">#!\/bin\/sh  set -eu  VAR=\"$1\" FLAGS=\"$2\" shift 2  if \"$@\" $FLAGS; then     printf '%s += %s\\n' \"$VAR\" \"$FLAGS\" fi <\/code><\/pre>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"bash\">$ .\/flags.sh CFLAGS -Wall cc empty.c  CFLAGS += -Wall<\/code><\/pre>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u0442  <code>CFLAGS += -Wall<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 <code>cc empty.c -Wall<\/code> \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e. <\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 makefile, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0444\u043b\u0430\u0433\u0438. <\/p>\n<pre><code class=\"vala\">ALL_FLAGS = ${CPPFLAGS} ${CFLAGS} ${LDFLAGS}  # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0444\u043b\u0430\u0433\u0430\u043c\u0438, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f # # - stdout \u0432 foo.mk (\u043d\u0430\u043f\u0440. CFLAGS += -flag) # - stderr \u0432 foo.mk.log (\u043d\u0430\u043f\u0440. error: unrecognized command-line option \u2018-flag\u2019) # - \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u0432 foo.mk.out #   - \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u0440\u0430\u0437\u0443 \u0438\u0445 \u0443\u0434\u0430\u043b\u044f\u0435\u043c TRY_CC = ${CC} ${ALL_FLAGS} empty.c -o $@.out &gt;$@ 2&gt;$@.log &amp;&amp; rm -f $@.out $@.d  deps.mk:     .\/flags.sh CPPFLAGS \"-MP -MD\" ${TRY_CC} Wall.mk:     .\/flags.sh CFLAGS -Wall ${TRY_CC} pthread.mk:     .\/flags.sh CFLAGS -pthread ${TRY_CC} bind-now.mk:     .\/flags.sh LDFLAGS -Wl,-z,now ${TRY_CC}<\/code><\/pre>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0442\u0430\u0440\u0433\u0435\u0442\u043e\u0432 \u0433\u0435\u043d\u0435\u0440\u0438\u0442 \u043a\u0440\u043e\u0448\u0435\u0447\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043c\u044d\u0439\u043a\u0444\u0430\u0439\u043b\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043e\u0434\u0438\u043d \u0444\u043b\u0430\u0433 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e, \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e! <\/p>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0441\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0433\u043e\u0442\u043e\u0432\u044b, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u0445 \u0432\u0441\u0435 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b <code>Makefile<\/code> \u0438  \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043c\u0443\u0441\u043e\u0440: <\/p>\n<pre><code class=\"vala\">FLAGS := \\     deps.mk \\     Wall.mk \\     pthread.mk \\     bind-now.mk  Makefile: ${FLAGS}     printf 'CC := %s\\n' \"$$_CC\" &gt;$@     ...     cat ${FLAGS} &gt;&gt;$@     cat ${FLAGS:%=%.log} &gt;$@.log     rm ${FLAGS} ${FLAGS:%=%.log}<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 Makefile \u0442\u0443 \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 <code>main.mk<\/code> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <\/p>\n<pre><code class=\"1c\">#main.mk OBJS := main.o  app: ${OBJS}     ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} -o $@  ${OBJS}:     ${CC} ${CPPFLAGS} ${CFLAGS} -c ${@:.o=.c} -o $@  -include ${OBJS:.o=.d}<\/code><\/pre>\n<p>\u0410 \u0437\u0430\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 <code>Makefile<\/code> \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0444\u043b\u0430\u0433\u043e\u0432:<\/p>\n<pre><code class=\"1c\">Makefile: ${FLAGS}     ...     cat main.mk &gt;&gt;$@<\/code><\/pre>\n<p>\u0415\u0449\u0451 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c config.h, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0449\u0438\u0435 \u043d\u0430\u043c, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\/\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\/\u0444\u0443\u043d\u043a\u0446\u0438\u0438\/\u043f\u043e\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438 \u0442.\u0434. <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0444\u0438\u0447\u0438 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u043c\u0438\u043a\u0440\u043e-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 statx() <code>have_statx.c<\/code> :<\/p>\n<pre><code class=\"cpp\">#include &lt;fcntl.h&gt; #include &lt;sys\/stat.h&gt;  int main(void) {     struct statx stx;     return statx(AT_FDCWD, \".\", 0, STATX_BTIME, &amp;stx); }<\/code><\/pre>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 st_birthtim() <code>have_st_birthtim.c<\/code> :<\/p>\n<pre><code class=\"cpp\">#include &lt;sys\/stat.h&gt;  int main(void) {     struct stat sb = {0};     return sb.st_birthtim.tv_sec; }<\/code><\/pre>\n<p>\u0410 <code>define.sh<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u043c\u0430\u043a\u0440\u043e\u0441:  <\/p>\n<pre><code class=\"bash\">#!\/bin\/sh  set -eu  MACRO=$1 shift  if \"$@\"; then     printf '#define %s 1\\n' \"$MACRO\" else     printf '#define %s 0\\n' \"$MACRO\" fi<\/code><\/pre>\n<p>\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: <\/p>\n<pre><code class=\"cpp\">#define HAVE_STATX 1 #define HAVE_ST_BIRTHTIM 0<\/code><\/pre>\n<p> \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 makefile \u0432\u043e\u0442 \u0442\u0430\u043a: <\/p>\n<pre><code class=\"1c\">#configure.mk  # Use a recursive make to pick up our auto-detected *FLAGS from above config.h: Makefile     +${MAKE} -f header.mk $@<\/code><\/pre>\n<pre><code class=\"1c\">#header.mk  # Get the final *FLAGS values from the Makefile include Makefile  # We first generate a lot of small headers, before merging them into one big one HEADERS := \\     have_statx.h \\     have_st_birthtim.h \\     have_st_birthtimespec.h \\     have___st_birthtim.h  # Strip .h and capitalize the macro name MACRO = $$(printf '%s' ${@:.h=} | tr 'a-z' 'A-Z')  ALL_FLAGS = ${CPPFLAGS} ${CFLAGS} ${LDFLAGS}  ${HEADERS}:     .\/define.sh ${MACRO} ${CC} ${ALL_FLAGS} ${@:.h=.c} -o $@.out &gt;$@ 2&gt;$@.log     rm -f $@.out $@.d <\/code><\/pre>\n<p>\u0418 \u043f\u043e\u0442\u043e\u043c \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u043a\u043b\u0435\u0438\u0442\u044c \u0432 <code>config.h<\/code> \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">#header.mk config.h: ${HEADERS}     printf '#ifndef CONFIG_H\\n' &gt;$@     printf '#define CONFIG_H\\n' &gt;&gt;$@     cat ${HEADERS} &gt;&gt;$@     printf '#endif\\n' &gt;&gt;$@     cat ${HEADERS:%=%.log} &gt;$@.log     rm ${HEADERS} ${HEADERS:%=%.log}<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 <code>.\/configure<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u043e: <\/p>\n<pre><code class=\"bash\">#!\/bin\/sh  set -eu  # Guess a good number for make -j&lt;N&gt; jobs() {     {         nproc \\             || sysctl -n hw.ncpu \\             || getconf _NPROCESSORS_ONLN \\             || echo 1     } 2&gt;\/dev\/null }  # Default to MAKE=make MAKE=\"${MAKE-make}\"  # Set MAKEFLAGS to -j$(jobs) if it's unset export MAKEFLAGS=\"${MAKEFLAGS--j$(jobs)}\"  $MAKE -r -f configure.mk \"$@\"<\/code><\/pre>\n<p>\u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0440\u0430\u0431\u043e\u0447\u0438\u0439 <a href=\"https:\/\/github.com\/tavianator\/parconf\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 GitHub<\/a> \u0433\u0434\u0435 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u0435. \u0414\u0435\u043c\u043e \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u043f\u043e\u0439\u043c\u0435\u0442 \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0430 \u0432\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<p>\u042f \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <a href=\"https:\/\/tavianator.com\/projects\/bfs.html\" rel=\"noopener noreferrer nofollow\">bfs<\/a>, \u0438 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043b\u043e\u0441\u0441\u0430\u043b\u044c\u043d\u0430\u044f:<\/p>\n<pre><code class=\"bash\">$ time .\/configure ... .\/configure  1.44s user 1.78s system 802% cpu 0.401 total  $ time make -j48 ... make -j48  1.89s user 0.64s system 817% cpu 0.310 total <\/code><\/pre>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU \u043d\u0430 802% \u0432\u043c\u0435\u0441\u0442\u043e 69% \u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430 \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u0441\u043c\u0435\u0448\u043d\u043e, \u044d\u0442\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/904664\/\"> https:\/\/habr.com\/ru\/articles\/904664\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0418\u0437\u0432\u0438\u043d\u0438\u0442\u0435, \u043d\u043e \u0432 2025 \u0433\u043e\u0434\u0443 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043c\u0435\u0448\u043d\u043e:  <\/p>\n<pre><code class=\"bash\">$ time .\/configure ... .\/configure  13.80s user 12.72s system 69% cpu 38.018 total $ time make -j48 ... make -j48  12.05s user 4.70s system 593% cpu 2.822 total<\/code><\/pre>\n<p>\u042f \u0437\u0430\u043f\u043b\u0430\u0442\u0438\u043b \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u0435\u043d\u044c\u0433\u0438 \u0437\u0430 24 \u044f\u0434\u0440\u0430 CPU, \u0430 <code><strong>.\/configure<\/strong><\/code> \u0443\u043c\u0443\u0434\u0440\u044f\u0435\u0442\u0441\u044f \u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e 69% \u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430! \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u044d\u0442\u043e\u0442 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0442\u0441\u044f \u0432 <strong>13.5 \u0440\u0430\u0437 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435<\/strong>, \u0447\u0435\u043c \u043f\u043e\u0442\u043e\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>.\/configure<\/code> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0448\u043b\u0438. \u0422\u0438\u043f\u0430: \u0435\u0441\u0442\u044c \u043b\u0438 \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043f\u043e\u043b\u044f \u2014 \u0447\u0442\u043e\u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u044b\u0439 \u043a\u043e\u0434. \u042d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u0441\u044f, \u043d\u043e \u0430\u0432\u0442\u043e\u0442\u0443\u043b\u044b (autoconf, cmake, meson \u0438 \u043f\u0440\u043e\u0447\u0438\u0435) \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435 \u0443\u043c\u0435\u044e\u0442 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c.  <\/p>\n<p>\u0422\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 configure \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"vala\">CFLAGS=\"-g\" if $CC $CFLAGS -Wall empty.c; then     CFLAGS=\"$CFLAGS -Wall\" fi  : &amp;gt;config.h if $CC $CFLAGS have_statx.c; then     echo \"#define HAVE_STATX 1\" &amp;gt;&amp;gt;config.h else     echo \"#define HAVE_STATX 0\" &amp;gt;&amp;gt;config.h fi ... <\/code><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0434\u0443\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0425\u043e\u0442\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0438\u0445 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0433\u043d\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u2014 make!<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e?  \u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0423 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 <code>configure.mk<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0442\u044c <code>Makefile<\/code>  \u0438 <code>config.h<\/code> \u0447\u0435\u0440\u0435\u0437 <code>make -j<\/code>:<\/p>\n<pre><code class=\"vala\"># configure.mk # The default goal generates both outputs, and merges the logs together config: Makefile config.h     cat Makefile.log config.h.log &gt;$@.log     rm Makefile.log config.h.log<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u044b.  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <\/p>\n<pre><code class=\"vala\"># configure.mk  # \u0414\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439: CC ?= cc CPPFLAGS ?= -D_GNU_SOURCE CFLAGS ?= -g LDFLAGS ?=  # \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0438\u0445, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043b\u0435\u0448\u0435\u0439: export _CC=${CC} export _CPPFLAGS=${CPPFLAGS} export _CFLAGS=${CFLAGS} export _LDFLAGS=${LDFLAGS}  #\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c Makefile: Makefile:     printf 'CC := %s\\n' \"$$_CC\" &gt;$@     printf 'CPPFLAGS := %s\\n' \"$$_CPPFLAGS\" &gt;&gt;$@     printf 'CFLAGS := %s\\n' \"$$_CFLAGS\" &gt;&gt;$@     printf 'LDFLAGS := %s\\n' \"$$_LDFLAGS\" &gt;&gt;$@ <\/code><\/pre>\n<p>\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 export \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043b\u0435\u0448\u0435\u0439 \u0438\u0437 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0442\u0438\u043f\u0430 \u0442\u0430\u043a\u0438\u0445:<\/p>\n<pre><code class=\"bash\">$ .\/configure CPPFLAGS='-DMACRO=\\\"string\\\"'<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0444\u043b\u0430\u0433\u043e\u0432 (-Wall, -pthread, \u0438 \u0442.\u0434.) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 <code>flags.sh<\/code>:<\/p>\n<pre><code class=\"bash\">#!\/bin\/sh  set -eu  VAR=\"$1\" FLAGS=\"$2\" shift 2  if \"$@\" $FLAGS; then     printf '%s += %s\\n' \"$VAR\" \"$FLAGS\" fi <\/code><\/pre>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"bash\">$ .\/flags.sh CFLAGS -Wall cc empty.c  CFLAGS += -Wall<\/code><\/pre>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u0442  <code>CFLAGS += -Wall<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 <code>cc empty.c -Wall<\/code> \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e. <\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 makefile, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0444\u043b\u0430\u0433\u0438. <\/p>\n<pre><code class=\"vala\">ALL_FLAGS = ${CPPFLAGS} ${CFLAGS} ${LDFLAGS}  # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0444\u043b\u0430\u0433\u0430\u043c\u0438, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f # # - stdout \u0432 foo.mk (\u043d\u0430\u043f\u0440. CFLAGS += -flag) # - stderr \u0432 foo.mk.log (\u043d\u0430\u043f\u0440. error: unrecognized command-line option \u2018-flag\u2019) # - \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u0432 foo.mk.out #   - \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u0440\u0430\u0437\u0443 \u0438\u0445 \u0443\u0434\u0430\u043b\u044f\u0435\u043c TRY_CC = ${CC} ${ALL_FLAGS} empty.c -o $@.out &gt;$@ 2&gt;$@.log &amp;&amp; rm -f $@.out $@.d  deps.mk:     .\/flags.sh CPPFLAGS \"-MP -MD\" ${TRY_CC} Wall.mk:     .\/flags.sh CFLAGS -Wall ${TRY_CC} pthread.mk:     .\/flags.sh CFLAGS -pthread ${TRY_CC} bind-now.mk:     .\/flags.sh LDFLAGS -Wl,-z,now ${TRY_CC}<\/code><\/pre>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0442\u0430\u0440\u0433\u0435\u0442\u043e\u0432 \u0433\u0435\u043d\u0435\u0440\u0438\u0442 \u043a\u0440\u043e\u0448\u0435\u0447\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043c\u044d\u0439\u043a\u0444\u0430\u0439\u043b\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043e\u0434\u0438\u043d \u0444\u043b\u0430\u0433 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e, \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e! <\/p>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0441\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0433\u043e\u0442\u043e\u0432\u044b, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u0445 \u0432\u0441\u0435 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b <code>Makefile<\/code> \u0438  \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043c\u0443\u0441\u043e\u0440: <\/p>\n<pre><code class=\"vala\">FLAGS := \\     deps.mk \\     Wall.mk \\     pthread.mk \\     bind-now.mk  Makefile: ${FLAGS}     printf 'CC := %s\\n' \"$$_CC\" &gt;$@     ...     cat ${FLAGS} &gt;&gt;$@     cat ${FLAGS:%=%.log} &gt;$@.log     rm ${FLAGS} ${FLAGS:%=%.log}<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 Makefile \u0442\u0443 \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 <code>main.mk<\/code> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <\/p>\n<pre><code class=\"1c\">#main.mk OBJS := main.o  app: ${OBJS}     ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} -o $@  ${OBJS}:     ${CC} ${CPPFLAGS} ${CFLAGS} -c ${@:.o=.c} -o $@  -include ${OBJS:.o=.d}<\/code><\/pre>\n<p>\u0410 \u0437\u0430\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 <code>Makefile<\/code> \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0444\u043b\u0430\u0433\u043e\u0432:<\/p>\n<pre><code class=\"1c\">Makefile: ${FLAGS}     ...     cat main.mk &gt;&gt;$@<\/code><\/pre>\n<p>\u0415\u0449\u0451 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c config.h, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0449\u0438\u0435 \u043d\u0430\u043c, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\/\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\/\u0444\u0443\u043d\u043a\u0446\u0438\u0438\/\u043f\u043e\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438 \u0442.\u0434. <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0444\u0438\u0447\u0438 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u043c\u0438\u043a\u0440\u043e-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 statx() <code>have_statx.c<\/code> :<\/p>\n<pre><code class=\"cpp\">#include &lt;fcntl.h&gt; #include &lt;sys\/stat.h&gt;  int main(void) {     struct statx stx;     return statx(AT_FDCWD, \".\", 0, STATX_BTIME, &amp;stx); }<\/code><\/pre>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 st_birthtim() <code>have_st_birthtim.c<\/code> :<\/p>\n<pre><code class=\"cpp\">#include &lt;sys\/stat.h&gt;  int main(void) {     struct stat sb = {0};     return sb.st_birthtim.tv_sec; }<\/code><\/pre>\n<p>\u0410 <code>define.sh<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u043c\u0430\u043a\u0440\u043e\u0441:  <\/p>\n<pre><code class=\"bash\">#!\/bin\/sh  set -eu  MACRO=$1 shift  if \"$@\"; then     printf '#define %s 1\\n' \"$MACRO\" else     printf '#define %s 0\\n' \"$MACRO\" fi<\/code><\/pre>\n<p>\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: <\/p>\n<pre><code class=\"cpp\">#define HAVE_STATX 1 #define HAVE_ST_BIRTHTIM 0<\/code><\/pre>\n<p> \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 makefile \u0432\u043e\u0442 \u0442\u0430\u043a: <\/p>\n<pre><code class=\"1c\">#configure.mk  # Use a recursive make to pick up our auto-detected *FLAGS from above config.h: Makefile     +${MAKE} -f header.mk $@<\/code><\/pre>\n<pre><code class=\"1c\">#header.mk  # Get the final *FLAGS values from the Makefile include Makefile  # We first generate a lot of small headers, before merging them into one big one HEADERS := \\     have_statx.h \\     have_st_birthtim.h \\     have_st_birthtimespec.h \\     have___st_birthtim.h  # Strip .h and capitalize the macro name MACRO = $$(printf '%s' ${@:.h=} | tr 'a-z' 'A-Z')  ALL_FLAGS = ${CPPFLAGS} ${CFLAGS} ${LDFLAGS}  ${HEADERS}:     .\/define.sh ${MACRO} ${CC} ${ALL_FLAGS} ${@:.h=.c} -o $@.out &gt;$@ 2&gt;$@.log     rm -f $@.out $@.d <\/code><\/pre>\n<p>\u0418 \u043f\u043e\u0442\u043e\u043c \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u043a\u043b\u0435\u0438\u0442\u044c \u0432 <code>config.h<\/code> \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">#header.mk config.h: ${HEADERS}     printf '#ifndef CONFIG_H\\n' &gt;$@     printf '#define CONFIG_H\\n' &gt;&gt;$@     cat ${HEADERS} &gt;&gt;$@     printf '#endif\\n' &gt;&gt;$@     cat ${HEADERS:%=%.log} &gt;$@.log     rm ${HEADERS} ${HEADERS:%=%.log}<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 <code>.\/configure<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u043e: <\/p>\n<pre><code class=\"bash\">#!\/bin\/sh  set -eu  # Guess a good number for make -j&lt;N&gt; jobs() {     {         nproc \\             || sysctl -n hw.ncpu \\             || getconf _NPROCESSORS_ONLN \\             || echo 1     } 2&gt;\/dev\/null }  # Default to MAKE=make MAKE=\"${MAKE-make}\"  # Set MAKEFLAGS to -j$(jobs) if it's unset export MAKEFLAGS=\"${MAKEFLAGS--j$(jobs)}\"  $MAKE -r -f configure.mk \"$@\"<\/code><\/pre>\n<p>\u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0440\u0430\u0431\u043e\u0447\u0438\u0439 <a href=\"https:\/\/github.com\/tavianator\/parconf\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 GitHub<\/a> \u0433\u0434\u0435 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u0435. \u0414\u0435\u043c\u043e \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u043f\u043e\u0439\u043c\u0435\u0442 \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0430 \u0432\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<p>\u042f \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <a href=\"https:\/\/tavianator.com\/projects\/bfs.html\" rel=\"noopener noreferrer nofollow\">bfs<\/a>, \u0438 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043b\u043e\u0441\u0441\u0430\u043b\u044c\u043d\u0430\u044f:<\/p>\n<pre><code class=\"bash\">$ time .\/configure ... .\/configure  1.44s user 1.78s system 802% cpu 0.401 total  $ time make -j48 ... make -j48  1.89s user 0.64s system 817% cpu 0.310 total <\/code><\/pre>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU \u043d\u0430 802% \u0432\u043c\u0435\u0441\u0442\u043e 69% \u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430 \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u0441\u043c\u0435\u0448\u043d\u043e, \u044d\u0442\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/904664\/\"> https:\/\/habr.com\/ru\/articles\/904664\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-457513","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/457513","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=457513"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/457513\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=457513"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=457513"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=457513"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}