Skip to content

Commit

Permalink
Rewrite makefile to better track dependencies.
Browse files Browse the repository at this point in the history
  • Loading branch information
spladug committed Nov 29, 2011
1 parent 7aa603d commit ffb62ff
Show file tree
Hide file tree
Showing 2 changed files with 210 additions and 108 deletions.
212 changes: 119 additions & 93 deletions r2/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -20,135 +20,161 @@
# CondeNet, Inc. All Rights Reserved.
################################################################################

# Javascript files to be compressified
js_libs = $(addprefix lib/,json2.js jquery.cookie.js jquery.url.js ui.core.js ui.datepicker.js jquery.flot.js jquery.lazyload.js)
js_sources = $(js_libs) jquery.reddit.js reddit.js login.js ui.js base.js sponsored.js compact.js blogbutton.js flair.js analytics.js utils.js
js_targets = button.js jquery.flot.js sponsored.js
localized_js_targets = reddit.js mobile.js
localized_js_outputs = $(localized_js_targets:.js=.*.js)

# CSS targets
main_css = reddit.css
main_sprite = $(static_dir)/sprite-main.png
compact_css = compact.css
compact_sprite = $(static_dir)/sprite-compact.png
css_targets = $(main_css) $(compact_css) reddit-ie6-hax.css reddit-ie7-hax.css mobile.css

package = r2
static_dir = $(package)/public/static

SHELL=/bin/sh
PYTHON=python
SED=sed
CAT=cat
PYTHON=python
JS_COMPRESS = paster run standalone $(package)/lib/js.py -c "build_reddit_js()"
CSS_COMPRESS = $(SED) -e 's/ \+/ /' -e 's/\/\*.*\*\///g' -e 's/: /:/' | grep -v "^ *$$"
UPDATE_NAMES = $(PYTHON) $(package)/lib/static.py
BUILD_DIR=build

.PHONY: clean
all: pyx static ini
clean: clean_pyx clean_i18n clean_static

# If admin codebase is install, get its path so that we can build ini
# files against the primary production.ini
PRIVATEREPOS = $(shell $(PYTHON) -c 'exec "try: import r2admin; print r2admin.__path__[0]\nexcept:pass"')
#################### Cython
PYX_FILES := $(shell find . -name \*.pyx)
PYX_C_FILES := $(PYX_FILES:.pyx=.c)
PYX_SO_FILES := $(PYX_FILES:.pyx=.so)
PYX_BUILDSTAMP := $(BUILD_DIR)/pyx-buildstamp

.PHONY: clean_pyx

# If reddit-i18n repo is found, use that for r2.pot generation
I18NPATH = $(shell $(PYTHON) -c 'exec "try: import reddit_i18n; print reddit_i18n.__path__[0]\nexcept ImportError: print \"r2/i18n\""')
pyx: $(PYX_BUILDSTAMP)

#------
$(PYX_C_FILES): %.c: %.pyx
cython $<

JSTARGETS = $(foreach js, $(js_targets) $(localized_js_targets), $(static_dir)/$(js))
JSOUTPUTS = $(foreach js, $(js_targets) $(localized_js_outputs), $(static_dir)/$(js))
JSSOURCES = $(foreach js, $(js_sources), $(static_dir)/js/$(js))
CSSTARGETS = $(foreach css, $(css_targets), $(static_dir)/$(css))
SPRITES = $(main_sprite) $(compact_sprite)
RTLCSS = $(CSSTARGETS:.css=-rtl.css)
NAMES = $(static_dir)/names.json
# this won't rebuild pyx if you're a jerk and delete a .so file without deleting the buildstamp
# make clean && make pyx will fix this
$(PYX_BUILDSTAMP): $(PYX_C_FILES)
$(PYTHON) setup.py build_ext --inplace
touch $@

PYX_FILES := $(shell find . -name \*.pyx)
PYXC_FILES := $(PYX_FILES:.pyx=.c)
PYXSO_FILES := $(PYX_FILES:.pyx=.so)

NAMED = $(JSOUTPUTS) $(CSSTARGETS) $(RTLCSS) $(SPRITES)
NAMELINKS = $(patsubst %.css,%.*.css,$(patsubst %.js,%.*.js,$(NAMED)))
GZIPPED = $(foreach file, $(filter %.js %.css, $(wildcard $(NAMELINKS))) $(static_dir)/js/lib/jquery.js, $(file).gz)

INIUPDATE = $(wildcard *.update)
INIS = $(INIUPDATE:.update=.ini)

