Most software-intensive systems rely on a componentbased design and are therefore made up of encapsulated structural units which are hierarchically composed of one another. In this paper, we (1) propose a scheme for rigorously managing variability in the context of such a compositional hierarchy, which consistently extends the paradigm of component-based design to variability management, (2) present several basic patterns of specifying variability when applying this scheme in practice, and (3) show how all this was technically realized in EAST-ADL2, an architecture description language for automotive software development. While the observations and concepts discussed in this paper emerged from an automotive context, they are arguably applicable to many other industrial domains involving software-intensive systems.