# Will produce something like "a -- b --"
varcat = $(foreach v,$1,$($2$v)$(if $3,$3, ~))
+# Replace variables with specified values in a template file. The first
+# argument is a list of make variables names which will be replaced in the
+# target file. The strings @VARNAME@ in the template file will be replaced
+# with the value of the make $(VARNAME) variable and the result will be stored
+# in the target file. The second (optional) argument is a prefix to add to the
+# make variables names, so if the prefix is PREFIX_ and @VARNAME@ is found in
+# the template file, it will be replaced by the value of the make variable
+# $(PREFIX_VARNAME). The third and fourth arguments are the source file and
+# the destination file (both optional, $< and $@ are used if omitted). The
+# fifth (optional) argument are options to pass to the substitute sed command
+# (for example, use "g" if you want to do multiple substitutions per line).
+replace = $(call exec,sed '$(foreach v,$1,s|@$v@|$($2$v)|$5;)' $(if $3,$3,$<) \
+ > $(if $4,$4,$@))
+
# Create a symbolic link to the project under the $(INCLUDE_DIR). The first
# argument is the name of symlink to create. The link is only created if it
# doesn't already exist.
$L/%.so: $G/link-o-flags
$(call link,-shared)
+# Create pkg-config files using a template
+$L/%.pc:
+ $(call replace,$(PC_VARS),$*-PC-)
+
# Install binary programs
$I/bin/%:
$(call install_file,0755)
$I/sbin/%:
$(call install_file,0755)
+# Install pkg-config specification files
+$I/lib/pkgconfig/%:
+ $(call install_file)
+
# Install libraries
$I/lib/%:
$(call install_file)
-# Create the include directory symlink
-setup_include_dir__ := $(call symlink_include_dir,otherproj)
-
-# Build the shared library
-$L/libotherproj.so: LINKER := $(CC)
-$L/libotherproj.so: $(call find_objects,c)
+# Symbolic target to add to all
+.PHONY: otherproj
all += otherproj
-# Nice shortcut target
-.PHONY: otherproj
-otherproj: $L/libotherproj.so
+# pkg-config specification file
+otherproj-PC-PREFIX := $(prefix)
+otherproj-PC-NAME := otherproj
+otherproj-PC-DESC := Some other project
+otherproj-PC-URL := http://www.otherproj.example.com/
+otherproj-PC-VERSION := 1.0
+otherproj-PC-LIBS := -lotherproject
+otherproj-PC-CFLAGS := -DOTHERPROJ_DEFINE
+otherproj-PC-VARS := PREFIX NAME DESC URL VERSION LIBS CFLAGS
+$L/otherproj.pc: PC_VARS := $(otherproj-PC-VARS)
+$L/otherproj.pc: $C/otherproj.pc.in $L/otherproj.pc-flags
+# trigger a rebuild when flags change
+setup_flags_files__ := $(call gen_rebuild_flags,$L/otherproj.pc-flags,\
+ $(call varcat,$(otherproj-PC-VARS),otherproj-PC-))
+# install
+$I/lib/pkgconfig/otherproj.pc: $L/otherproj.pc
+install += $I/lib/pkgconfig/otherproj.pc
+otherproj: $L/otherproj.pc
-# Install the shared library
+# Shared library
+$L/libotherproj.so: LINKER := $(CC)
+$L/libotherproj.so: $(call find_objects,c)
$I/lib/libotherproj.so: $L/libotherproj.so
install += $I/lib/libotherproj.so
+otherproj: $L/libotherproj.so
# Install the library's headers
$I/include/otherproj/%.h: $C/%.h
# XXX: we can't use += here, call will be resolved lazily if we do
install := $(install) $(call find_headers,h,$I/include/otherproj)
+# Create the include directory symlink and pkg-config flags file
+setup_include_dir__ := $(call symlink_include_dir,otherproj)
+