git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 1/2] Makefile: use curl-config to determine curl flags
@ 2014-04-28 19:35 Dave Borowitz
  2014-04-28 19:35 ` [PATCH v3 2/2] Makefile: allow static linking against libcurl Dave Borowitz
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Dave Borowitz @ 2014-04-28 19:35 UTC (permalink / raw)
  To: git; +Cc: kusmabite, gitster, Dave Borowitz

curl-config is usually installed alongside a curl distribution, and
its purpose is to provide flags for building against libcurl, so use
it instead of guessing flags and dependent libraries.

Allow overriding CURL_CONFIG to a custom path to curl-config, to
compile against a curl installation other than the first in PATH.

Depending on the set of features curl is compiled with, there may be
more libraries required than the previous two options of -lssl and
-lidn. For example, with a vanilla build of libcurl-7.36.0 on Mac OS X
10.9:

$ ~/d/curl-out-7.36.0/lib/curl-config --libs
-L/Users/dborowitz/d/curl-out-7.36.0/lib -lcurl -lgssapi_krb5 -lresolv -lldap -lz

Use this only when CURLDIR is not explicitly specified, to continue
supporting older builds. Moreover, if CURL_CONFIG is unset or running
it returns no results (e.g. because it is missing), default to the old
behavior of blindly setting -lcurl.

Signed-off-by: Dave Borowitz <dborowitz@google.com>
---
 Makefile | 51 +++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 37 insertions(+), 14 deletions(-)

diff --git a/Makefile b/Makefile
index 2128ce3..cb4ee37 100644
--- a/Makefile
+++ b/Makefile
@@ -34,8 +34,14 @@ all::
 # git-http-push are not built, and you cannot use http:// and https://
 # transports (neither smart nor dumb).
 #
+# Define CURL_CONFIG to the path to a curl-config binary other than the
+# default 'curl-config'. If CURL_CONFIG is unset or points to a binary that
+# is not found, defaults to the CURLDIR behavior, or if CURLDIR is not set,
+# uses -lcurl with no additional library detection.
+#
 # Define CURLDIR=/foo/bar if your curl header and library files are in
-# /foo/bar/include and /foo/bar/lib directories.
+# /foo/bar/include and /foo/bar/lib directories.  This overrides CURL_CONFIG,
+# but is less robust.
 #
 # Define NO_EXPAT if you do not have expat installed.  git-http-push is
 # not built, and you cannot push using http:// and https:// transports (dumb).
@@ -143,9 +149,11 @@ all::
 #
 # Define NEEDS_SSL_WITH_CRYPTO if you need -lssl when using -lcrypto (Darwin).
 #
-# Define NEEDS_SSL_WITH_CURL if you need -lssl with -lcurl (Minix).
+# Define NEEDS_SSL_WITH_CURL if you need -lssl with -lcurl (Minix).  Only used
+# if CURLDIR is set.
 #
-# Define NEEDS_IDN_WITH_CURL if you need -lidn when using -lcurl (Minix).
+# Define NEEDS_IDN_WITH_CURL if you need -lidn when using -lcurl (Minix).  Only
+# used if CURLDIR is set.
 #
 # Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
 #
@@ -1118,20 +1126,35 @@ ifdef NO_CURL
 	REMOTE_CURL_NAMES =
 else
 	ifdef CURLDIR
-		# Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case.
-		BASIC_CFLAGS += -I$(CURLDIR)/include
-		CURL_LIBCURL = -L$(CURLDIR)/$(lib) $(CC_LD_DYNPATH)$(CURLDIR)/$(lib) -lcurl
+		CURL_LIBCURL=
 	else
-		CURL_LIBCURL = -lcurl
-	endif
-	ifdef NEEDS_SSL_WITH_CURL
-		CURL_LIBCURL += -lssl
-		ifdef NEEDS_CRYPTO_WITH_SSL
-			CURL_LIBCURL += -lcrypto
+		CURL_CONFIG ?= curl-config
+		ifeq "$(CURL_CONFIG)" ""
+			CURL_LIBCURL =
+		else
+			CURL_LIBCURL := $(shell $(CURL_CONFIG) --libs)
 		endif
 	endif
-	ifdef NEEDS_IDN_WITH_CURL
-		CURL_LIBCURL += -lidn
+
+	ifeq "$(CURL_LIBCURL)" ""
+		ifdef CURLDIR
+			# Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case.
+			BASIC_CFLAGS += -I$(CURLDIR)/include
+			CURL_LIBCURL = -L$(CURLDIR)/$(lib) $(CC_LD_DYNPATH)$(CURLDIR)/$(lib) -lcurl
+		else
+			CURL_LIBCURL = -lcurl
+		endif
+		ifdef NEEDS_SSL_WITH_CURL
+			CURL_LIBCURL += -lssl
+			ifdef NEEDS_CRYPTO_WITH_SSL
+				CURL_LIBCURL += -lcrypto
+			endif
+		endif
+		ifdef NEEDS_IDN_WITH_CURL
+			CURL_LIBCURL += -lidn
+		endif
+	else
+		BASIC_CFLAGS += $(shell $(CURL_CONFIG) --cflags)
 	endif
 
 	REMOTE_CURL_PRIMARY = git-remote-http$X
-- 
1.9.1.423.g4596e3a

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v3 2/2] Makefile: allow static linking against libcurl
  2014-04-28 19:35 [PATCH v3 1/2] Makefile: use curl-config to determine curl flags Dave Borowitz
@ 2014-04-28 19:35 ` Dave Borowitz
  2014-04-28 19:44 ` [PATCH v3 1/2] Makefile: use curl-config to determine curl flags Jonathan Nieder
  2014-04-28 19:56 ` Junio C Hamano
  2 siblings, 0 replies; 7+ messages in thread
