Was du da in Wirklichkeit hast, sind zwei verschiedene Bibliotheken, die dasselbe Interface anbieten. Die eine ist eine Abhängigkeit vom Kernel, die andere eine Abhängigkeit von allen Userspace-Programmen. Ich würde nicht empfehlen, dass du das beides aus der gleichen Sourcedatei baust, aber wenn du das willst, geht das natürlich auch.
kernellib.o: lib.c
$(CC) -c -DKERNELLIB=1 -o $@ $^
userlib.o: lib.c
$(CC) -c -o $@ $^
Irgendwie sowas, und dann hättest du #ifdef KERNELLIB im Sourcecode. Wie gesagt, ich würde den Code lieber gleich auf zwei verschiedene Sourcedateien verteilen, aber wenn man unbedingt will, geht es auch so.