Automating Component-Based System Assembly