From: Dave Borowitz @ 2014-04-28 19:35 UTC (permalink / raw)
  To: git; +Cc: kusmabite, gitster, Dave Borowitz

This requires more flags than can be guessed with the old-style
CURLDIR and related options, so is only supported when curl-config is
present.

Signed-off-by: Dave Borowitz <dborowitz@google.com>
---
 Makefile | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/Makefile b/Makefile
index cb4ee37..360d427 100644
--- a/Makefile
+++ b/Makefile
@@ -39,6 +39,9 @@ all::
 # is not found, defaults to the CURLDIR behavior, or if CURLDIR is not set,
 # uses -lcurl with no additional library detection.
 #
+# Define CURL_STATIC to statically link libcurl.  Only applies if
+# CURL_CONFIG is used.
+#
 # Define CURLDIR=/foo/bar if your curl header and library files are in
 # /foo/bar/include and /foo/bar/lib directories.  This overrides CURL_CONFIG,
 # but is less robust.
@@ -1137,6 +1140,9 @@ else
 	endif
 
 	ifeq "$(CURL_LIBCURL)" ""
+		ifdef CURL_STATIC
+                        $(error "CURL_STATIC must be used with CURL_CONFIG")
+		endif
 		ifdef CURLDIR
 			# Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case.
 			BASIC_CFLAGS += -I$(CURLDIR)/include
@@ -1155,6 +1161,12 @@ else
 		endif
 	else
 		BASIC_CFLAGS += $(shell $(CURL_CONFIG) --cflags)
+		ifdef CURL_STATIC
+			CURL_LIBCURL = $(shell $(CURL_CONFIG) --static-libs)
+			ifeq "$(CURL_LIBCURL)" ""
+                                $(error libcurl not detected or not compiled with static support)
+			endif
+		endif
 	endif
 
 	REMOTE_CURL_PRIMARY = git-remote-http$X
-- 
1.9.1.423.g4596e3a

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 1/2] Makefile: use curl-config to determine curl flags
  2014-04-28 19:35 [PATCH v3 1/2] Makefile: use curl-config to determine curl flags Dave Borowitz
  2014-04-28 19:35 ` [PATCH v3 2/2] Makefile: allow static linking against libcurl Dave Borowitz
@ 2014-04-28 19:44 ` Jonathan Nieder
  2014-04-28 19:51   ` Dave Borowitz
  2014-04-28 19:56 ` Junio C Hamano
  2 siblings, 1 reply; 7+ messages in thread
