title: Simple string substitution in Makefile
body: <p>I want to replace the string <code>libswscale.so.2</code> by <code>libswscale.so</code> (variables called <code>$(SLIBNAME_WITH_MAJOR)</code> and <code>$(SLIBNAME)</code>, respectively). This is what I tried in the Makefile:</p>
  
  <pre><code>$(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(OBJS) $(SUBDIR)lib$(NAME).ver
      [...]
      @echo SHFLAGS=$(SHFLAGS)
      @echo SLIBNAME_WITH_MAJOR=$(SLIBNAME_WITH_MAJOR)
      @echo SLIBNAME=$(SLIBNAME)
      @echo A $(patsubst $(SLIBNAME_WITH_MAJOR),$(SLIBNAME),$(SHFLAGS))
      @echo B $(SHFLAGS:$(SLIBNAME_WITH_MAJOR)=$(SLIBNAME))
      @echo C $($(SHFLAGS):$(SLIBNAME_WITH_MAJOR)=$(SLIBNAME))
      @echo D $(SHFLAGS:$(SLIBNAME_WITH_MAJOR)=$(SLIBNAME))
      @echo E $(subst $(SLIBNAME_WITH_MAJOR),$(SLIBNAME),$(SHFLAGS))
      @echo F $(subst l,L,$(SHFLAGS))
  </code></pre>
  
  <p>The output is</p>
  
  <pre><code>SHFLAGS=-shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
  SLIBNAME_WITH_MAJOR=libswscale.so.2
  SLIBNAME=libswscale.so
  A -shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
  B -shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
  C
  D -shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
  E -shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
  F -shared -WL,-soname,libswscale.so.2 -WL,-BsymboLic -WL,--version-script,LibswscaLe/LibswscaLe.ver
  </code></pre>
  
  <p>The last one (F) is especially ridiculous. What is wrong here? Is it because <code>$(SHFLAGS)</code> is made up of variables as well?</p>