Line # Revision Author
1 3 ahitrov@rambler.ru ##############################################################################
2 # $HeadURL$
3 # $Id$
4 ###############################################################################
5
6 # installation settings
7 include ../../config.mk
8
9 # local defines
10 SOURCES = ${ROOT_DIR}/src
11 CORE_SRC = ${SOURCES}/core
12 PLUG_SRC = ${SOURCES}/plugins
13 PROJ_SRC = ${SOURCES}/projects
14
15 CORE_USR = ${ROOT_DIR}/usr/core
16 PLUG_USR = ${ROOT_DIR}/usr/plugins
17 PROJ_USR = ${ROOT_DIR}/usr/projects
18 PROJ_TMP = ${ROOT_DIR}/tmp/projects
19 PROJ_VAR = ${ROOT_DIR}/var/projects
20
21 PORTSDIR = ${CORE_SRC}/ports
22 LOCAL = ${ROOT_DIR}/usr/local
23 PORTSWRK = ${ROOT_DIR}/var/ports
24
25 CORE_VERSION = ${shell svnversion ${CORE_SRC}}
26
27 PAGER ?= ${shell which less || which more}
28 RSYNC_COMMAND = ${shell which rsync}
29
30 HOSTNAME = ${shell hostname}
31
32 PROJECT_LC = ${shell echo "${PROJECT}" | tr '[:upper:]' '[:lower:]'}
33
34 # core settings
35 include ${CORE_SRC}/config.mk
36
37 # perl settings
38 include ${CORE_SRC}/ports/etc/perl.mk
39
40 # project settings
41 ifdef PROJECT
42 ifneq (${shell test -f ${PROJ_SRC}/${PROJECT}/config.mk && echo 1},1)
43 ${error ERROR: no source ${PROJECT}/config.mk found, are you checked out project '${PROJECT}'?}
44 endif
45 -include /usr/local/etc/contenido.mk
46 RSYNC_SERVERS ?= ${addsuffix ::${PROJECT_LC}, ${FRONTENDS}}
47 include ${PROJ_SRC}/${PROJECT}/config.mk
48 include ${CORE_SRC}/project-default.mk
49
50 ifeq (${shell test -f ${PROJ_SRC}/${PROJECT}/GNUmakefile && echo 1},1)
51 include ${PROJ_SRC}/${PROJECT}/GNUmakefile
52 $(warning Use of GNUmakefile in project dir is deprecated, rename it to GNUmakefile.in)
53 endif
54 -include ${PROJ_SRC}/${PROJECT}/GNUmakefile.in
55
56 PROJECT_VERSION = ${shell svnversion ${PROJ_SRC}/${PROJECT}}
57 endif
58
59 .PHONY: \
60 local_clean realclean \
61 local_build build \
62 local_install install \
63 local_preview preview \
64 \
65 core_status cst \
66 core_update cup \
67 core_commit cci \
68 core_install cin \
69 core_info cinfo \
70 \
71 project_status pst \
72 project_update pup \
73 project_commit pci \
74 project_install pin \
75 project_conf conf \
76 project_rsync prs \
77 project_start start \
78 project_stop stop \
79 project_create create \
80 project_import import \
81 project_info pinfo \
82 project_reload reload \
83 project_fullreload full \
84 project_rewind rewind nano \
85 project_refresh refresh \
86 project_deinstall pdi \
87 project_user user \
88 project_switch switch swi \
89 project_backup backup \
90 \
91 plugin_create plc \
92 plugins_commit plci \
93 plugins_install plin \
94 plugins_status plst \
95 plugins_update plup \
96 plugins_deinstall pldi \
97 \
98 pgsql_init \
99 pgsql_start \
100 pgsql_stop \
101 pgsql_psql psql \
102 pgsql_dump dump \
103 pgsql_dumpz dumpz \
104 \
105 apache_access_log alog \
106 apache_pager_access_log palog \
107 apache_error_log elog \
108 apache_pager_error_log pelog \
109 apache_start \
110 apache_stop \
111 \
112 check_conf_installed \
113 check_core_installed \
114 check_owner \
115 check_project \
116 check_project_installed \
117 check_user \
118
119 #################
120 # local_* targets
121 #################
122
123 # build all required ports (core & project)
124 build: local_build ;
125 local_build: check_user
126 @for P in ${CORE_REQUIRED} ${PROJECT_REQUIRED}; do \
127 ${MAKE} -s port_build PORT=$${P} \
128 || exit 1; \
129 done;
130 @echo $@ done
131
132 # install all required ports (core & project)
133 install: local_install ;
134 local_install: check_user
135 @for P in ${CORE_REQUIRED} ${PROJECT_REQUIRED}; do \
136 ${MAKE} -s port_install PORT=$${P} \
137 || exit 1; \
138 done;
139 ifeq (${DB_TYPE},SINGLE)
140 @${MAKE} -s pgsql_init
141 endif
142 @echo $@ done
143
144 # preview of install all required ports (core & project)
145 preview: local_preview ;
146 @for P in ${CORE_REQUIRED} ${PROJECT_REQUIRED}; do \
147 ${MAKE} -s port_install PORT=$${P} DRY_RUN=yes \
148 || exit 1; \
149 done;
150
151
152
153 ################
154 # core_* targets
155 ################
156
157 # check core sources via repository
158 cst: core_status ;
159 core_status: check_user
160 @svn st -u ${CORE_SRC}
161 @echo $@ done
162
163 # update core sources from repository
164 cup: core_update ;
165 core_update: check_user
166 ifdef REV
167 @svn up -r ${REV} ${CORE_SRC}
168 else
169 @svn up ${CORE_SRC}
170 endif
171 @echo $@ done
172
173 # commit core changes to repository
174 cci: core_commit ;
175 core_commit: check_user
176 @svn ci ${CORE_SRC}
177 @echo $@ done
178 #
179 # pretty formatted core info
180 cinfo: core_info ;
181 core_info:
182 @REPOS=`svn info ${CORE_SRC} | grep -E '^URL' | sed -E 's/URL: //'`; \
183 RL=$$(($${#REPOS}+2)); \
184 DEVEL=`perl -e 'print "".(lc "${DEVELOPMENT}" eq "yes" ? "YES" : "NO");'`; \
185 DEBUG=`perl -e 'print "".(lc "${DEBUG}" eq "yes" ? "YES" : "NO");'`; \
186 printf "%-$${RL}s %-12s %-7s %-7s %-6s\n" REPOSITORY REVISION DEVEL DEBUG PORT; \
187 printf "%-$${RL}s %-12s %-7s %-7s %-6s\n" $${REPOS} ${CORE_VERSION} $${DEVEL} \
188 $${DEBUG} ${HTTPD_PORT}
189 @echo $@ done
190
191
192 # install core into work directory
193 cin: core_install ;
194 ifeq (${DB_TYPE},SINGLE)
195 core_install: check_user pgsql_init
196 else
197 core_install: check_user
198 endif
199 @if [ -d ${CORE_USR} ]; then \
200 chmod -R u+w ${CORE_USR} \
201 && rm -Rf ${CORE_USR}; \
202 fi;
203
204 @mkdir ${CORE_USR} \
205 && cp -Rp ${CORE_SRC}/comps ${CORE_SRC}/lib ${CORE_SRC}/services ${CORE_USR}/ \
206 && find ${CORE_USR}/ -depth -type d -name .svn -exec rm -Rf {} \; \
207 && find ${CORE_USR}/ -depth -type f -name '*.proto' -exec rm -f {} \;
208
209 @for PROJ in `ls -1A ${PROJ_USR}/`; do \
210 ln -s ${PROJ_USR}/$${PROJ}/lib/$${PROJ} ${CORE_USR}/lib/$${PROJ}; \
211 done;
212
213 @chmod -R a-w ${CORE_USR}
214
215 ifeq (${DB_TYPE},SINGLE)
216 @rm -f ${LOCAL}/pgsql/data/pg_hba.conf \
217 && rm -f ${LOCAL}/pgsql/data/pg_ident.conf \
218 && cp ${CORE_SRC}/conf/pgsql/pg_hba.conf ${LOCAL}/pgsql/data/ \
219 && touch ${LOCAL}/pgsql/data/pg_ident.conf
220
221 @${call rewrite,${CORE_SRC}/conf/pgsql/postgresql.conf.proto, \
222 ${LOCAL}/pgsql/data/postgresql.conf}
223 endif
224
225 @echo $@ done
226
227
228 ###################
229 # project_* targets
230 ###################
231
232 # check project sources via repository
233 pst: project_status ;
234 project_status:: check_project
235 @svn st -u ${PROJ_SRC}/${PROJECT}
236 @echo $@ done
237
238 # pretty formatted project info
239 pinfo: project_info ;
240 project_info:: check_project
241 @REPOS=`svn info ${PROJ_SRC}/${PROJECT} | grep -E '^URL' | sed -E 's/URL: //'`; \
242 PL=$$(($${#PROJECT}+2)); [ $${PL} -lt 9 ] && PL=9; RL=$$(($${#REPOS}+2)); \
243 printf "%-$${PL}s %-$${RL}s %-10s %s\n" PROJECT REPOSITORY REVISION PLUGINS; \
244 printf "%-$${PL}s %-$${RL}s %-10s ${PLUGINS}\n" ${PROJECT} $${REPOS} ${PROJECT_VERSION}
245 @echo $@ done
246
247 # update project sources from repository
248 pup: project_update ;
249 project_update:: check_project
250 ifdef REV
251 @svn up -r ${REV} ${PROJ_SRC}/${PROJECT}
252 else
253 @svn up ${PROJ_SRC}/${PROJECT}
254 endif
255 @echo $@ done
256
257 # commit project changes to repository
258 pci: project_commit ;
259 project_commit:: check_project
260 @svn ci ${PROJ_SRC}/${PROJECT}
261 @echo $@ done
262
263 # install project into work directory
264 pin: project_install ;
265 project_install:: check_core_installed check_project
266 @for PORT in ${PROJECT_REQUIRED}; do \
267 ${MAKE} -s port_install PORT=$${PORT} \
268 || exit 1; \
269 done;
270
271 @if [ -d ${PROJ_USR}/${PROJECT} ]; then \
272 chmod -R u+w ${PROJ_USR}/${PROJECT}; \
273 fi;
274
275 @if [ -n "${RSYNC_COMMAND}" ]; then \
276 ${RSYNC_COMMAND} -a --delete --delete-excluded --include='tags' --include '*.exe' --cvs-exclude --exclude '*.proto' ${PROJ_SRC}/${PROJECT}/* ${PROJ_USR}/${PROJECT}; \
277 else \
278 if [ -d ${PROJ_USR}/${PROJECT} ]; then \
279 rm -Rf ${PROJ_USR}/${PROJECT}; \
280 fi; \
281 cp -R ${PROJ_SRC}/${PROJECT} ${PROJ_USR}/${PROJECT} \
282 && find ${PROJ_USR}/${PROJECT}/ -depth -type d -name .svn -exec rm -Rf {} \; \
283 && find ${PROJ_USR}/${PROJECT}/ -depth -type f -name '*.proto' -exec rm -f {} \; ; \
284 fi
285
286 @if [ \! -e ${PROJ_USR}/${PROJECT}/lib/Contenido ]; then \
287 mkdir ${PROJ_USR}/${PROJECT}/lib/Contenido; \
288 fi;
289
290 @test -d ${PROJ_USR}/${PROJECT}/conf \
291 && rm -Rf ${PROJ_USR}/${PROJECT}/conf \
292 || true
293
294 @if [ \! -e ${CORE_USR}/lib/${PROJECT} ]; then \
295 chmod u+w ${CORE_USR}/lib \
296 && ln -s ${PROJ_USR}/${PROJECT}/lib/${PROJECT} \
297 ${CORE_USR}/lib/${PROJECT} \
298 && chmod u-w ${CORE_USR}/lib; \
299 fi;
300
301 @chmod -R a-w ${PROJ_USR}/${PROJECT}
302
303 @for D in ${PROJ_TMP}/${PROJECT} \
304 ${PROJ_VAR}/${PROJECT}/log \
305 ${PROJ_VAR}/${PROJECT}/mason \
306 ${PROJ_VAR}/${PROJECT}/run; do \
307 test -d $${D} || mkdir -p $${D}; \
308 done;
309
310 @echo $@ done
311
312 # deinstall project from work directory
313 pdi: project_deinstall ;
314 project_deinstall:: check_project_installed project_stop
315 @if [ -d ${PROJ_USR}/${PROJECT} ]; then \
316 chmod -R u+w ${PROJ_USR}/${PROJECT} \
317 && rm -Rf ${PROJ_USR}/${PROJECT}; \
318 fi;
319 @if [ -d ${PROJ_TMP}/${PROJECT} ]; then \
320 rm -Rf ${PROJ_TMP}/${PROJECT}; \
321 fi
322 @if [ -d ${PROJ_VAR}/${PROJECT} ]; then \
323 rm -Rf ${PROJ_VAR}/${PROJECT}; \
324 fi
325 @echo $@ done
326
327 # commit plugins changes
328 plci: plugins_commit ;
329 plugins_commit:
330 ifdef PLUGIN
331 @${MAKE} -s plugin_commit_${PLUGIN}
332 else
333 @for P in ${PLUGINS}; do \
334 ${MAKE} -s plugin_commit_$${P}; \
335 done;
336 endif
337 @echo $@ done
338
339 # commit plugin changes
340 plugin_commit_%:
341 @svn ci ${PLUG_SRC}/${*}
342 @echo $@ done
343
344 # status of plugins sources via repository
345 plst: plugins_status ;
346 plugins_status:
347 ifdef PLUGIN
348 @${MAKE} -s plugin_status_${PLUGIN}
349 else
350 @for P in ${PLUGINS}; do \
351 ${MAKE} -s plugin_status_$${P}; \
352 done;
353 endif
354 @echo $@ done
355
356 # status of plugin sources from repository
357 plugin_status_%:
358 @svn st -u ${PLUG_SRC}/${*}
359 @echo $@ done
360
361 # update plugins sources from repository
362 plup: plugins_update ;
363 plugins_update:
364 ifdef PLUGIN
365 @${MAKE} -s plugin_update_${PLUGIN}
366 else
367 @for P in ${PLUGINS}; do \
368 ${MAKE} -s plugin_update_$${P}; \
369 done;
370 endif
371 @echo $@ done
372
373 # update plugin sources from repository
374 plugin_update_%:
375 @svn up ${PLUG_SRC}/${*}
376 @echo $@ done
377
378 # install plugins into work directory
379 plin: plugins_install ;
380 plugins_install: check_project_installed
381 #XXX It's workaround only (for old instalaltions - without usr/plugins)
382 @test -d ${PLUG_USR} || mkdir ${PLUG_USR}
383 @for P in ${PLUGINS}; do \
384 ${MAKE} -s plugin_install_$${P}; \
385 done;
386 @echo $@ done
387
388 # install plugin
389 plugin_install_%:
390 @if [ -d ${PLUG_USR}/${*} ]; then \
391 chmod -R u+w ${PLUG_USR}/${*}; \
392 fi;
393 @if [ -n "${RSYNC_COMMAND}" ]; then \
394 ${RSYNC_COMMAND} -a --delete --delete-excluded \
395 --cvs-exclude --exclude '*.proto' \
396 ${PLUG_SRC}/${*}/ ${PLUG_USR}/${*}/; \
397 else \
398 if [ -d ${PLUG_USR}/${*} ]; then \
399 rm -Rf ${PLUG_USR}/${*}; \
400 fi; \
401 cp -R ${PLUG_SRC}/${*} ${PLUG_USR}/${*} \
402 && find ${PLUG_USR}/${*}/ -depth -type d -name .svn \
403 -exec rm -Rf {} \; \
404 && find ${PLUG_USR}/${*}/ -depth -type f -name '*.proto' \
405 -exec rm -f {} \; ; \
406 fi;
407 @chmod -R a-w ${PLUG_USR}/${*}
408 @echo $@ done
409
410 # deinstall plugins from work directory
411 pldi: plugins_deinstall ;
412 plugins_deinstall:
413 @for P in ${PLUGINS}; do \
414 ${MAKE} -s plugin_deinstall_$${P}; \
415 done;
416 @echo $@ done
417
418 # deinstall plugin
419 plugin_deinstall_%:
420 @if [ -d ${PLUG_USR}/${*} ]; then \
421 chmod -R u+w ${PLUG_USR}/${*} \
422 && rm -Rf ${PLUG_USR}/${*}; \
423 fi;
424 @echo $@ done
425
426 # create new plugin
427 plc: plugin_create ;
428 plugin_create: check_user
429 @if [ -z "${NAME}" ]; then \
430 echo "ERROR: NAME not defined"; \
431 echo "HINT: use 'make cmd NAME=xxx'"; \
432 exit 1; \
433 fi;
434 @if [ -e ${PLUG_SRC}/${NAME} ]; then \
435 echo "ERROR: plugin ${NAME} already exists in src/plugins"; \
436 echo "HINT: select other name for new plugin"; \
437 exit 1; \
438 fi;
439 @if [ -e ${PLUG_USR}/${NAME} ]; then \
440 echo "ERROR: plugin ${NAME} already exists in usr/plugins"; \
441 echo "HINT: select other name for new plugin"; \
442 exit 1; \
443 fi;
444
445 @mkdir -p ${PLUG_SRC} \
446 && cp -Rp ${CORE_SRC}/skel/plugin ${PLUG_SRC}/${NAME} \
447 && find ${PLUG_SRC}/${NAME}/ -depth -type d -name .svn -exec rm -Rf {} \; \
448 && find ${PLUG_SRC}/${NAME}/ -depth -type f -name '*.proto' -and \
449 \! -path '*/conf/*' -exec rm -f {} \;
450
451 @${call rewrite_skel,${CORE_SRC}/skel/plugin/lib/plugin/Apache.pm.proto, \
452 ${PLUG_SRC}/${NAME}/lib/plugin/Apache.pm}
453 @${call rewrite_skel,${CORE_SRC}/skel/plugin/lib/plugin/Init.pm.proto, \
454 ${PLUG_SRC}/${NAME}/lib/plugin/Init.pm}
455 @${call rewrite_skel,${CORE_SRC}/skel/plugin/lib/plugin/Keeper.pm.proto, \
456 ${PLUG_SRC}/${NAME}/lib/plugin/Keeper.pm}
457 @${call rewrite_skel,${CORE_SRC}/skel/plugin/lib/plugin/State.pm.proto, \
458 ${PLUG_SRC}/${NAME}/lib/plugin/State.pm.proto}
459 @${call rewrite_skel,${CORE_SRC}/skel/plugin/comps/contenido/plugin/dhandler, \
460 ${PLUG_SRC}/${NAME}/comps/contenido/plugin/dhandler}
461 @${call rewrite_skel,${CORE_SRC}/skel/plugin/comps/contenido/plugin/index.html, \
462 ${PLUG_SRC}/${NAME}/comps/contenido/plugin/index.html}
463
464 @mv ${PLUG_SRC}/${NAME}/lib/plugin ${PLUG_SRC}/${NAME}/lib/${NAME}
465 @mv ${PLUG_SRC}/${NAME}/comps/contenido/plugin ${PLUG_SRC}/${NAME}/comps/contenido/${NAME}
466
467 @echo $@ done
468
469
470 # install configs into work directory
471 conf: project_conf ;
472 project_conf:: check_plugins_installed
473 @chmod -R u+w ${PROJ_USR}/${PROJECT}
474
475 @if [ -d ${PROJ_USR}/${PROJECT}/conf ]; then \
476 rm -Rf ${PROJ_USR}/${PROJECT}/conf; \
477 fi
478 @mkdir -p ${PROJ_USR}/${PROJECT}/conf/apache \
479 && mkdir -p ${PROJ_USR}/${PROJECT}/conf/etc \
480 && mkdir -p ${PROJ_USR}/${PROJECT}/conf/mason \
481 && mkdir -p ${PROJ_USR}/${PROJECT}/conf/mod_perl
482
483 @cp ${CORE_SRC}/conf/apache/mime.conf \
484 ${CORE_SRC}/conf/apache/mime.types \
485 ${PROJ_USR}/${PROJECT}/conf/apache/
486
487 @${call rewrite,${CORE_SRC}/conf/apache/httpd.conf.proto, \
488 ${PROJ_USR}/${PROJECT}/conf/apache/httpd.conf}
489 @${call rewrite,${PROJ_SRC}/${PROJECT}/conf/apache/httpd.conf.proto, \
490 ${PROJ_USR}/${PROJECT}/conf/apache/httpd_project.conf}
491
492 ifeq (${CRON_ENABLE},YES)
493 @if [ -d ${PROJ_SRC}/${PROJECT}/conf/etc ]; then \
494 cd ${PROJ_SRC}/${PROJECT}/conf/etc && \
495 for CTPROTO in crontab.`hostname`.proto crontab.proto; do \
496 if [ -f $$CTPROTO ]; then \
497 ${call rewrite,$$CTPROTO, \
498 ${PROJ_USR}/${PROJECT}/conf/etc/crontab}; \
499 break; \
500 fi; \
501 done; \
502 fi
503 endif
504
505 @${call rewrite,${CORE_SRC}/conf/mason/handler.pl.proto, \
506 ${PROJ_USR}/${PROJECT}/conf/mason/handler.pl}
507 @${call rewrite,${PROJ_SRC}/${PROJECT}/conf/mason/handler.pl.proto, \
508 ${PROJ_USR}/${PROJECT}/conf/mason/handler_project.pl}
509
510 @${call rewrite,${CORE_SRC}/conf/mod_perl/startup.pl.proto, \
511 ${PROJ_USR}/${PROJECT}/conf/mod_perl/startup.pl}
512 @${call rewrite,${PROJ_SRC}/${PROJECT}/conf/mod_perl/startup.pl.proto, \
513 ${PROJ_USR}/${PROJECT}/conf/mod_perl/startup_project.pl}
514
515 @${call rewrite,${CORE_SRC}/conf/mason/Config.pm.proto, \
516 ${PROJ_USR}/${PROJECT}/conf/mason/Config.pm}
517 @${call rewrite,${CORE_SRC}/lib/Contenido/State.pm.proto, \
518 ${PROJ_USR}/${PROJECT}/lib/Contenido/State.pm}
519 @${call rewrite,${CORE_SRC}/lib/Modules.pm.proto, \
520 ${PROJ_USR}/${PROJECT}/lib/Modules.pm}
521
522 @${call rewrite,${PROJ_SRC}/${PROJECT}/lib/${PROJECT}/State.pm.proto, \
523 ${PROJ_USR}/${PROJECT}/lib/${PROJECT}/State.pm}
524
525 @chmod -R u+w ${CORE_USR}/lib ${CORE_USR}/services
526
527 @${call rewrite,${CORE_SRC}/services/inc.pl.proto, \
528 ${CORE_USR}/services/inc.pl}
529
530 @chmod -R a-w ${CORE_USR}/lib ${CORE_USR}/services
531
532 @for P in ${PLUGINS}; do \
533 chmod -R u+w ${PLUG_USR}/$${P}; \
534 ${call rewrite,${PLUG_SRC}/$${P}/lib/$${P}/State.pm.proto, \
535 ${PLUG_USR}/$${P}/lib/$${P}/State.pm}; \
536 chmod -R u-w ${PLUG_USR}/$${P}; \
537 done;
538
539 @if [ $$((`perl -e 'print "".(lc "${DEVELOPMENT}" eq "yes" ? 1 : 0);'`)) -ne 1 ]; then \
540 ${CORE_USR}/services/pregen \
541 ${PROJ_SRC} ${PROJ_USR} ${PROJECT} '${PREGEN_GLOB}' ${PREGEN_LIST}; \
542 fi
543
544 @chmod -R a-w ${PROJ_USR}/${PROJECT}
545
546
547 ifeq (${DISABLE},YES)
548 @crontab -l | sed 's/^#*/#/' | crontab -; \
549 echo "Disabled crontab"
550 else
551 @if [ -f ${PROJ_USR}/${PROJECT}/conf/etc/crontab ]; then \
552 crontab ${PROJ_USR}/${PROJECT}/conf/etc/crontab; \
553 echo "Installed crontab from: ${PROJ_USR}/${PROJECT}/conf/etc/crontab"; \
554 fi
555 endif
556
557 @echo $@ done
558
559 # rsync project static files directly to frontend
560 prs: project_rsync ;
561 project_rsync:: check_project
562 @for D in ${RSYNC_DIRS}; do \
563 if [ -d ${RSYNC_ROOT}/$${D} ]; then \
564 D=$${D}/; \
565 elif [ \! -f ${RSYNC_ROOT}/$${D} ]; then \
566 echo "ERROR: no such dir or file: ${RSYNC_ROOT}/$${D}"; \
567 exit 1; \
568 fi; \
569 for S in ${RSYNC_SERVERS}; do \
570 echo "#######################################"; \
571 echo "# rsync $${D} to $${S}"; \
572 echo "#######################################"; \
573 cd ${RSYNC_ROOT} && ${RSYNC} -rtRv \
574 --delete --delete-excluded --exclude .svn --chmod=u+w \
575 $${D} $${S}; \
576 echo -e "done\n"; \
577 done; \
578 done;
579 @echo $@ done
580
581 # start project
582 start: project_start ;
583 ifneq (${DISABLE},YES)
584 ifeq (${DB_TYPE},SINGLE)
585 project_start:: pgsql_start apache_start
586 @echo $@ done
587 else
588 project_start:: apache_start
589 @echo $@ done
590 endif
591 else
592 project_start::
593 @for M in `cd ${PROJ_VAR}/${PROJECT} && ls -d mason.* 2>/dev/null`; do \
594 echo "cleaning old mason files: $$M"; \
595 rm -Rf ${PROJ_VAR}/${PROJECT}/$$M; \
596 done;
597 @echo $@ disabled
598 endif
599
600 # stop project
601 stop: project_stop ;
602 project_stop:: apache_stop
603 @echo $@ done
604
605 # full reinstall & restart core & project
606 full: project_fullreload ;
607 project_fullreload:: project_stop mason_clean core_update core_install \
608 project_update project_install plugins_update plugins_install \
609 project_conf project_start
610 @echo $@ done
611
612 # full reinstall & restart project
613 reload: project_reload ;
614 project_reload:: project_stop mason_clean project_update project_install \
615 plugins_update plugins_install project_conf project_start
616 @echo $@ done
617
618 # restart project without svn update
619 nano: project_rewind ;
620 rewind: project_rewind ;
621 project_rewind:: project_stop mason_clean project_install plugins_install \
622 project_conf project_start
623 @echo $@ done
624
625 # clean all mason temporaries & restart project
626 refresh: project_refresh ;
627 project_refresh:: project_stop mason_clean project_start
628 @echo $@ done
629
630 # create new project
631 create: project_create ;
632 project_create: check_user
633 @if [ -z "${NAME}" ]; then \
634 echo "ERROR: NAME not defined"; \
635 echo "HINT: use 'make cmd NAME=xxx'"; \
636 exit 1; \
637 fi;
638 @if [ -e ${PROJ_SRC}/${NAME} ]; then \
639 echo "ERROR: project ${NAME} already exists in src/projects"; \
640 echo "HINT: select other name for new project"; \
641 exit 1; \
642 fi;
643 @if [ -e ${PROJ_USR}/${NAME} ]; then \
644 echo "ERROR: project ${NAME} already exists in usr/projects"; \
645 echo "HINT: select other name for new project"; \
646 exit 1; \
647 fi;
648
649 @cp -Rp ${CORE_SRC}/skel/project ${PROJ_SRC}/${NAME} \
650 && find ${PROJ_SRC}/${NAME}/ -depth -type d -name .svn -exec rm -Rf {} \; \
651 && find ${PROJ_SRC}/${NAME}/ -depth -type f -name '*.proto' -and \
652 \! -path '*/conf/*' -exec rm -f {} \;
653
654 @${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/Apache.pm.proto, \
655 ${PROJ_SRC}/${NAME}/lib/project/Apache.pm}
656 @${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/Init.pm.proto, \
657 ${PROJ_SRC}/${NAME}/lib/project/Init.pm}
658 @${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/Keeper.pm.proto, \
659 ${PROJ_SRC}/${NAME}/lib/project/Keeper.pm}
660 @${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/SampleCustomDocument.pm.proto, \
661 ${PROJ_SRC}/${NAME}/lib/project/SampleCustomDocument.pm}
662 @${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/SampleDefaultDocument.pm.proto, \
663 ${PROJ_SRC}/${NAME}/lib/project/SampleDefaultDocument.pm}
664 @${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/State.pm.proto, \
665 ${PROJ_SRC}/${NAME}/lib/project/State.pm.proto}
666 @${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/SQL/SampleTable.pm.proto, \
667 ${PROJ_SRC}/${NAME}/lib/project/SQL/SampleTable.pm}
668 @${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/SQL/SampleTable.pm.proto, \
669 ${PROJ_SRC}/${NAME}/lib/project/SQL/SampleTable.pm}
670 @${call rewrite_skel,${CORE_SRC}/skel/project/comps/www/index.html.proto, \
671 ${PROJ_SRC}/${NAME}/comps/www/index.html}
672 @${call rewrite_skel,${CORE_SRC}/skel/project/conf/etc/crontab.tmpl.proto, \
673 ${PROJ_SRC}/${NAME}/conf/etc/crontab.tmpl.proto}
674 @${call rewrite_skel,${CORE_SRC}/skel/project/config.mk.proto, \
675 ${PROJ_SRC}/${NAME}/config.mk}
676
677 @mv ${PROJ_SRC}/${NAME}/lib/project ${PROJ_SRC}/${NAME}/lib/${NAME}
678
679 @echo $@ done
680
681
682 # change active project
683 swi: project_switch ;
684 switch: project_switch ;
685 project_switch:
686 @if [ -z "${NAME}" ]; then \
687 echo "ERROR: NAME not defined"; \
688 echo "HINT: use 'make cmd NAME=xxx'"; \
689 exit 1; \
690 fi;
691 @if [ "${NAME}" = "${PROJECT}" ]; then \
692 echo "ERROR: project ${NAME} is already active"; \
693 exit 1; \
694 fi;
695 @if [ \! -d ${PROJ_SRC}/${NAME} ]; then \
696 echo "ERROR: project ${NAME} doesn't exists in src/projects"; \
697 echo "HINT: checkout sources for project ${NAME}"; \
698 exit 1; \
699 fi;
700 @${MAKE} -s project_stop
701 @perl -pi.orig -e 's|^([[:space:]]*PROJECT[[:space:]]*\?*\=[[:space:]]*)[^[:space:]]+([[:space:]]*)$$|$$1${NAME}$$2|' ${ROOT_DIR}/config.mk
702 @${MAKE} -s project_reload PROJECT=${NAME}
703
704 @echo $@ done
705
706 # backing-up project sources
707 backup: project_backup ;
708 project_backup:: check_project
709 @echo "compressing ${PROJECT} sources => ${PROJ_VAR}/${PROJECT}/${PROJECT}.src.tgz"
710 @tar -czf ${PROJ_VAR}/${PROJECT}/${PROJECT}.src.tgz -C ${PROJ_SRC} ${PROJECT}
711 @echo $@ done
712
713 # import project sources into repository
714 import: project_import ;
715 project_import: check_project
716 @if [ $$((`find ${PROJ_SRC}/${PROJECT} -type d -name .svn | wc -l`)) -ne 0 ]; then \
717 echo "ERROR: project '${PROJECT}' seems as already imported"; \
718 exit 1; \
719 fi
720 @if ! svn ls ${SVN_REPOSITORY}/${PROJECT}/trunk >&- 2>&-; then \
721 echo "ERROR: no repository for project '${PROJECT}' found"; \
722 echo "HINT: contact with respository administrators."; \
723 exit 1; \
724 fi
725 @if [ $$((`svn ls ${SVN_REPOSITORY}/${PROJECT}/trunk | wc -l`)) -ne 0 ]; then \
726 echo "ERROR: repository for project '${PROJECT}' isn't empty"; \
727 echo "Please contact with respository administrators."; \
728 exit 1; \
729 fi
730 @if svn import ${PROJ_SRC}/${PROJECT} ${SVN_REPOSITORY}/${PROJECT}/trunk \
731 && mv ${PROJ_SRC}/${PROJECT} ${PROJ_SRC}/${PROJECT}.before-import \
732 && svn checkout ${SVN_REPOSITORY}/${PROJECT}/trunk ${PROJ_SRC}/${PROJECT}; then \
733 echo "Your project directory moved to '${PROJ_SRC}/${PROJECT}.before-import'"; \
734 echo "Directory '${PROJ_SRC}/${PROJECT}' is now working copy"; \
735 else \
736 echo "ERROR: some errors occured during import/checkout project '${PROJECT}'"; \
737 echo "HINT: contact with respository administrators."; \
738 exit 1; \
739 fi
740 @echo $@ done
741
742 # create user (editors)
743 user: project_user ;
744 project_user: check_core_installed pgsql_template
745 @export PGPASSWORD=${BASE_PASSWD} && ${CORE_USR}/services/createuser | \
746 ${PSQL} -h '${BASE_HOST}' -p ${PGSQL_PORT} -U ${BASE_USER} ${PGSQL_BASE}
747 @echo $@ done
748
749 ##################
750 # apache_* targets
751 ##################
752
753 apache_start: check_conf_installed
754 @${call is_alive,${PROJ_VAR}/${PROJECT}/run/httpd.pid}; \
755 FLAGS=`perl -e 'print " -DDEVELOPMENT" if lc "${DEVELOPMENT}" eq "yes";'`; \
756 FLAGS=$$FLAGS`perl -e ' \
757 if (lc "${RSYSLOG_ENABLE}" eq "yes") { print " -DRSYSLOG"; } \
758 elsif (lc "${CRONOLOG_ENABLE}" eq "yes") { print " -DCRONOLOG"; } \
759 else { print " -DFILELOG"; }'`; \
760 if [ "${LIMIT_VMEMORY_HTTPD}" ]; then \
761 571 ahitrov if [ x`uname` = x"FreeBSD" ]; then \
762 LIMITS="${LIMIT_CMD} -v ${LIMIT_VMEMORY_HTTPD}"; \
763 else \
764 # echo "LIMIT_VMEMORY_HTTPD=${LIMIT_VMEMORY_HTTPD}"; \
765 _exp=`expr "${LIMIT_VMEMORY_HTTPD}" : '.*\(.\)'`; \
766 # echo _exp=$${_exp}; \
767 _value=`expr "${LIMIT_VMEMORY_HTTPD}" : '\(.*\).'`; \
768 # echo _value=$${_value}; \
769 if [ "$${_exp}" = "m" ]; then \
770 _value=`expr $$_value \* 1024 `; \
771 fi; \
772 # echo _value=$${_value}; \
773 LIMITS="ulimit -S -v $${_value}"; \
774 echo "DEBUG: running on Linux, LIMITS='$${LIMITS}'"; \
775 fi; \
776 fi; \
777 3 ahitrov@rambler.ru if [ "$${ALIVE}" = "YES" ]; then \
778 echo "WARNING: apache for project '${PROJECT}' already running"; \
779 else \
780 571 ahitrov [ x`uname` = x"Linux" ] && $${LIMITS} && LIMITS=""; \
781 3 ahitrov@rambler.ru if $${LIMITS} ${LOCAL}/apache/bin/httpd $${FLAGS} \
782 -d ${PROJ_USR}/${PROJECT}/ \
783 -f ${PROJ_USR}/${PROJECT}/conf/apache/httpd.conf; then \
784 echo -n "apache for project '${PROJECT}' started"; \
785 if [ "${LIMIT_VMEMORY_HTTPD}" ]; then \
786 echo " (with vmem limit: ${LIMIT_VMEMORY_HTTPD})"; \
787 else \
788 echo; \
789 fi; \
790 else \
791 echo "ERROR: can't start apache for project '${PROJECT}'"; \
792 exit 1; \
793 fi; \
794 fi;
795 @for M in `cd ${PROJ_VAR}/${PROJECT} && ls -d mason.*`; do \
796 echo "cleaning old mason files: $$M"; \
797 rm -Rf ${PROJ_VAR}/${PROJECT}/$$M; \
798 done;
799 @echo $@ done
800
801 apache_stop: check_conf_installed
802 @${call is_alive,${PROJ_VAR}/${PROJECT}/run/httpd.pid}; \
803 if [ "$${ALIVE}" = "YES" ]; then \
804 kill `head -n 1 ${PROJ_VAR}/${PROJECT}/run/httpd.pid`; \
805 ${call wait_stop,${PROJ_VAR}/${PROJECT}/run/httpd.pid,apache}; \
806 if [ $${STOPPED} != 'YES' ]; then \
807 echo "ERROR: can't stop apache for project '${PROJECT}'"; \
808 exit 1; \
809 else \
810 echo "apache for project '${PROJECT}' stopped"; \
811 fi; \
812 else \
813 echo "WARNING: apache for project '${PROJECT}' isn't running"; \
814 fi;
815 @echo $@ done
816
817 alog: apache_access_log ;
818 apache_access_log:
819 @test -e ${PROJECT_LOG}/access_log || touch ${PROJECT_LOG}/access_log
820 @tail -F ${PROJECT_LOG}/access_log
821
822 palog: apache_pager_access_log ;
823 apache_pager_access_log:
824 @test -e ${PROJECT_LOG}/access_log || touch ${PROJECT_LOG}/access_log
825 @${PAGER} ${PROJECT_LOG}/access_log
826
827 elog: apache_error_log ;
828 apache_error_log:
829 @test -e ${PROJECT_LOG}/error_log || touch ${PROJECT_LOG}/error_log
830 @tail -F ${PROJECT_LOG}/error_log
831
832 pelog: apache_pager_error_log ;
833 apache_pager_error_log:
834 @test -e ${PROJECT_LOG}/error_log || touch ${PROJECT_LOG}/error_log
835 @${PAGER} ${PROJECT_LOG}/error_log
836
837 #################
838 # pgsql_* targets
839 #################
840
841 ifeq (${DB_TYPE},SINGLE)
842
843 pgsql_init: check_user
844 @cd ${PORTSDIR}/all/postgresql \
845 && ${MAKE} -s initdb PREFIX=${LOCAL} PORTSWRK=${PORTSWRK}
846 @echo $@ done
847
848 pgsql_start: pgsql_init
849 @${call is_alive,${LOCAL}/pgsql/data/postmaster.pid}; \
850 if [ "$${ALIVE}" = "YES" ]; then \
851 echo "WARNING: postgresql already running"; \
852 else \
853 if ${LOCAL}/pgsql/bin/pg_ctl -w -D ${LOCAL}/pgsql/data start; then \
854 echo "postgresql started"; \
855 else \
856 echo "ERROR: can't start postgresql"; \
857 exit 1; \
858 fi; \
859 fi;
860 @echo $@ done
861
862 pgsql_stop: check_user
863 @${call is_alive,${LOCAL}/pgsql/data/postmaster.pid}; \
864 if [ "$${ALIVE}" = "YES" ]; then \
865 ${LOCAL}/pgsql/bin/pg_ctl -w -m fast -D ${LOCAL}/pgsql/data stop; \
866 ${call wait_stop,${LOCAL}/pgsql/data/postmaster.pid,postgresql}; \
867 if [ $${STOPPED} != 'YES' ]; then \
868 echo "ERROR: can't stop postgresql"; \
869 exit 1; \
870 else \
871 echo "postgresql stopped"; \
872 fi; \
873 else \
874 echo "WARNING: postgresql isn't running"; \
875 fi;
876 @echo $@ done
877
878 pgsql_create: pgsql_start
879 @if [ $$((`${PSQL} -p ${PGSQL_PORT} -l | \
880 perl -ne 'print $$_ if /^\s*${PGSQL_BASE}/' | wc -l`)) -eq 0 ]; then \
881 ${LOCAL}/pgsql/bin/createuser -SdR -p ${PGSQL_PORT} ${BASE_USER} \
882 || true; \
883 ${LOCAL}/pgsql/bin/createdb -p ${PGSQL_PORT} -O ${BASE_USER} \
884 ${PGSQL_BASE}; \
885 echo "ALTER USER ${BASE_USER} PASSWORD '${BASE_PASSWD}';" | \
886 ${PSQL} -p ${PGSQL_PORT} ${PGSQL_BASE}; \
887 ${PSQL} -p ${PGSQL_PORT} ${PGSQL_BASE} < ${LOCAL}/pgsql/share/contrib/_int.sql; \
888 else \
889 echo "WARNING: database ${PGSQL_BASE} already exists"; \
890 fi;
891 @echo $@ done
892
893
894 else
895
896 pgsql_init \
897 pgsql_start \
898 pgsql_stop \
899 pgsql_create:
900 @echo "ERROR: $@ not implemented for DB_TYPE: ${DB_TYPE}"; \
901 echo "HINT: use 'make cmd DB_TYPE=xxx' or edit ${ROOT_DIR}/config.mk"; \
902 exit 1
903
904 endif
905
906 ifeq (${DB_TYPE},SINGLE)
907 pgsql_template: pgsql_create
908 else
909 pgsql_template: check_project
910 endif
911 @if [ $$((`export PGPASSWORD=${BASE_PASSWD} && ${PSQL} -h '${BASE_HOST}' \
912 -p ${PGSQL_PORT} -U ${BASE_USER} -c '\d' ${PGSQL_BASE} | \
913 grep documents | wc -l`)) -lt 1 ]; then \
914 export PGPASSWORD=${BASE_PASSWD} && ${PSQL} -h '${BASE_HOST}' \
915 -p ${PGSQL_PORT} -U ${BASE_USER} ${PGSQL_BASE} < \
916 ${CORE_SRC}/sql/${STORE_METHOD}/contenido.sql; \
917 else \
918 echo "WARNING: template already loaded into database ${PGSQL_BASE}"; \
919 fi;
920
921 @echo $@ done
922
923 psql: pgsql_psql ;
924 ifeq (${DB_TYPE},SINGLE)
925 pgsql_psql: pgsql_create
926 else
927 pgsql_psql: check_project
928 endif
929 @(export PGPASSWORD=${BASE_PASSWD} && cd ../.. && ${PSQL} -h '${BASE_HOST}' -p ${PGSQL_PORT} \
930 -U ${BASE_USER} ${PGSQL_BASE})
931
932 # dump project database
933 dump: pgsql_dump ;
934 ifeq (${DB_TYPE},NONE)
935 pgsql_dump:
936 @echo "project ${PROJECT} hasn't database"; exit 1
937 else
938 ifeq (${DB_TYPE},SINGLE)
939 pgsql_dump: pgsql_create
940 else
941 pgsql_dump: check_project
942 endif
943 @echo "dumping ${BASE_HOST}:${PGSQL_PORT}/${PGSQL_BASE} => ${PROJ_VAR}/${PROJECT}/${PGSQL_BASE}.sql"
944 @export PGPASSWORD=${BASE_PASSWD} && ${PGDUMP} -Ox -h '${BASE_HOST}' -p ${PGSQL_PORT} \
945 -U ${BASE_USER} ${PGSQL_BASE} > ${PROJ_VAR}/${PROJECT}/${PGSQL_BASE}.sql
946 @echo $@ done
947 endif
948
949 # dump project database (gzip)
950 dumpz: pgsql_dumpz ;
951 ifeq (${DB_TYPE},NONE)
952 pgsql_dumpz:
953 @echo "project ${PROJECT} hasn't database"; exit 1
954 else
955 ifeq (${DB_TYPE},SINGLE)
956 pgsql_dumpz: pgsql_create
957 else
958 pgsql_dumpz: check_project
959 endif
960 @echo "dumping ${BASE_HOST}:${PGSQL_PORT}/${PGSQL_BASE} => ${PROJ_VAR}/${PROJECT}/${PGSQL_BASE}.sql.gz"
961 @export PGPASSWORD=${BASE_PASSWD} && ${PGDUMP} -Ox -h '${BASE_HOST}' -p ${PGSQL_PORT} \
962 -U ${BASE_USER} ${PGSQL_BASE} | gzip > ${PROJ_VAR}/${PROJECT}/${PGSQL_BASE}.sql.gz
963 @echo $@ done
964 endif
965
966
967 ########################
968 # internal targets
969 # (not for direct usage)
970 ########################
971
972 mason_clean:
973 @mv -f ${PROJ_VAR}/${PROJECT}/mason \
974 ${PROJ_VAR}/${PROJECT}/mason.`date +%Y-%m-%d.%H:%M:%S` \
975 && mkdir ${PROJ_VAR}/${PROJECT}/mason;
976 @echo $@ done
977
978
979 #################
980 # check_* targets
981 #################
982
983 # it's required
984 check_user: check_owner ;
985
986 # if user is installation owner?
987 check_owner:
988 @if [ `whoami` != ${OWNER} ]; then \
989 echo "ERROR: please run as OWNER: ${OWNER}"; \
990 echo "HINT: use 'sudo -u ${OWNER} -H bash' or 'sudo -i -u ${OWNER}'"; \
991 exit 1; \
992 fi;
993
994 # check if core installed
995 check_core_installed: check_user
996 @if [ $$((`ls -1A ${CORE_USR}/ | wc -l`)) -eq 0 ]; then \
997 echo "ERROR: core not installed"; \
998 echo "HINT: use 'make core_install' or 'make cin'"; \
999 exit 1; \
1000 fi;
1001
1002 # check for existing project (see include near line ~30)
1003 check_project: check_user
1004 @if [ -z "${PROJECT}" ]; then \
1005 echo "ERROR: project not defined"; \
1006 echo "HINT: use 'make cmd PROJECT=xxx' or edit ${ROOT_DIR}/config.mk"; \
1007 exit 1; \
1008 fi;
1009
1010 # check if project installed
1011 check_project_installed: check_project
1012 @if [ \! -d ${PROJ_USR}/${PROJECT} ]; then \
1013 echo "ERROR: project '${PROJECT}' not installed"; \
1014 echo "HINT: use 'make project_install' or 'make pin'"; \
1015 exit 1; \
1016 fi;
1017 @if [ $$((`ls -1A ${PROJ_USR}/${PROJECT} | wc -l`)) -eq 0 ]; then \
1018 echo "ERROR: project '${PROJECT}' not installed"; \
1019 echo "HINT: use 'make project_install' or 'make pin'"; \
1020 exit 1; \
1021 fi;
1022
1023 # check if plugins installed
1024 check_plugins_installed: check_project_installed
1025 @for P in ${PLUGINS}; do \
1026 if [ \! -d ${PLUG_USR}/$${P} ]; then \
1027 echo "ERROR: plugin '$${P}' not installed"; \
1028 echo "HINT: use 'make plugins_install' or 'make plin'"; \
1029 exit 1; \
1030 fi; \
1031 done;
1032
1033 # check if configs installed
1034 check_conf_installed: check_project_installed
1035 @if [ \! -d ${PROJ_USR}/${PROJECT}/conf ]; then \
1036 echo "ERROR: configs for project '${PROJECT}' not installed"; \
1037 echo "HINT: use 'make project_conf' or 'make conf'"; \
1038 exit 1; \
1039 fi;
1040
1041
1042 ##########################
1043 # port_* & ports_* targets
1044 ##########################
1045
1046 # single port sub-commands
1047 port_%: check_user
1048 ifdef PORT
1049 @cd ${PORTSDIR}/all/${PORT} \
1050 && ${MAKE} -s $* PREFIX=${LOCAL} PORTSWRK=${PORTSWRK}
1051 ifndef DRY_RUN
1052 @echo $@ done
1053 endif
1054 else
1055 @echo "ERROR: no PORT defined"; \
1056 echo "HINT: use 'make cmd PORT=name'"; \
1057 exit 1;
1058 endif
1059
1060 # multiple ports sub-commands
1061 ports_%: check_user
1062 @cd ${PORTSDIR} \
1063 && ${MAKE} -s $* PREFIX=${LOCAL} PORTSWRK=${PORTSWRK}
1064 @echo $@ done
1065
1066
1067 ########
1068 # macros
1069 ########
1070 define is_alive
1071 if [ \! -f ${1} ]; then \
1072 ALIVE='NO'; \
1073 else \
1074 if kill -0 `head -n 1 ${1}` 2>/dev/null; then \
1075 ALIVE='YES'; \
1076 else \
1077 rm -f ${1}; \
1078 ALIVE='NO'; \
1079 fi; \
1080 fi
1081 endef
1082
1083 define wait_stop
1084 TRYMAX=`test -z "${3}" && echo 10 || echo ${3}`; \
1085 TRYCUR=1; \
1086 STOPPED='NO'; \
1087 echo -n "Waiting for ${2} stopped, tries: $${TRYCUR}"; \
1088 ${call is_alive,${1}}; \
1089 while [ "$${ALIVE}" = "YES" -a $$(($${TRYCUR})) -lt $$(($${TRYMAX})) ]; do \
1090 sleep 1; \
1091 TRYCUR=$$(($${TRYCUR}+1)); \
1092 echo -n " $${TRYCUR}"; \
1093 ${call is_alive,${1}}; \
1094 done; \
1095 echo ""; \
1096 if [ "$${ALIVE}" = "NO" ]; then \
1097 STOPPED='YES'; \
1098 fi
1099 endef
1100
1101 ifeq (${USE_MTT},YES)
1102 define rewrite
1103 $(foreach R, ${REWRITE}, MTT_${R}="${${R}}") \
1104 ${CORE_SRC}/services/mttbfr > ${PROJ_TMP}/${PROJECT}/mtt.conf && \
1105 ${CORE_SRC}/services/mttcomp < ${1} | \
1106 ${LOCAL}/bin/mtt -b ${PROJ_TMP}/${PROJECT}/mtt.conf - ${2} \
1107 && echo "created ${2} (mtt)"
1108 endef
1109 else
1110 define rewrite
1111 $(foreach R, ${REWRITE}, ${R}="${${R}}") \
1112 perl -pe 's/@([A-Z_]+)@/$$ENV{$$1}/ge' < ${1} > ${2} \
1113 && echo "created ${2} (rewrite)"
1114 endef
1115 endif
1116
1117 define rewrite_skel
1118 NAME=${NAME} \
1119 LOCAL=@LOCAL@ \
1120 CORE_USR=@CORE_USR@ \
1121 PROJ_USR=@PROJ_USR@ \
1122 PROJECT_VAR=@PROJECT_VAR@ \
1123 perl -pe 's/@([A-Z_]+)@/$$ENV{$$1}/ge' < ${1} > ${2} \
1124 && echo "created ${2}"
1125 endef
1126
1127 # rewrites values
1128 PREFIX = ${LOCAL}
1129 ROOT_LOG = ${ROOT_DIR}/var/log
1130 PGSQL_REDIRECT = ${shell perl -e 'print lc("${PGSQL_LOGGING}") eq "yes" && "on" || "off"'}
1131 ifdef PROJECT
1132 PROJECT_USR = ${PROJ_USR}/${PROJECT}
1133 PROJECT_TMP = ${PROJ_TMP}/${PROJECT}
1134 PROJECT_VAR = ${PROJ_VAR}/${PROJECT}
1135 PROJECT_LOG = ${PROJ_VAR}/${PROJECT}/log
1136 PROJECT_RUN = ${PROJ_VAR}/${PROJECT}/run
1137 endif
1138
1139 # rewrites definitions
1140 REWRITE += \
1141 AUTH_COOKIE \
1142 AUTH_MEMCACHED_BUSY_LOCK \
1143 AUTH_MEMCACHED_ENABLE \
1144 AUTH_MEMCACHED_SERVERS \
1145 BASE_HOST \
1146 BASE_PASSWD \
1147 BASE_USER \
1148 BINARY \
1149 CASCADE \
1150 COMP_CACHE_ENABLED \
1151 COMP_TIMINGS_DISABLE \
1152 364 ahitrov COMPOSITE \
1153 3 ahitrov@rambler.ru CONF \
1154 CONTENIDO_VERSION \
1155 CONVERT \
1156 CORE_COMP \
1157 CORE_SRC \
1158 CORE_VERSION \
1159 CORE_USR \
1160 CRONOLOG_ENABLE \
1161 CRONOLOG_FORMAT \
1162 CROSSLINKS \
1163 DB_TYPE \
1164 DEBUG_FORMAT \
1165 DEBUG_MIN_LEVEL \
1166 DEBUG_MAX_LEVEL \
1167 DEBUG_STACK_TRACE \
1168 DEBUG \
1169 DEBUG_CORE \
1170 DEBUG_SQL \
1171 DEBUG_WORKTIME \
1172 DEFAULT_ESCAPE_FLAGS \
1173 DEFAULT_HANDLER \
1174 DEVELOPMENT \
1175 ERROR_MODE \
1176 FILES \
1177 204 ahitrov FILE_WEB_STORAGE \
1178 3 ahitrov@rambler.ru HOSTNAME \
1179 HTTPD_DOCS \
1180 HTTPD_ELOG_LEVEL \
1181 HTTPD_PORT \
1182 HTTPD_SERVER \
1183 IMAGES \
1184 LISTEN_BACK_LOG \
1185 LOCAL \
1186 LOCALE \
1187 LOGGER \
1188 MASON_CACHE_ENABLED \
1189 MASON_COMP \
1190 MASON_MEMCACHED_BACKEND \
1191 MASON_MEMCACHED_DEBUG \
1192 MASON_MEMCACHED_ENABLED \
1193 MASON_MEMCACHED_NAMESPACE \
1194 MASON_MEMCACHED_SERVERS \
1195 MASTER_BASE_HOST \
1196 MASTER_BASE_NAME \
1197 MASTER_BASE_PASSWD \
1198 MASTER_BASE_PORT \
1199 MASTER_BASE_USER \
1200 MAX_CLIENTS \
1201 MAX_PROCESS_SIZE \
1202 MAX_REQUESTS_PER_CHILD \
1203 MAX_SPARE_SERVERS \
1204 MEMCACHED_BACKEND \
1205 MEMCACHED_DELAYED \
1206 MEMCACHED_ENABLE \
1207 MEMCACHED_ENABLE_COMPRESS \
1208 MEMCACHED_SELECT_TIMEOUT \
1209 MEMCACHED_SERVERS \
1210 MEMCACHED_SET_MODE \
1211 MIN_SPARE_SERVERS \
1212 MODULES \
1213 MULTIDOMAIN \
1214 OPTIONS_EXPIRE \
1215 PERL_LEVEL \
1216 PERL_LIB \
1217 PERSISTENT_CONN \
1218 PGSQL_BASE \
1219 PGSQL_CLIENT_ENCODING \
1220 PGSQL_PORT \
1221 PGSQL_REAL_PREPARE \
1222 PGSQL_REDIRECT \
1223 PGSQL_CLIENT_ENCODING \
1224 PGSQL_ENCODE_DATA \
1225 PGSQL_DECODE_DATA \
1226 PGSQL_ENABLE_UTF \
1227 PLUG_SRC \
1228 PLUGINS \
1229 PLUGIN_COMP \
1230 PREAMBLE_HANDLER \
1231 PREAMBLE_HANDLER_PATH \
1232 PREFIX \
1233 PRELOADS \
1234 PREVIEW \
1235 PROFILING_DBI \
1236 PROJECT \
1237 PROJECT_HOME \
1238 PROJECT_LC \
1239 PROJECT_NAME \
1240 PROJECT_LOG \
1241 PROJECT_RUN \
1242 PROJECT_TMP \
1243 PROJECT_USR \
1244 PROJECT_VAR \
1245 PROJECT_VERSION \
1246 PROJ_SRC \
1247 PROJ_USR \
1248 ROOT_LOG \
1249 READONLY \
1250 RSYSLOG_ENABLE \
1251 RSYSLOG_HOST \
1252 SERVER_ADMIN \
1253 SESSIONS \
1254 SPARE_REAPER_DELAY \
1255 SPARE_REAPER_DELAY_FAKEMOD \
1256 START_SERVERS \
1257 STATIC_SOURCE_ENABLE \
1258 STATIC_SOURCE_TOUCH_FILE \
1259 STORE_METHOD \
1260
1261 #TODO: ElTexto compatibility only
1262 REWRITE += \
1263 COMMENTS_ON_PAGE \
1264 ELTEXTO_VERSION \
1265 MEMCACHED_EXPIRE \
1266 SYNC_WITH_GROUPS \
1267 TEXTS_ON_PAGE \
1268 TEXT_IDS_IN_CACHE \
1269
1270 #TODO: Rate compatibility only
1271 REWRITE += \
1272 RATE_CLASSES \
1273 RATE_COOKIE \
1274
1275 #TODO: Search plugin compatibility only
1276 REWRITE += \
1277 SEARCH_SERVER \
1278
1279 #TODO: Util Proxy image
1280 REWRITE += \
1281 PROXY_IMAGE_LOCATION \
1282 PROXY_IMAGE_SECRET \
1283

Небольшая справка по веткам

cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.

koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.

utf8 – актуальная ветка, заточенная под UTF-8.

Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.