|
| 1 | + |
| 2 | +##---------------------------------------------------------------------- |
| 3 | +## DISCLAIMER |
| 4 | +## |
| 5 | +## This file contains the rules to make an Eliom project. The project is |
| 6 | +## configured through the variables in the file Makefile.options. |
| 7 | +##---------------------------------------------------------------------- |
| 8 | + |
| 9 | +include Makefile.options |
| 10 | + |
| 11 | +##---------------------------------------------------------------------- |
| 12 | +## Internals |
| 13 | + |
| 14 | +## Required binaries |
| 15 | +ELIOMC := eliomc -reason -ppx |
| 16 | +ELIOMOPT := eliomopt -reason -ppx |
| 17 | +JS_OF_ELIOM := js_of_eliom -reason -ppx |
| 18 | +ELIOMDEP := eliomdep |
| 19 | +OCSIGENSERVER := ocsigenserver |
| 20 | +OCSIGENSERVER.OPT := ocsigenserver.opt |
| 21 | + |
| 22 | +## Where to put intermediate object files. |
| 23 | +## - ELIOM_{SERVER,CLIENT}_DIR must be distinct |
| 24 | +## - ELIOM_CLIENT_DIR must not be the local dir. |
| 25 | +## - ELIOM_SERVER_DIR could be ".", but you need to |
| 26 | +## remove it from the "clean" rules... |
| 27 | +export ELIOM_SERVER_DIR := _server |
| 28 | +export ELIOM_CLIENT_DIR := _client |
| 29 | +export ELIOM_TYPE_DIR := _server |
| 30 | +DEPSDIR := _deps |
| 31 | + |
| 32 | +ifeq ($(DEBUG),yes) |
| 33 | + GENERATE_DEBUG ?= -g |
| 34 | + RUN_DEBUG ?= "-v" |
| 35 | + DEBUG_JS ?= -jsopt -pretty -jsopt -noinline -jsopt -debuginfo |
| 36 | +endif |
| 37 | + |
| 38 | +##---------------------------------------------------------------------- |
| 39 | +## General |
| 40 | + |
| 41 | +.PHONY: all byte opt |
| 42 | +all: byte opt |
| 43 | +byte opt:: $(TEST_PREFIX)$(ELIOMSTATICDIR)/${PROJECT_NAME}.js |
| 44 | +byte opt:: $(TEST_PREFIX)$(ETCDIR)/$(PROJECT_NAME).conf |
| 45 | +byte opt:: $(TEST_PREFIX)$(ETCDIR)/$(PROJECT_NAME)-test.conf |
| 46 | +byte:: $(TEST_PREFIX)$(LIBDIR)/${PROJECT_NAME}.cma |
| 47 | +opt:: $(TEST_PREFIX)$(LIBDIR)/${PROJECT_NAME}.cmxs |
| 48 | + |
| 49 | +DIST_DIRS = $(ETCDIR) $(DATADIR) $(LIBDIR) $(LOGDIR) $(STATICDIR) $(ELIOMSTATICDIR) $(shell dirname $(CMDPIPE)) |
| 50 | + |
| 51 | +##---------------------------------------------------------------------- |
| 52 | +## Testing |
| 53 | + |
| 54 | +DIST_FILES = $(ELIOMSTATICDIR)/$(PROJECT_NAME).js $(LIBDIR)/$(PROJECT_NAME).cma |
| 55 | + |
| 56 | +.PHONY: test.byte test.opt |
| 57 | +test.byte: $(addprefix $(TEST_PREFIX),$(ETCDIR)/$(PROJECT_NAME)-test.conf $(DIST_DIRS) $(DIST_FILES)) |
| 58 | + $(OCSIGENSERVER) $(RUN_DEBUG) -c $< |
| 59 | +test.opt: $(addprefix $(TEST_PREFIX),$(ETCDIR)/$(PROJECT_NAME)-test.conf $(DIST_DIRS) $(patsubst %.cma,%.cmxs, $(DIST_FILES))) |
| 60 | + $(OCSIGENSERVER.OPT) $(RUN_DEBUG) -c $< |
| 61 | + |
| 62 | +$(addprefix $(TEST_PREFIX), $(DIST_DIRS)): |
| 63 | + mkdir -p $@ |
| 64 | + |
| 65 | +##---------------------------------------------------------------------- |
| 66 | +## Installing & Running |
| 67 | + |
| 68 | +.PHONY: install install.byte install.byte install.opt install.static install.etc install.lib install.lib.byte install.lib.opt run.byte run.opt |
| 69 | +install: install.byte install.opt |
| 70 | +install.byte: install.lib.byte install.etc install.static | $(addprefix $(PREFIX),$(DATADIR) $(LOGDIR) $(shell dirname $(CMDPIPE))) |
| 71 | +install.opt: install.lib.opt install.etc install.static | $(addprefix $(PREFIX),$(DATADIR) $(LOGDIR) $(shell dirname $(CMDPIPE))) |
| 72 | +install.lib: install.lib.byte install.lib.opt |
| 73 | +install.lib.byte: $(TEST_PREFIX)$(LIBDIR)/$(PROJECT_NAME).cma | $(PREFIX)$(LIBDIR) |
| 74 | + install $< $(PREFIX)$(LIBDIR) |
| 75 | +install.lib.opt: $(TEST_PREFIX)$(LIBDIR)/$(PROJECT_NAME).cmxs | $(PREFIX)$(LIBDIR) |
| 76 | + install $< $(PREFIX)$(LIBDIR) |
| 77 | +install.static: $(TEST_PREFIX)$(ELIOMSTATICDIR)/$(PROJECT_NAME).js | $(PREFIX)$(STATICDIR) $(PREFIX)$(ELIOMSTATICDIR) |
| 78 | + cp -r $(LOCAL_STATIC)/* $(PREFIX)$(STATICDIR) |
| 79 | + [ -z $(WWWUSER) ] || chown -R $(WWWUSER) $(PREFIX)$(STATICDIR) |
| 80 | + install $(addprefix -o ,$(WWWUSER)) $< $(PREFIX)$(ELIOMSTATICDIR) |
| 81 | +install.etc: $(TEST_PREFIX)$(ETCDIR)/$(PROJECT_NAME).conf | $(PREFIX)$(ETCDIR) |
| 82 | + install $< $(PREFIX)$(ETCDIR)/$(PROJECT_NAME).conf |
| 83 | + |
| 84 | +.PHONY: |
| 85 | +print-install-files: |
| 86 | + @echo $(PREFIX)$(LIBDIR) |
| 87 | + @echo $(PREFIX)$(STATICDIR) |
| 88 | + @echo $(PREFIX)$(ELIOMSTATICDIR) |
| 89 | + @echo $(PREFIX)$(ETCDIR) |
| 90 | + |
| 91 | +$(addprefix $(PREFIX),$(ETCDIR) $(LIBDIR)): |
| 92 | + install -d $@ |
| 93 | +$(addprefix $(PREFIX),$(DATADIR) $(LOGDIR) $(STATICDIR) $(ELIOMSTATICDIR) $(shell dirname $(CMDPIPE))): |
| 94 | + install $(addprefix -o ,$(WWWUSER)) -d $@ |
| 95 | + |
| 96 | +run.byte: |
| 97 | + $(OCSIGENSERVER) $(RUN_DEBUG) -c ${PREFIX}${ETCDIR}/${PROJECT_NAME}.conf |
| 98 | +run.opt: |
| 99 | + $(OCSIGENSERVER.OPT) $(RUN_DEBUG) -c ${PREFIX}${ETCDIR}/${PROJECT_NAME}.conf |
| 100 | + |
| 101 | +##---------------------------------------------------------------------- |
| 102 | +## Aux |
| 103 | + |
| 104 | +# Use `eliomdep -sort' only in OCaml>4 |
| 105 | +ifeq ($(shell ocamlc -version|cut -c1),4) |
| 106 | +eliomdep=$(shell $(ELIOMDEP) $(1) -reason -ppx -sort $(2) $(filter %.eliom %.ml,$(3)))) |
| 107 | +else |
| 108 | +eliomdep=$(3) |
| 109 | +endif |
| 110 | +objs=$(patsubst %.ml,$(1)/%.$(2),$(patsubst %.eliom,$(1)/%.$(2),$(filter %.eliom %.ml,$(3)))) |
| 111 | +depsort=$(call objs,$(1),$(2),$(call eliomdep,$(3),$(4),$(5))) |
| 112 | + |
| 113 | +##---------------------------------------------------------------------- |
| 114 | +## Config files |
| 115 | + |
| 116 | +FINDLIB_PACKAGES=$(patsubst %,\<extension\ findlib-package=\"%\"\ /\>,$(SERVER_PACKAGES)) |
| 117 | +EDIT_WARNING=DON\'T EDIT THIS FILE! It is generated from $(PROJECT_NAME).conf.in, edit that one, or the variables in Makefile.options |
| 118 | +SED_ARGS := -e "/^ *%%%/d" |
| 119 | +SED_ARGS += -e "s|%%PROJECT_NAME%%|$(PROJECT_NAME)|g" |
| 120 | +SED_ARGS += -e "s|%%DATABASE_NAME%%|$(DATABASE_NAME)|g" |
| 121 | +SED_ARGS += -e "s|%%DATABASE_USER%%|$(DATABASE_USER)|g" |
| 122 | +SED_ARGS += -e "s|%%CMDPIPE%%|%%PREFIX%%$(CMDPIPE)|g" |
| 123 | +SED_ARGS += -e "s|%%LOGDIR%%|%%PREFIX%%$(LOGDIR)|g" |
| 124 | +SED_ARGS += -e "s|%%DATADIR%%|%%PREFIX%%$(DATADIR)|g" |
| 125 | +SED_ARGS += -e "s|%%PERSISTENT_DATA_BACKEND%%|$(PERSISTENT_DATA_BACKEND)|g" |
| 126 | +SED_ARGS += -e "s|%%LIBDIR%%|%%PREFIX%%$(LIBDIR)|g" |
| 127 | +SED_ARGS += -e "s|%%WARNING%%|$(EDIT_WARNING)|g" |
| 128 | +SED_ARGS += -e "s|%%PACKAGES%%|$(FINDLIB_PACKAGES)|g" |
| 129 | +SED_ARGS += -e "s|%%ELIOMSTATICDIR%%|%%PREFIX%%$(ELIOMSTATICDIR)|g" |
| 130 | +ifeq ($(DEBUG),yes) |
| 131 | + SED_ARGS += -e "s|%%DEBUGMODE%%|\<debugmode /\>|g" |
| 132 | +else |
| 133 | + SED_ARGS += -e "s|%%DEBUGMODE%%||g" |
| 134 | +endif |
| 135 | + |
| 136 | +LOCAL_SED_ARGS := -e "s|%%PORT%%|$(TEST_PORT)|g" |
| 137 | +LOCAL_SED_ARGS += -e "s|%%STATICDIR%%|$(LOCAL_STATIC)|g" |
| 138 | +LOCAL_SED_ARGS += -e "s|%%USERGROUP%%||g" |
| 139 | +GLOBAL_SED_ARGS := -e "s|%%PORT%%|$(PORT)|g" |
| 140 | +GLOBAL_SED_ARGS += -e "s|%%STATICDIR%%|%%PREFIX%%$(STATICDIR)|g" |
| 141 | +ifeq ($(WWWUSER)$(WWWGROUP),) |
| 142 | + GLOBAL_SED_ARGS += -e "s|%%USERGROUP%%||g" |
| 143 | +else |
| 144 | + GLOBAL_SED_ARGS += -e "s|%%USERGROUP%%|<user>$(WWWUSER)</user><group>$(WWWGROUP)</group>|g" |
| 145 | +endif |
| 146 | + |
| 147 | +$(TEST_PREFIX)${ETCDIR}/${PROJECT_NAME}.conf: ${PROJECT_NAME}.conf.in Makefile.options | $(TEST_PREFIX)$(ETCDIR) |
| 148 | + sed $(SED_ARGS) $(GLOBAL_SED_ARGS) $< | sed -e "s|%%PREFIX%%|$(PREFIX)|g" > $@ |
| 149 | +$(TEST_PREFIX)${ETCDIR}/${PROJECT_NAME}-test.conf: ${PROJECT_NAME}.conf.in Makefile.options | $(TEST_PREFIX)$(ETCDIR) |
| 150 | + sed $(SED_ARGS) $(LOCAL_SED_ARGS) $< | sed -e "s|%%PREFIX%%|$(TEST_PREFIX)|g" > $@ |
| 151 | + |
| 152 | +##---------------------------------------------------------------------- |
| 153 | +## Server side compilation |
| 154 | + |
| 155 | +SERVER_INC := ${addprefix -package ,${SERVER_PACKAGES}} |
| 156 | + |
| 157 | +${ELIOM_TYPE_DIR}/%.type_mli: %.eliom |
| 158 | + ${ELIOMC} -infer ${SERVER_INC} $< |
| 159 | + |
| 160 | +$(TEST_PREFIX)$(LIBDIR)/$(PROJECT_NAME).cma: $(call objs,$(ELIOM_SERVER_DIR),cmo,$(SERVER_FILES)) | $(TEST_PREFIX)$(LIBDIR) |
| 161 | + ${ELIOMC} -a -o $@ $(GENERATE_DEBUG) \ |
| 162 | + $(call depsort,$(ELIOM_SERVER_DIR),cmo,-server,$(SERVER_INC),$(SERVER_FILES)) |
| 163 | + |
| 164 | +$(TEST_PREFIX)$(LIBDIR)/$(PROJECT_NAME).cmxa: $(call objs,$(ELIOM_SERVER_DIR),cmx,$(SERVER_FILES)) | $(TEST_PREFIX)$(LIBDIR) |
| 165 | + ${ELIOMOPT} -a -o $@ $(GENERATE_DEBUG) \ |
| 166 | + $(call depsort,$(ELIOM_SERVER_DIR),cmx,-server,$(SERVER_INC),$(SERVER_FILES)) |
| 167 | + |
| 168 | +%.cmxs: %.cmxa |
| 169 | + $(ELIOMOPT) -shared -linkall -o $@ $(GENERATE_DEBUG) $< |
| 170 | + |
| 171 | +${ELIOM_SERVER_DIR}/%.cmi: %.mli |
| 172 | + ${ELIOMC} -c ${SERVER_INC} $(GENERATE_DEBUG) $< |
| 173 | + |
| 174 | +${ELIOM_SERVER_DIR}/%.cmi: %.eliomi |
| 175 | + ${ELIOMC} -c ${SERVER_INC} $(GENERATE_DEBUG) $< |
| 176 | + |
| 177 | +${ELIOM_SERVER_DIR}/%.cmo: %.ml |
| 178 | + ${ELIOMC} -c ${SERVER_INC} $(GENERATE_DEBUG) $< |
| 179 | +${ELIOM_SERVER_DIR}/%.cmo: %.eliom |
| 180 | + ${ELIOMC} -c ${SERVER_INC} $(GENERATE_DEBUG) $< |
| 181 | + |
| 182 | +${ELIOM_SERVER_DIR}/%.cmx: %.ml |
| 183 | + ${ELIOMOPT} -c ${SERVER_INC} $(GENERATE_DEBUG) $< |
| 184 | +${ELIOM_SERVER_DIR}/%.cmx: %.eliom |
| 185 | + ${ELIOMOPT} -c ${SERVER_INC} $(GENERATE_DEBUG) $< |
| 186 | + |
| 187 | + |
| 188 | +##---------------------------------------------------------------------- |
| 189 | +## Client side compilation |
| 190 | + |
| 191 | +CLIENT_LIBS := ${addprefix -package ,${CLIENT_PACKAGES}} |
| 192 | +CLIENT_INC := ${addprefix -package ,${CLIENT_PACKAGES}} |
| 193 | + |
| 194 | +CLIENT_OBJS := $(filter %.eliom %.ml, $(CLIENT_FILES)) |
| 195 | +CLIENT_OBJS := $(patsubst %.eliom,${ELIOM_CLIENT_DIR}/%.cmo, ${CLIENT_OBJS}) |
| 196 | +CLIENT_OBJS := $(patsubst %.ml,${ELIOM_CLIENT_DIR}/%.cmo, ${CLIENT_OBJS}) |
| 197 | + |
| 198 | +$(TEST_PREFIX)$(ELIOMSTATICDIR)/$(PROJECT_NAME).js: $(call objs,$(ELIOM_CLIENT_DIR),cmo,$(CLIENT_FILES)) | $(TEST_PREFIX)$(ELIOMSTATICDIR) |
| 199 | + ${JS_OF_ELIOM} -o $@ $(GENERATE_DEBUG) $(CLIENT_INC) $(DEBUG_JS) \ |
| 200 | + $(call depsort,$(ELIOM_CLIENT_DIR),cmo,-client,$(CLIENT_INC),$(CLIENT_FILES)) |
| 201 | + |
| 202 | +${ELIOM_CLIENT_DIR}/%.cmi: %.mli |
| 203 | + ${JS_OF_ELIOM} -c ${CLIENT_INC} $(GENERATE_DEBUG) $< |
| 204 | + |
| 205 | +${ELIOM_CLIENT_DIR}/%.cmo: %.eliom |
| 206 | + ${JS_OF_ELIOM} -c ${CLIENT_INC} $(GENERATE_DEBUG) $< |
| 207 | +${ELIOM_CLIENT_DIR}/%.cmo: %.ml |
| 208 | + ${JS_OF_ELIOM} -c ${CLIENT_INC} $(GENERATE_DEBUG) $< |
| 209 | + |
| 210 | +${ELIOM_CLIENT_DIR}/%.cmi: %.eliomi |
| 211 | + ${JS_OF_ELIOM} -c ${CLIENT_INC} $(GENERATE_DEBUG) $< |
| 212 | + |
| 213 | +##---------------------------------------------------------------------- |
| 214 | +## Dependencies |
| 215 | + |
| 216 | +include .depend |
| 217 | + |
| 218 | +.depend: $(patsubst %,$(DEPSDIR)/%.server,$(SERVER_FILES)) $(patsubst %,$(DEPSDIR)/%.client,$(CLIENT_FILES)) |
| 219 | + cat $^ > $@ |
| 220 | + |
| 221 | +$(DEPSDIR)/%.server: % | $(DEPSDIR) |
| 222 | + $(ELIOMDEP) -server -reason -ppx $(SERVER_INC) $< > $@ |
| 223 | + |
| 224 | +$(DEPSDIR)/%.client: % | $(DEPSDIR) |
| 225 | + $(ELIOMDEP) -client -reason -ppx $(CLIENT_INC) $< > $@ |
| 226 | + |
| 227 | +$(DEPSDIR): |
| 228 | + mkdir $@ |
| 229 | + |
| 230 | +##---------------------------------------------------------------------- |
| 231 | +## Clean up |
| 232 | + |
| 233 | +clean: |
| 234 | + -rm -f *.cm[ioax] *.cmxa *.cmxs *.o *.a *.annot |
| 235 | + -rm -f *.type_mli |
| 236 | + -rm -f ${PROJECT_NAME}.js |
| 237 | + -rm -rf ${ELIOM_CLIENT_DIR} ${ELIOM_SERVER_DIR} |
| 238 | + |
| 239 | +distclean: clean |
| 240 | + -rm -rf $(TEST_PREFIX) $(DEPSDIR) .depend |
0 commit comments