Enable optional building of libXNVCtrl.so in nvidia-settings

Will it be possible to libXNVCtrl.so building from the nvidia-settings tarball without patching the Makefile or calling gcc by hand?

I was about to open an “issue” on github for the official nvidia-settings repository but the button to open issues has been removed.

Something like a switch in the main Makefile that would trigger building the static library inside the main executable (like it is now) or building it with the shared object enabled and link to it. Something like this (installation part missing) where if the compilation sets XNVCTRL_LIB_STATIC to 0 the shared object is built and linked in nvidia-settings:

diff -Naur nvidia-settings-331.20.old/src/libXNVCtrl/Makefile nvidia-settings-331.20/src/libXNVCtrl/Makefile
--- nvidia-settings-331.20.old/src/libXNVCtrl/Makefile	2013-12-23 12:52:57.618242486 +0100
+++ nvidia-settings-331.20/src/libXNVCtrl/Makefile	2013-12-23 18:02:02.075963709 +0100
@@ -19,15 +19,31 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
+VERSION_MK := $(wildcard $(OUTPUTDIR)/version.mk version.mk)
+include $(VERSION_MK)
+
+ifndef NVIDIA_VERSION
+$(error NVIDIA_VERSION undefined)
+endif
+
 RANLIB ?= ranlib
 CFLAGS += -fPIC
 
+all: libXNVCtrl.a libXNVCtrl.so
+
 libXNVCtrl.a : libXNVCtrl.a(NVCtrl.o)
 	$(RANLIB) $@
 
+libXNVCtrl.so: NVCtrl.o
+	$(RM) $@ $@.*
+	$(CC) -shared -Wl,-soname=$@.0 -o $@.$(NVIDIA_VERSION) $(LDFLAGS) $^ -lXext -lX11
+	ln -s $@.$(NVIDIA_VERSION) $@.0
+	ln -s $@.0 $@
+
 NVCtrl.o : NVCtrl.h nv_control.h NVCtrlLib.h
 .INTERMEDIATE: NVCtrl.o
 
 clean ::
 	rm -f libXNVCtrl.a *.o
+	rm -f libXNVCtrl.so libXNVCtrl.so.*
 .PHONY: clean
diff -Naur nvidia-settings-331.20.old/src/libXNVCtrl/version.mk nvidia-settings-331.20/src/libXNVCtrl/version.mk
--- nvidia-settings-331.20.old/src/libXNVCtrl/version.mk	1970-01-01 01:00:00.000000000 +0100
+++ nvidia-settings-331.20/src/libXNVCtrl/version.mk	2013-12-23 17:52:31.223697586 +0100
@@ -0,0 +1 @@
+NVIDIA_VERSION = 331.20
diff -Naur nvidia-settings-331.20.old/src/Makefile nvidia-settings-331.20/src/Makefile
--- nvidia-settings-331.20.old/src/Makefile	2013-12-23 12:52:57.619242471 +0100
+++ nvidia-settings-331.20/src/Makefile	2013-12-23 18:04:34.371433858 +0100
@@ -79,6 +79,13 @@
 
 XNVCTRL_DIR             ?= libXNVCtrl
 XNVCTRL_ARCHIVE         ?= $(XNVCTRL_DIR)/libXNVCtrl.a
+XNVCTRL_SHARED          ?= $(XNVCTRL_DIR)/libXNVCtrl.so.0
+
+ifeq ($(XNVCTRL_LIB_STATIC),0)
+  XNVCTRL_LIB           ?= $(XNVCTRL_SHARED)
+endif
+XNVCTRL_LIB             ?= $(XNVCTRL_ARCHIVE)
+
 XCONFIG_PARSER_DIR      ?= XF86Config-parser
 COMMON_UTILS_DIR        ?= common-utils
 COMMON_UNIX_DIR         ?= common-unix
@@ -179,9 +186,12 @@
 	$(MKDIR) $(BINDIR)
 	$(INSTALL) $(INSTALL_BIN_ARGS) $< $(BINDIR)/$(notdir $<)
 
-$(NVIDIA_SETTINGS): $(OBJS) $(XNVCTRL_ARCHIVE)
+$(XNVCTRL_ARCHIVE) $(XNVCTRL_SHARED):
+	$(MAKE) -C $(XNVCTRL_DIR)
+
+$(NVIDIA_SETTINGS): $(OBJS) $(XNVCTRL_LIB)
 	$(call quiet_cmd,LINK) $(CFLAGS) $(LDFLAGS) $(BIN_LDFLAGS) -o $@ $(OBJS) \
-	    $(XNVCTRL_ARCHIVE) $(LIBS)
+	    $(XNVCTRL_LIB) $(LIBS)
 	$(call quiet_cmd,STRIP_CMD) $@
 
 # define the rule to build each object file
@@ -191,6 +201,7 @@
 $(eval $(call DEFINE_STAMP_C_RULE, $(OBJS),$(NVIDIA_SETTINGS_PROGRAM_NAME)))
 
 clean clobber:
+	$(MAKE) -C $(XNVCTRL_DIR) clean
 	rm -rf $(NVIDIA_SETTINGS) *~ $(STAMP_C) \
 		$(OUTPUTDIR)/*.o $(OUTPUTDIR)/*.d

Thanks,
–Simone