From: Jonathan Nieder @ 2014-04-28 19:44 UTC (permalink / raw)
  To: Dave Borowitz; +Cc: git, kusmabite, gitster

Hi,

Dave Borowitz wrote:

> curl-config is usually installed alongside a curl distribution, and
> its purpose is to provide flags for building against libcurl, so use
> it instead of guessing flags and dependent libraries.

The previous version of these two patches is already part of "master".
Could you make an incremental patch?

Sorry for the fuss,
Jonathan

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 1/2] Makefile: use curl-config to determine curl flags
  2014-04-28 19:44 ` [PATCH v3 1/2] Makefile: use curl-config to determine curl flags Jonathan Nieder
@ 2014-04-28 19:51   ` Dave Borowitz
  0 siblings, 0 replies; 7+ messages in thread
From: Dave Borowitz @ 2014-04-28 19:51 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: git, Erik Faye-Lund, Junio C Hamano

On Mon, Apr 28, 2014 at 12:44 PM, Jonathan Nieder <jrnieder@gmail.com> wrote:
> Hi,
>
> Dave Borowitz wrote:
>
>> curl-config is usually installed alongside a curl distribution, and
>> its purpose is to provide flags for building against libcurl, so use
>> it instead of guessing flags and dependent libraries.
>
> The previous version of these two patches is already part of "master".
> Could you make an incremental patch?

Done. Thanks for pointing that out, and sorry for the noise.

> Sorry for the fuss,
> Jonathan

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 1/2] Makefile: use curl-config to determine curl flags
  2014-04-28 19:35 [PATCH v3 1/2] Makefile: use curl-config to determine curl flags Dave Borowitz
  2014-04-28 19:35 ` [PATCH v3 2/2] Makefile: allow static linking against libcurl Dave Borowitz
  2014-04-28 19:44 ` [PATCH v3 1/2] Makefile: use curl-config to determine curl flags Jonathan Nieder
@ 2014-04-28 19:56 ` Junio C Hamano
  2014-04-28 20:00   ` Junio C Hamano
  2014-04-28 21:13   ` Junio C Hamano
  2 siblings, 2 replies; 7+ messages in thread
From: Junio C Hamano @ 2014-04-28 19:56 UTC (permalink / raw)
  To: Dave Borowitz; +Cc: git, kusmabite

Dave Borowitz <dborowitz@google.com> writes:

> Use this only when CURLDIR is not explicitly specified, to continue
> supporting older builds. Moreover, if CURL_CONFIG is unset or running
> it returns no results (e.g. because it is missing), default to the old
> behavior of blindly setting -lcurl.
>  	ifdef CURLDIR
> +		CURL_LIBCURL=
>  	else
> +		CURL_CONFIG ?= curl-config
> +		ifeq "$(CURL_CONFIG)" ""
> +			CURL_LIBCURL =
> +		else
> +			CURL_LIBCURL := $(shell $(CURL_CONFIG) --libs)
>  		endif

This "ifeq" is redundant and will never set CURL_LIBCURL to empty
without running the "else" part, I think.  In a Makefile, a variable
explicitly set to empty and a variable that is unset are treated the
same.

	$ cat >Makefile <<EOF
	CURL_CONFIG ?= curl-config
	ifeq "$(CURL_CONFIG)" ""
		X=Empty
	else
		X=NotEmpty
	endif

	ifdef "$(CURL_CONFIG)"
		Z=Defined
	else
		Z=Undefined
	endif

	all::
		@echo "$(X) $(Z)"
	EOF
	$ make -f Makefile CURL_CONFIG=""
	Empty Undefined

That does not mean the patch will give us a broken behaviour,
though.  It just means the ifeq/else part will be redundant.

>  	endif
> +
> +	ifeq "$(CURL_LIBCURL)" ""

This will catch the "$(shell $(CURL_CONFIG) --libs) assigned an
empty string to CURL_LIBCURL" case, so the result is good.

I haven't checked what it would look like if we turn this into an
incremental patch to be applied on top of 'master' (which would give
us a place to document better why we do not rely on the presense of
curl-config), but if we can do so, that would be more preferable
than having to revert the merge of the previous one and then
applying these two patches anew.

Thanks.

> +		ifdef CURLDIR
> +			# Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case.
> +			BASIC_CFLAGS += -I$(CURLDIR)/include
> +			CURL_LIBCURL = -L$(CURLDIR)/$(lib) $(CC_LD_DYNPATH)$(CURLDIR)/$(lib) -lcurl
> +		else
> +			CURL_LIBCURL = -lcurl
> +		endif
> +		ifdef NEEDS_SSL_WITH_CURL
> +			CURL_LIBCURL += -lssl
> +			ifdef NEEDS_CRYPTO_WITH_SSL
> +				CURL_LIBCURL += -lcrypto
> +			endif
> +		endif
> +		ifdef NEEDS_IDN_WITH_CURL
> +			CURL_LIBCURL += -lidn
> +		endif
> +	else
> +		BASIC_CFLAGS += $(shell $(CURL_CONFIG) --cflags)
>  	endif
>  
>  	REMOTE_CURL_PRIMARY = git-remote-http$X

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 1/2] Makefile: use curl-config to determine curl flags
  2014-04-28 19:56 ` Junio C Hamano