%.ini: %.update
ifneq (,$(PRIVATEREPOS))
ln -sf `pwd`/$< $(PRIVATEREPOS)/..
make -C $(PRIVATEREPOS)/.. $@
ln -sf $(PRIVATEREPOS)/../$@ .
else
clean_pyx:
rm -f $(PYX_BUILDSTAMP) $(PYX_C_FILES) $(PYX_SO_FILES)

#################### i18n
I18NPATH := $(shell $(PYTHON) -c 'from r2.lib.i18n import I18N_PATH; print I18N_PATH')
STRINGS_FILE := r2/lib/strings.py
RAND_STRINGS_FILE := r2/lib/rand_strings.py
POTFILE := $(I18NPATH)/r2.pot

.PHONY: i18n clean_i18n

i18n: $(RAND_STRINGS_FILE)
$(PYTHON) setup.py extract_messages -o $(POTFILE)

$(RAND_STRINGS_FILE): $(STRINGS_FILE)
paster run standalone $(STRINGS_FILE) -c "print_rand_strings()" > $(RAND_STRINGS_FILE)

clean_i18n:
rm -f $(RAND_STRINGS_FILE)

#################### ini files
INIFILES := $(wildcard *.update)

ini: $(INIFILES)

$(INIFILES): %.ini: %.update
./updateini.py example.ini $< > $@ || rm $@
endif

#################### Static Files
STATIC_DIR := r2/public/static

.PHONY: clean_static

static: pyx css js names

clean_static: clean_css clean_js clean_names

all: pyx static names $(INIS)
#### Stylesheets
CSS_COMPRESS := $(SED) -e 's/ \+/ /' -e 's/\/\*.*\*\///g' -e 's/: /:/' | grep -v "^ *$$"
CSS_SOURCE_DIR := $(STATIC_DIR)/css

.PHONY: pyx js css rtl static names i18n clean clean_static clean_pyx all gzip clean_gzip
SPRITED_STYLESHEETS := reddit.css compact.css
PROCESSED_SPRITED_STYLESHEETS := $(addprefix $(STATIC_DIR)/, $(SPRITED_STYLESHEETS))
SPRITES := $(addprefix $(STATIC_DIR)/, $(patsubst %.css,sprite-%.png, $(SPRITED_STYLESHEETS)))

$(NAMES): $(JSTARGETS) $(CSSTARGETS) $(RTLCSS) $(SPRITES)
$(UPDATE_NAMES) $(NAMES) $(NAMED)
OTHER_STYLESHEETS := reddit-ie6-hax.css reddit-ie7-hax.css mobile.css
MINIFIED_OTHER_STYLESHEETS := $(addprefix $(STATIC_DIR)/, $(OTHER_STYLESHEETS))

$(JSTARGETS): $(JSSOURCES)
$(JS_COMPRESS)
PROCESSED_STYLESHEETS := $(PROCESSED_SPRITED_STYLESHEETS) $(MINIFIED_OTHER_STYLESHEETS)
RTL_STYLESHEETS := $(PROCESSED_STYLESHEETS:.css=-rtl.css)

$(main_sprite) $(static_dir)/$(main_css): $(static_dir)/css/$(main_css)
rm -f $@ # delete symlink so we don't just overwrite the old mangled file
$(PYTHON) r2/lib/nymph.py $< $(static_dir)/sprite-main.png | $(CSS_COMPRESS) > $@
CSS_OUTPUTS = $(PROCESSED_STYLESHEETS) $(RTL_STYLESHEETS) $(SPRITES)

$(compact_sprite) $(static_dir)/$(compact_css) : $(static_dir)/css/$(compact_css)
rm -f $@ # delete symlink so we don't just overwrite the old mangled file
$(PYTHON) r2/lib/nymph.py $< $(static_dir)/sprite-compact.png | $(CSS_COMPRESS) > $@
.PHONY: clean_css

$(static_dir)/%.css : $(static_dir)/css/%.css
css: $(CSS_OUTPUTS)

$(MINIFIED_OTHER_STYLESHEETS): $(STATIC_DIR)/%.css: $(CSS_SOURCE_DIR)/%.css
$(CAT) $< | $(CSS_COMPRESS) > $@

$(RTLCSS): %-rtl.css : %.css
$(STATIC_DIR)/sprite-%.png $(STATIC_DIR)/%.css: $(CSS_SOURCE_DIR)/%.css
# when static file names are mangled, the original becomes a symlink to the mangled name
# remove the original file here in case it's a symlink so we don't just rewrite the old file
rm -f $(STATIC_DIR)/$*.css
$(PYTHON) r2/lib/nymph.py $< $(STATIC_DIR)/sprite-$*.png | $(CSS_COMPRESS) > $(STATIC_DIR)/$*.css

