I am using a Makefile for generating a document from its tex source. The whole project consisting of own input files (.tex, .bib, .eps, ...) and non-pre-installed static input files (.cls, .sty, .bst) is kept under version control (git) for colloborative writing. I try to avoid messing up the main folder and use subdirectories for output and different kinds of input files. All files which are not available within TeX Live should be in the repository to allow everyone a simple git clone and make to create the document. My question is: is there any convenient way which allows me to place all .cls, .sty, .bst into a ./texmf folder with in the document tree:

├── .git/...
├── graphics/fig1-<...>.eps
├── graphics/fig2-<...>.eps
├── graphics/...
├── output/docname.pdf
├── output/docname.aux
├── output/...
├── texmf/docclass.cls
├── texmf/custom-package.sty
├── texmf/...
├── docname.tex
├── docname.bib
└── Makefile

The Makefile looks like this

LATEX    := pdflatex
ODIR     := ./output
LATEXOPTS:= --output-dir=$(ODIR)

    $(TEXFILE).pdf: $(TEXFILE).tex $(TEXFILE).bib
         $(LATEX) $(LATEXOPTS) $(TEXFILE).tex

Following solution works but as colloborators have to adjust environment variables every time or their .bashrc for this project, I am not really happy about it:

$ export TEXINPUTS=".:./texmf:~/texmf:$TEXINPUTS"
$ make

Changing environment variables within a Makefile is not possible as far as I know.

  • Note that in your question as well as all the answers, a colon (:) is used as path separator. In windows, this does not work, as a semi-colon (;) is used instead. Since linux supports semi-colons as well, it seems like a good practice to me to use them everywhere for better portability. Commented Jul 29, 2016 at 9:58

2 Answers 2


You can in fact that environment variables inside a Makefile (tested with GNU make only). You need to do the following:

export VAR=value without quotes

If you reference the previous value of the same variable you need to use the := assignment instead which expands the value immediately. The normal = is expanding the value at every use and will lead to an recursive assignment, which make detects and reports as an error. There are no quotes required around the value and using them might cause trouble. Also variables must be written as ${VAR} on the right-hand side, not $VAR.

So you can add the following line to your Makefile, at best at the beginning:

export TEXINPUTS:=.:./texmf:~/texmf:${TEXINPUTS}

I use latexmk for some document building, and I've wanted something like this for a long time. Especially when I have document and class under version control.

I discovered that you can configure latexmk with a local latexmkrc file in the document's directory. latexmkrc files are just perl code.

So in this workflow, if the class files are in ./texmf you can add the following line to a local latexmkrc:

$ENV{'TEXINPUTS'}='./texmf//:' . $ENV{'TEXINPUTS'};

This works on my Mac, and I assume on any unix machine that uses environment variables this way. For windows, and indeed for any platform, latexmk's author John Collins has a solution at his answer to a similar question.

  • Thanks. This is good to know, too. However, at the moment I still use existing Makefiles and my colleagues are not aware of latexmk. I will give latexmk a try at the next occasion. The customization feature via a latexmkrc file sounds like a neat way to deal with user-dependent preferences.
    – Hotschke
    Commented Apr 5, 2012 at 17:11
  • Could you clarify that latexmkrc doesn't need a preceding dot in its name?
    – einpoklum
    Commented Jun 20, 2016 at 21:04
  • @einpoklum According to the manual, it will work with or without the dot. Commented Jun 21, 2016 at 0:28
  • @MatthewLeingang this does not seem to work on Windows. Commented Feb 13, 2019 at 19:01
  • @Krishna Unfortunately I have no experience with latexmk and Windows. There is some documentation by third party users on how to make it work though. Commented Feb 13, 2019 at 20:14

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .