only write out files if they don't exist
implementer is responsible for creating build directory