$(RTL_STYLESHEETS): %-rtl.css : %.css
$(SED) -e "s/left/>####</g" \
-e "s/right/left/g" \
-e "s/>####</right/g" \
-e "s/\(margin\|padding\):\s*\([^; ]\+\)\s\+\([^; ]\+\)\s\+\([^; ]\+\)\s\+\([^; ]\+\)/\1:\2 \5 \4 \3/g" $< > $@

%.c: %.pyx
cython $<
clean_css:
rm -f $(CSS_OUTPUTS)

$(PYXSO_FILES): $(PYXC_FILES)
python setup.py build_ext --inplace
#### JS
JS_MODULES := $(shell $(PYTHON) r2/lib/js.py enumerate_modules)
JS_MODULE_BUILDSTAMPS := $(foreach module,$(JS_MODULES),$(BUILD_DIR)/$(module)-js-buildstamp)
JS_OUTPUTS := $(shell $(PYTHON) r2/lib/js.py enumerate_outputs)

pyx: $(PYXSO_FILES)
.PHONY: clean_js

static: js css rtl
js: $(JS_MODULE_BUILDSTAMPS)

js: pyx $(JSTARGETS)
$(JS_OUTPUTS): $(JS_MODULE_BUILDSTAMPS)

css: $(CSSTARGETS) $(SPRITES)
define JS_MODULE_TEMPLATE
$(BUILD_DIR)/$(1)-js-buildstamp: $$(shell $(PYTHON) r2/lib/js.py dependencies $(1))
paster run standalone r2/lib/js.py -c "build_module('$(1)')"
touch $$@
endef

rtl: $(RTLCSS)
# apply the module template to each of the modules
# so they source their deps from js.py and build accordingly
$(foreach module,$(JS_MODULES),$(eval $(call JS_MODULE_TEMPLATE,$(module))))

names: $(NAMES)
clean_js:
rm -f $(JS_MODULE_BUILDSTAMPS) $(STATIC_DIR)/*.js

# Not part of 'all' target as it doesn't need to be run for the site to work,
# only when r2.pot needs updating
i18n:
paster run run.ini r2/lib/strings.py -c "print_rand_strings()" > r2/lib/rand_strings.py
python setup.py extract_messages -o $(I18NPATH)/r2.pot
#### name mangling
MANGLEABLE_FILES := $(CSS_OUTPUTS) $(JS_OUTPUTS)
MANGLE_BUILDSTAMP := $(BUILD_DIR)/mangle-buildstamp
NAMES_FILE := $(STATIC_DIR)/names.json
MANGLED_FILES := $(wildcard $(foreach file,$(MANGLEABLE_FILES),$(basename $(file)).*$(suffix $(file))))

gzip: $(GZIPPED)
.PHONY: clean_names

%.gz: %
gzip -c $< > $@
names: $(MANGLE_BUILDSTAMP)

clean: clean_static clean_pyx clean_gzip
rm -f $(INIS) r2/lib/rand_strings.py
$(MANGLE_BUILDSTAMP): $(MANGLEABLE_FILES)
$(PYTHON) r2/lib/static.py $(NAMES_FILE) $(MANGLEABLE_FILES)
touch $@

clean_pyx:
rm -f $(PYXSO_FILES) $(PYXC_FILES)
clean_names:
rm -f $(MANGLE_BUILDSTAMP) $(NAMES_FILES) $(MANGLED_FILES)

clean_static: clean_names
rm -f $(JSTARGETS) $(JSOUTPUTS) $(CSSTARGETS) $(RTLCSS) $(SPRITES)
#### gzip!
GZIPPABLE := $(filter %.css %.js,$(MANGLED_FILES) $(STATIC_DIR)/js/lib/jquery.js)
GZIPPED := $(addsuffix .gz,$(GZIPPABLE))

clean_names:
rm -f $(NAMES) $(NAMELINKS) $(static_dir)/*.md5
.PHONY: clean_gzip

gzip: $(GZIPPED)

$(GZIPPED): %.gz: %
gzip -c $< > $@

clean_gzip:
rm -f $(static_dir)/*.css.gz $(static_dir)/*.js.gz $(static_dir)/js/lib/*.gz
rm -f $(GZIPPED)
Loading

0 comments on commit ffb62ff

Please sign in to comment.