@ 2014-04-28 20:00   ` Junio C Hamano
  2014-04-28 21:13   ` Junio C Hamano
  1 sibling, 0 replies; 7+ messages in thread
From: Junio C Hamano @ 2014-04-28 20:00 UTC (permalink / raw)
  To: Dave Borowitz; +Cc: git, kusmabite

Junio C Hamano <gitster@pobox.com> writes:

> That does not mean the patch will give us a broken behaviour,
> though.  It just means the ifeq/else part will be redundant.
>
>>  	endif
>> +
>> +	ifeq "$(CURL_LIBCURL)" ""
>
> This will catch the "$(shell $(CURL_CONFIG) --libs) assigned an
> empty string to CURL_LIBCURL" case, so the result is good.
>
> I haven't checked what it would look like if we turn this into an
> incremental patch to be applied on top of 'master' (which would give
> us a place to document better why we do not rely on the presense of
> curl-config), but if we can do so, that would be more preferable
> than having to revert the merge of the previous one and then
> applying these two patches anew.

And I just checked; it is not very pretty to call it "trivially
correct", and I would feel safer to revert the merge for 2.0, and
queue the new one for the next cycle, cooking it in 'pu' and then
'next' in the meantime.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 1/2] Makefile: use curl-config to determine curl flags
  2014-04-28 19:56 ` Junio C Hamano
  2014-04-28 20:00   ` Junio C Hamano
@ 2014-04-28 21:13   ` Junio C Hamano
  1 sibling, 0 replies; 7+ messages in thread
From: Junio C Hamano @ 2014-04-28 21:13 UTC (permalink / raw)
  To: Dave Borowitz; +Cc: git, kusmabite

Junio C Hamano <gitster@pobox.com> writes:

> This "ifeq" is redundant and will never set CURL_LIBCURL to empty
> without running the "else" part, I think.  In a Makefile, a variable
> explicitly set to empty and a variable that is unset are treated the
> same....
> 	$ make -f Makefile CURL_CONFIG=""
> 	Empty Undefined

Oh, I was blind.  Please ignore this noise.

Thanks.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2014-04-28 21:13 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-04-28 19:35 [PATCH v3 1/2] Makefile: use curl-config to determine curl flags Dave Borowitz
2014-04-28 19:35 ` [PATCH v3 2/2] Makefile: allow static linking against libcurl Dave Borowitz
2014-04-28 19:44 ` [PATCH v3 1/2] Makefile: use curl-config to determine curl flags Jonathan Nieder
2014-04-28 19:51   ` Dave Borowitz
2014-04-28 19:56 ` Junio C Hamano
2014-04-28 20:00   ` Junio C Hamano
2014-04-28 21:13   ` Junio C Hamano

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).