Hi friends!
I'm interested in your feedback and thoughts on this suggestion. See attached
patch.
This introduces a new header file that gets generated at build-time (only the
autotools build is adapted yet). It introduces a macro call CURL_HAS() that
can be used by applications to check if symbols are present in their version
of libcurl
An application could check for any public CURL_* symbol like this:
#if CURL_HAS(CURL_SOCKOPT_ERROR)
... and that would only evaluate true when compiled against curl headers from
a libcurl version that provides that symbol.
It also offers a variation of the macro if you for any reason want to check a
specific version. Did the option exist in 7.10.0 ?
#if CURL_HAS_IN(CURL_SOCKOPT_ERROR, 0x70a00)
Of course it'll be an issue for application authors that this macro is only
present from now on in an official curl but at least it can easily be copied
into and used with an older version if you want to. And if we introduce it
now, it'll still be a viable option in the future...
I'm of course also interested in bikeshedding opinions like how to name it,
how to use the macro and things like that.
--
/ daniel.haxx.se
From 8b57420a248f5f4d3ba47c2d47e29c783d2159a2 Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <[email protected]>
Date: Thu, 3 Sep 2015 00:04:10 +0200
Subject: [PATCH] has: generate the curl/has.h header
changed macro name, moved and renamed script to become docs/libcurl/has.pl,
generate code that is checksrc compliant
---
docs/libcurl/Makefile.am | 2 +-
docs/libcurl/symbols.pl | 100 ---------------------------------
include/curl/Makefile.am | 17 ++++--
include/curl/has.pl | 142 +++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 154 insertions(+), 107 deletions(-)
delete mode 100755 docs/libcurl/symbols.pl
create mode 100755 include/curl/has.pl
diff --git a/docs/libcurl/Makefile.am b/docs/libcurl/Makefile.am
index 5456ee4..677fb94 100644
--- a/docs/libcurl/Makefile.am
+++ b/docs/libcurl/Makefile.am
@@ -88,11 +88,11 @@ m4macrodir = $(datadir)/aclocal
dist_m4macro_DATA = libcurl.m4
CLEANFILES = $(HTMLPAGES) $(PDFPAGES) $(TESTS) libcurl-symbols.3
EXTRA_DIST = $(man_MANS) $(HTMLPAGES) index.html $(PDFPAGES) ABI \
- symbols-in-versions symbols.pl mksymbolsmanpage.pl
+ symbols-in-versions mksymbolsmanpage.pl
MAN2HTML= roffit --mandir=. < $< >$@
SUFFIXES = .3 .html
libcurl-symbols.3: $(srcdir)/symbols-in-versions $(srcdir)/mksymbolsmanpage.pl
diff --git a/docs/libcurl/symbols.pl b/docs/libcurl/symbols.pl
deleted file mode 100755
index a7b76e2..0000000
--- a/docs/libcurl/symbols.pl
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/usr/bin/perl
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 2011, Daniel Stenberg, <[email protected]>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at http://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-###########################################################################
-#
-# Experience has shown that the symbols-in-versions file is very useful to
-# applications that want to build with a wide range of libcurl versions.
-# It is however easy to get it wrong and the source gets a bit messy with all
-# the fixed numerical comparisons.
-#
-# The point of this script is to provide an easy-to-use macro for libcurl-
-# using applications to do preprocessor checks for specific libcurl defines,
-# and yet make the code clearly show what the macro is used for.
-#
-# Run this script and generate libcurl-symbols.h and then use that header in
-# a fashion similar to:
-#
-# #include "libcurl-symbols.h"
-#
-# #if LIBCURL_HAS(CURLOPT_MUTE)
-# has mute
-# #else
-# no mute
-# #endif
-#
-#
-open F, "<symbols-in-versions";
-
-sub str2num {
- my ($str)=@_;
- if($str =~ /([0-9]*)\.([0-9]*)\.*([0-9]*)/) {
- return sprintf("0x%06x", $1<<16 | $2 << 8 | $3);
- }
-}
-
-print <<EOS
-
-#include <curl/curl.h>
-
-#define LIBCURL_HAS(x) \\
- (defined(x ## _FIRST) && (x ## _FIRST <= LIBCURL_VERSION_NUM) && \\
- (!defined(x ## _LAST) || ( x ## _LAST >= LIBCURL_VERSION_NUM)))
-
-EOS
- ;
-
-while(<F>) {
- if(/^(CURL[^ ]*)[ \t]*(.*)/) {
- my ($sym, $vers)=($1, $2);
-
- my $intr;
- my $rm;
- my $dep;
-
- # is there removed info?
- if($vers =~ /([\d.]+)[ \t-]+([\d.-]+)[ \t]+([\d.]+)/) {
- ($intr, $dep, $rm)=($1, $2, $3);
- }
- # is it a dep-only line?
- elsif($vers =~ /([\d.]+)[ \t-]+([\d.]+)/) {
- ($intr, $dep)=($1, $2);
- }
- else {
- $intr = $vers;
- }
-
- my $inum = str2num($intr);
-
- print <<EOS
-#define ${sym}_FIRST $inum /* Added in $intr */
-EOS
-;
- my $irm = str2num($rm);
- if($rm) {
- print <<EOS
-#define ${sym}_LAST $irm /* Last featured in $rm */
-EOS
-;
- }
-
- }
-}
diff --git a/include/curl/Makefile.am b/include/curl/Makefile.am
index 86e8b78..f804bbb 100644
--- a/include/curl/Makefile.am
+++ b/include/curl/Makefile.am
@@ -3,11 +3,11 @@
# Project ___| | | | _ \| |
# / __| | | | |_) | |
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2011, Daniel Stenberg, <[email protected]>, et al.
+# Copyright (C) 1998 - 2015, Daniel Stenberg, <[email protected]>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at http://curl.haxx.se/docs/copyright.html.
#
@@ -19,11 +19,11 @@
# KIND, either express or implied.
#
###########################################################################
pkginclude_HEADERS = \
curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \
- typecheck-gcc.h curlbuild.h curlrules.h
+ typecheck-gcc.h curlbuild.h curlrules.h has.h
pkgincludedir= $(includedir)/curl
# curlbuild.h does not exist in the git tree. When the original libcurl
# source code distribution archive file is created, curlbuild.h.dist is
@@ -38,16 +38,21 @@ pkgincludedir= $(includedir)/curl
# script creates curlbuild.h at library configuration time, overwiting the
# one included in the distribution archive.
#
# curlbuild.h.dist is not included in the source code distribution archive.
-EXTRA_DIST = curlbuild.h.in
+EXTRA_DIST = curlbuild.h.in has.pl
-DISTCLEANFILES = curlbuild.h
+DISTCLEANFILES = curlbuild.h has.h
+
+has.h: $(top_srcdir)/docs/libcurl/symbols-in-versions has.pl
+ @@PERL@ has.pl < $(top_srcdir)/docs/libcurl/symbols-in-versions > has.h
checksrc:
- @@PERL@ $(top_srcdir)/lib/checksrc.pl -Wcurlbuild.h -D$(top_srcdir)/include/curl $(pkginclude_HEADERS) $(EXTRA_DIST)
+ @@PERL@ $(top_srcdir)/lib/checksrc.pl -Wcurlbuild.h -D$(top_srcdir)/include/curl $(pkginclude_HEADERS) curlbuild.h.in
if CURLDEBUG
# for debug builds, we scan the sources on all regular make invokes
-all-local: checksrc
+all-local: has.h checksrc
+else
+all-local: has.h
endif
diff --git a/include/curl/has.pl b/include/curl/has.pl
new file mode 100755
index 0000000..fab6650
--- /dev/null
+++ b/include/curl/has.pl
@@ -0,0 +1,142 @@
+#!/usr/bin/perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2011-2015, Daniel Stenberg, <[email protected]>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+# Experience has shown that the symbols-in-versions file is very useful to
+# applications that want to build with a wide range of libcurl versions.
+# It is however easy to get it wrong and the source gets a bit messy with all
+# the fixed numerical comparisons.
+#
+# The point of this script is to provide an easy-to-use macro for libcurl-
+# using applications to do preprocessor checks for specific libcurl defines,
+# and yet make the code clearly show what the macro is used for.
+#
+# Run this script and generate curl/has.h and then use that header in
+# a fashion similar to:
+#
+# #include <curl/has.h>
+#
+# #if CURL_HAS(CURLOPT_MUTE)
+# has mute
+# #else
+# no mute
+# #endif
+#
+#
+
+sub str2num {
+ my ($str)=@_;
+ if($str =~ /([0-9]*)\.([0-9]*)\.*([0-9]*)/) {
+ return sprintf("0x%06x", $1<<16 | $2 << 8 | $3);
+ }
+}
+
+print <<EOS
+#ifndef __CURL_HAS_H
+#define __CURL_HAS_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \\| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \\___|\\___/|_| \\_\\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <[email protected]>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at http://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/*
+ * This file is generated. Do not edit by hand. Edit
+ * docs/libcurl/symbols-in-versions and regenerate this with has.pl
+ */
+#include <curl/curlver.h>
+
+/*
+ * #include <curl/has.h>
+ *
+ * #if CURL_HAS(CURLOPT_MUTE)
+ * use_mute();
+ * #else
+ * without_mute();
+ * #endif
+ */
+#define CURL_HAS_IN(x,y) \\
+ (defined(CURLHAS_ ## x ) && (CURLHAS_ ## x <= y) && \\
+ (!defined(CURLHAS_ ## x ## _L) || ( CURLHAS_ ## x ## _L >= y)))
+
+#define CURL_HAS(x) CURL_HAS_IN(x, LIBCURL_VERSION_NUM)
+
+EOS
+ ;
+
+while(<STDIN>) {
+ if(/^(CURL[^ ]*)[ \t]*(.*)/) {
+ my ($sym, $vers)=($1, $2);
+
+ my $intr;
+ my $rm;
+ my $dep;
+
+ # is there removed info?
+ if($vers =~ /([\d.]+)[ \t-]+([\d.-]+)[ \t]+([\d.]+)/) {
+ ($intr, $dep, $rm)=($1, $2, $3);
+ }
+ # is it a dep-only line?
+ elsif($vers =~ /([\d.]+)[ \t-]+([\d.]+)/) {
+ ($intr, $dep)=($1, $2);
+ }
+ else {
+ $intr = $vers;
+ }
+
+ my $inum = str2num($intr);
+
+ print <<EOS
+#define CURLHAS_${sym} $inum /* $intr */
+EOS
+;
+ my $irm = str2num($rm);
+ if($rm) {
+ print <<EOS
+#define CURLHAS_${sym}_L $irm /* Last $rm */
+EOS
+;
+ }
+
+ }
+}
+
+print <<EOS
+#endif /* __CURL_HAS_H */
+
+EOS
+ ;
--
2.5.1
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette: http://curl.haxx.se/mail/etiquette.html