From 6d5bd992512d601d3bb408a6bee8e98a17b1d9ec Mon Sep 17 00:00:00 2001 From: Islam Yasar Date: Fri, 14 Nov 2014 22:23:40 +0200 Subject: [PATCH 001/212] timeout added --- .DS_Store | Bin 0 -> 6148 bytes include/.DS_Store | Bin 0 -> 6148 bytes include/restclient-cpp/restclient.h | 8 ++++---- source/.DS_Store | Bin 0 -> 6148 bytes source/restclient.cpp | 29 ++++++++++++++++++++++++---- 5 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 .DS_Store create mode 100644 include/.DS_Store create mode 100644 source/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a6c1899801af48e7e674f745b7a1b1c54a046176 GIT binary patch literal 6148 zcmeHK%Wl&^6ur}?t=%9RBo=h%9W1IUg+jX{qzw@9C~68_P*mbLZ7f_*6*~=5sFWqI z?)e1-pTY-p!?%=k$D_!0%C17Fnk&tm@%Wy(zGv(i4-tuK&s!oY5s`($SeQk1j`4ji zV>Y3Cm@L#7`_!h87Ad06n78RL3K#|cHwF0HouwxAC?-j%@3$VvmK#VH_u1zm%B?eH zXc1kZHF``B=s7*28a<^A;36H6m*f2!kJC%JRf!jyH#R8;G_= zn^dPNy+o_7qMs90oaWdwh!#?d0z~wvosFe(`QS3SvF*-LH>2HYv&4&2@_T-sc9_A zQVHG~69CUGc!d{dXQ+uXzHUD{)Gxws_b~9IxLiIJ6O)Ch=^4wmi+1tqT=7k#Bm0fG z8TX=Uv-_H_UNqy5tJ_0VS zr_W!$o_znIQX|3B$aXD(QT-FGOyWn4ZWzdLAN|ZJ;0tL(#5gxKcvCY%PpNN-r!vZU zViGf+({zLpL%flax>;X-C&l~J^o<_#0vlQht9XH9nxTvWMuE$r0Iv@Y3S&j%FhR9+ zpi)NwU;*9A(B|I-<~SNF8ixtu4ooCeU_ur8h#?X>`W@|8(Kt*np_9;u51}Kg{R#fQgC%QyB$}0yzaHlj{=i|FyrL|8p#JX%sLDTqXrXVZE_lMMipW9m|dPS_kDV s3LE40xuvY3PLc!#Qj@&E{|sQXJL4{3T{F*^wdmG z*9=pO*RKKC;$w3U%mGa4j`;LpY`*V4va5<1kc*Aj&{d>TqX}8;YqD%@%0VyB_q<|DSTY)O6)0?wT(g9LH3S623{(We4$6h!j#;1cr zv;f2j!(p69FF|Y`Aoju`krA3Dm6%kk7Q>Rxc&of#I3y+=R?Uai%~l$9b)7^hdhqe9_%F4+@7U l$HXYdTzEOYjik(LKIeWf91?@hc+iRZ8E{=>QsBQ8_y!%>7Zm^i literal 0 HcmV?d00001 diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index 9cb77b69..d8576ce4 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -43,15 +43,15 @@ class RestClient static void clearAuth(); static void setAuth(const std::string& user,const std::string& password); // HTTP GET - static response get(const std::string& url); + static response get(const std::string& url, size_t timeout); // HTTP POST static response post(const std::string& url, const std::string& ctype, - const std::string& data); + const std::string& data, size_t timeout); // HTTP PUT static response put(const std::string& url, const std::string& ctype, - const std::string& data); + const std::string& data, size_t timeout); // HTTP DELETE - static response del(const std::string& url); + static response del(const std::string& url, size_t timeout); private: // writedata callback function diff --git a/source/.DS_Store b/source/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f9cbac553f8c7d4eb393a5feaf09d5615cc839e5 GIT binary patch literal 6148 zcmeHKJxc>o5S-N%0U@Nce5IA(KR7}Zto;L$XdxUX_|adNpB-mEl!Vj5#zJOcckb=& z+`F6N?JWRXygyt4a{yDiBX%Cf=J(x4c2XH5()o-vdOYC~&v+YEf1hyf3@_xol5@zv z%=Ko`oR#HF;{3``)vb Date: Sun, 16 Nov 2014 16:17:32 +0200 Subject: [PATCH 002/212] condition for timeout added --- source/restclient.cpp | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/source/restclient.cpp b/source/restclient.cpp index fbfb77e0..7e4d57f7 100644 --- a/source/restclient.cpp +++ b/source/restclient.cpp @@ -33,7 +33,7 @@ void RestClient::setAuth(const std::string& user,const std::string& password){ * * @return response struct */ -RestClient::response RestClient::get(const std::string& url, size_t timeout) +RestClient::response RestClient::get(const std::string& url, size_t timeout = 0) { /** create return struct */ RestClient::response ret = {}; @@ -65,8 +65,10 @@ RestClient::response RestClient::get(const std::string& url, size_t timeout) /** perform the actual query */ //set timeout - curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // dont want to get a sig alarm on timeout + if (timeout) { + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // dont want to get a sig alarm on timeout + } res = curl_easy_perform(curl); if (res != CURLE_OK) @@ -97,7 +99,7 @@ RestClient::response RestClient::get(const std::string& url, size_t timeout) RestClient::response RestClient::post(const std::string& url, const std::string& ctype, const std::string& data, - const size_t timeout) + const size_t timeout = 0) { /** create return struct */ RestClient::response ret = {}; @@ -139,8 +141,10 @@ RestClient::response RestClient::post(const std::string& url, curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header); //set timeout - curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // dont want to get a sig alarm on timeout + if (timeout) { + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // dont want to get a sig alarm on timeout + } /** perform the actual query */ res = curl_easy_perform(curl); @@ -172,7 +176,7 @@ RestClient::response RestClient::post(const std::string& url, */ RestClient::response RestClient::put(const std::string& url, const std::string& ctype, - const std::string& data, size_t timeout) + const std::string& data, size_t timeout = 0) { /** create return struct */ RestClient::response ret = {}; @@ -225,8 +229,10 @@ RestClient::response RestClient::put(const std::string& url, curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header); //set timeout - curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // dont want to get a sig alarm on timeout + if (timeout) { + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // dont want to get a sig alarm on timeout + } /** perform the actual query */ res = curl_easy_perform(curl); @@ -254,7 +260,7 @@ RestClient::response RestClient::put(const std::string& url, * * @return response struct */ -RestClient::response RestClient::del(const std::string& url, size_t timeout) +RestClient::response RestClient::del(const std::string& url, size_t timeout = 0) { /** create return struct */ RestClient::response ret = {}; @@ -290,8 +296,10 @@ RestClient::response RestClient::del(const std::string& url, size_t timeout) curl_easy_setopt(curl, CURLOPT_HEADERDATA, &ret); //set timeout - curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // dont want to get a sig alarm on timeout + if (timeout) { + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // dont want to get a sig alarm on timeout + } /** perform the actual query */ res = curl_easy_perform(curl); From 1cdbb2e52eb8641763330db085a78733f80d21fd Mon Sep 17 00:00:00 2001 From: Jos Date: Tue, 24 Feb 2015 16:44:33 +0800 Subject: [PATCH 003/212] move two include instructions --- include/restclient-cpp/restclient.h | 2 -- source/restclient.cpp | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index 9cb77b69..59c1258c 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -9,11 +9,9 @@ #ifndef INCLUDE_RESTCLIENT_H_ #define INCLUDE_RESTCLIENT_H_ -#include #include #include #include -#include "meta.h" #include class RestClient diff --git a/source/restclient.cpp b/source/restclient.cpp index 1020ede6..f2efd4c6 100644 --- a/source/restclient.cpp +++ b/source/restclient.cpp @@ -8,7 +8,9 @@ INCLUDES ========================*/ #include "restclient-cpp/restclient.h" +#include "restclient-cpp/meta.h" +#include #include #include #include From 504f6fcbd929a47589ecd0164dd5d1192d5e9233 Mon Sep 17 00:00:00 2001 From: Jos Date: Tue, 24 Feb 2015 19:49:29 +0800 Subject: [PATCH 004/212] change test url --- test/test_restclient_delete.cpp | 2 +- test/test_restclient_get.cpp | 2 +- test/test_restclient_post.cpp | 2 +- test/test_restclient_put.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/test_restclient_delete.cpp b/test/test_restclient_delete.cpp index aab2a82b..ad39357f 100644 --- a/test/test_restclient_delete.cpp +++ b/test/test_restclient_delete.cpp @@ -19,7 +19,7 @@ class RestClientDeleteTest : public ::testing::Test virtual void SetUp() { - url = "http://http-test-server.heroku.com"; + url = "http://http-test-server.herokuapp.com"; ctype = ""; data = ""; } diff --git a/test/test_restclient_get.cpp b/test/test_restclient_get.cpp index e030067b..b39eb942 100644 --- a/test/test_restclient_get.cpp +++ b/test/test_restclient_get.cpp @@ -19,7 +19,7 @@ class RestClientGetTest : public ::testing::Test virtual void SetUp() { - url = "http://http-test-server.heroku.com"; + url = "http://http-test-server.herokuapp.com"; ctype = ""; data = ""; } diff --git a/test/test_restclient_post.cpp b/test/test_restclient_post.cpp index 59d3a139..ff18be19 100644 --- a/test/test_restclient_post.cpp +++ b/test/test_restclient_post.cpp @@ -19,7 +19,7 @@ class RestClientPostTest : public ::testing::Test virtual void SetUp() { - url = "http://http-test-server.heroku.com"; + url = "http://http-test-server.herokuapp.com"; ctype = "Content-Type: text/text"; data = "data"; } diff --git a/test/test_restclient_put.cpp b/test/test_restclient_put.cpp index 0db4ff2c..e320b2d7 100644 --- a/test/test_restclient_put.cpp +++ b/test/test_restclient_put.cpp @@ -19,7 +19,7 @@ class RestClientPutTest : public ::testing::Test virtual void SetUp() { - url = "http://http-test-server.heroku.com"; + url = "http://http-test-server.herokuapp.com"; ctype = "Content-Type: text/text"; data = "data"; } From 5ace4a1ec065d9b522de398d3d618f580b16e6c9 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 9 Aug 2015 17:38:41 -0400 Subject: [PATCH 005/212] run tests against http://httpbin.org this makes the tests run against http://httpbin.org instead of my homegrown sinatra app. This is better for a couple of reasons: - httpbin supports more features so it can be used for future development as well - it actually works and I don't have to maintain it - Python's wonderful requests library also uses it so we know it's good There is however a downside to it. As the test suite right now doesn't support JSON parsing, I had to remove some unit tests until I add that. I think that's still fine, but I opened issue #23 to address this. This fixes #12 --- README.md | 8 -------- test/test_restclient_delete.cpp | 7 +------ test/test_restclient_get.cpp | 7 +------ test/test_restclient_post.cpp | 21 +-------------------- test/test_restclient_put.cpp | 19 +------------------ test/test_server.rb | 17 ----------------- 6 files changed, 4 insertions(+), 75 deletions(-) delete mode 100644 test/test_server.rb diff --git a/README.md b/README.md index 19517871..5665a49c 100644 --- a/README.md +++ b/README.md @@ -43,14 +43,6 @@ make install - [Issues][] - [Tracker][] -## Contribute -- Fork the project. -- Make your feature addition or bug fix. -- Add tests for it. This is important so I don't break it in a future version - unintentionally. -- Commit, do not mess with version -- Send me a pull request. Bonus points for topic branches. - [libcurl]: http://curl.haxx.se/libcurl/ [ruby rest-client]: http://github.com/archiloque/rest-client diff --git a/test/test_restclient_delete.cpp b/test/test_restclient_delete.cpp index ad39357f..b96eab98 100644 --- a/test/test_restclient_delete.cpp +++ b/test/test_restclient_delete.cpp @@ -19,7 +19,7 @@ class RestClientDeleteTest : public ::testing::Test virtual void SetUp() { - url = "http://http-test-server.herokuapp.com"; + url = "http://httpbin.org/delete"; ctype = ""; data = ""; } @@ -31,11 +31,6 @@ class RestClientDeleteTest : public ::testing::Test }; // Tests -TEST_F(RestClientDeleteTest, TestRestClientDeleteBody) -{ - RestClient::response res = RestClient::del(url); - EXPECT_EQ("DELETE", res.body); -} // check return code TEST_F(RestClientDeleteTest, TestRestClientDeleteCode) { diff --git a/test/test_restclient_get.cpp b/test/test_restclient_get.cpp index b39eb942..94101859 100644 --- a/test/test_restclient_get.cpp +++ b/test/test_restclient_get.cpp @@ -19,7 +19,7 @@ class RestClientGetTest : public ::testing::Test virtual void SetUp() { - url = "http://http-test-server.herokuapp.com"; + url = "http://httpbin.org/get"; ctype = ""; data = ""; } @@ -31,11 +31,6 @@ class RestClientGetTest : public ::testing::Test }; // Tests -TEST_F(RestClientGetTest, TestRestClientGETBody) -{ - RestClient::response res = RestClient::get(url); - EXPECT_EQ("GET", res.body); -} // check return code TEST_F(RestClientGetTest, TestRestClientGETCode) { diff --git a/test/test_restclient_post.cpp b/test/test_restclient_post.cpp index ff18be19..f7da3104 100644 --- a/test/test_restclient_post.cpp +++ b/test/test_restclient_post.cpp @@ -19,7 +19,7 @@ class RestClientPostTest : public ::testing::Test virtual void SetUp() { - url = "http://http-test-server.herokuapp.com"; + url = "http://httpbin.org/post"; ctype = "Content-Type: text/text"; data = "data"; } @@ -31,31 +31,12 @@ class RestClientPostTest : public ::testing::Test }; // Tests -TEST_F(RestClientPostTest, TestRestClientPOSTSimple) -{ - RestClient::response res = RestClient::post(url, ctype, data); - EXPECT_EQ("POST", res.body); -} // check return code TEST_F(RestClientPostTest, TestRestClientPOSTCode) { RestClient::response res = RestClient::post(url, ctype, data); EXPECT_EQ(200, res.code); } -// check content type -TEST_F(RestClientPostTest, TestRestClientPOSTContentType) -{ - RestClient::response res = RestClient::post(url+"/contenttype", - ctype, data); - EXPECT_EQ(ctype, res.body); -} -// check response body -TEST_F(RestClientPostTest, TestRestClientPOSTBody) -{ - RestClient::response res = RestClient::post(url+"/body", - ctype, data); - EXPECT_EQ(data, res.body); -} // check for failure TEST_F(RestClientPostTest, TestRestClientFailureCode) { diff --git a/test/test_restclient_put.cpp b/test/test_restclient_put.cpp index e320b2d7..34fae336 100644 --- a/test/test_restclient_put.cpp +++ b/test/test_restclient_put.cpp @@ -19,7 +19,7 @@ class RestClientPutTest : public ::testing::Test virtual void SetUp() { - url = "http://http-test-server.herokuapp.com"; + url = "http://httpbin.org/put"; ctype = "Content-Type: text/text"; data = "data"; } @@ -31,29 +31,12 @@ class RestClientPutTest : public ::testing::Test }; // Tests -TEST_F(RestClientPutTest, TestRestClientPUTSimple) -{ - RestClient::response res = RestClient::put(url, ctype, data); - EXPECT_EQ("PUT", res.body); -} // check return code TEST_F(RestClientPutTest, TestRestClientPUTCode) { RestClient::response res = RestClient::put(url, ctype, data); EXPECT_EQ(200, res.code); } -// check content type -TEST_F(RestClientPutTest, TestRestClientPUTContentType) -{ - RestClient::response res = RestClient::put(url+"/contenttype", ctype, data); - EXPECT_EQ(ctype, res.body); -} -// check response body -TEST_F(RestClientPutTest, TestRestClientPUTBody) -{ - RestClient::response res = RestClient::put(url+"/body", ctype, data); - EXPECT_EQ(data, res.body); -} // check for failure TEST_F(RestClientPutTest, TestRestClientFailureCode) { diff --git a/test/test_server.rb b/test/test_server.rb deleted file mode 100644 index 9277c56c..00000000 --- a/test/test_server.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'rubygems' -require 'sinatra' -get '/?' do - "GET succesful." -end - -post '/?' do - request.body() -end - -put '/?' do - request.body() -end - -delete '/?' do - "DELETE succesful." -end From 5eb103512ef58a046c794e8ac9e417976bc46617 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 9 Aug 2015 17:47:37 -0400 Subject: [PATCH 006/212] update README this removes the unneeded "Development" section. It's pretty clear that issues should be in the github issues section and I haven't used pivotal tracker in years. --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index 5665a49c..298dbe92 100644 --- a/README.md +++ b/README.md @@ -39,14 +39,7 @@ make install ``` -## Development -- [Issues][] -- [Tracker][] - - [libcurl]: http://curl.haxx.se/libcurl/ [ruby rest-client]: http://github.com/archiloque/rest-client [gtest]: http://code.google.com/p/googletest/ -[Issues]: https://github.com/mrtazz/restclient-cpp/issues -[Tracker]: https://www.pivotaltracker.com/projects/255177/stories [packagecloud]: https://packagecloud.io/mrtazz/restclient-cpp From 516af2e716b815a3c8c53a152973d2d6b7754c23 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 9 Aug 2015 17:50:34 -0400 Subject: [PATCH 007/212] don't run tests on travis legacy anymore see: http://docs.travis-ci.com/user/migrating-from-legacy --- .travis.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b790b6d9..f87f7034 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,5 +2,10 @@ language: cpp # command to install dependencies script: ./autogen.sh && ./configure && make check && ./test-program before_script: - - sudo apt-get install libcurl4-openssl-dev build-essential - ./utils/build_gtest.sh +sudo: false +addons: + apt: + packages: + - build-essential + - libcurl4-openssl-dev From 11b38539b873124b09784ec3de270d9d5e70d1f9 Mon Sep 17 00:00:00 2001 From: Islam Yasar Date: Mon, 10 Aug 2015 15:13:01 +0300 Subject: [PATCH 008/212] DS_Store files deleted, test scenarious pass --- .DS_Store | Bin 6148 -> 0 bytes include/.DS_Store | Bin 6148 -> 0 bytes include/restclient-cpp/restclient.h | 8 ++++---- source/.DS_Store | Bin 6148 -> 0 bytes 4 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 .DS_Store delete mode 100644 include/.DS_Store delete mode 100644 source/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index a6c1899801af48e7e674f745b7a1b1c54a046176..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%Wl&^6ur}?t=%9RBo=h%9W1IUg+jX{qzw@9C~68_P*mbLZ7f_*6*~=5sFWqI z?)e1-pTY-p!?%=k$D_!0%C17Fnk&tm@%Wy(zGv(i4-tuK&s!oY5s`($SeQk1j`4ji zV>Y3Cm@L#7`_!h87Ad06n78RL3K#|cHwF0HouwxAC?-j%@3$VvmK#VH_u1zm%B?eH zXc1kZHF``B=s7*28a<^A;36H6m*f2!kJC%JRf!jyH#R8;G_= zn^dPNy+o_7qMs90oaWdwh!#?d0z~wvosFe(`QS3SvF*-LH>2HYv&4&2@_T-sc9_A zQVHG~69CUGc!d{dXQ+uXzHUD{)Gxws_b~9IxLiIJ6O)Ch=^4wmi+1tqT=7k#Bm0fG z8TX=Uv-_H_UNqy5tJ_0VS zr_W!$o_znIQX|3B$aXD(QT-FGOyWn4ZWzdLAN|ZJ;0tL(#5gxKcvCY%PpNN-r!vZU zViGf+({zLpL%flax>;X-C&l~J^o<_#0vlQht9XH9nxTvWMuE$r0Iv@Y3S&j%FhR9+ zpi)NwU;*9A(B|I-<~SNF8ixtu4ooCeU_ur8h#?X>`W@|8(Kt*np_9;u51}Kg{R#fQgC%QyB$}0yzaHlj{=i|FyrL|8p#JX%sLDTqXrXVZE_lMMipW9m|dPS_kDV s3LE40xuvY3PLc!#Qj@&E{|sQXJL4{3T{F*^wdmG z*9=pO*RKKC;$w3U%mGa4j`;LpY`*V4va5<1kc*Aj&{d>TqX}8;YqD%@%0VyB_q<|DSTY)O6)0?wT(g9LH3S623{(We4$6h!j#;1cr zv;f2j!(p69FF|Y`Aoju`krA3Dm6%kk7Q>Rxc&of#I3y+=R?Uai%~l$9b)7^hdhqe9_%F4+@7U l$HXYdTzEOYjik(LKIeWf91?@hc+iRZ8E{=>QsBQ8_y!%>7Zm^i diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index d8576ce4..0d70beee 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -43,15 +43,15 @@ class RestClient static void clearAuth(); static void setAuth(const std::string& user,const std::string& password); // HTTP GET - static response get(const std::string& url, size_t timeout); + static response get(const std::string& url, size_t timeout = 0); // HTTP POST static response post(const std::string& url, const std::string& ctype, - const std::string& data, size_t timeout); + const std::string& data, size_t timeout = 0); // HTTP PUT static response put(const std::string& url, const std::string& ctype, - const std::string& data, size_t timeout); + const std::string& data, size_t timeout = 0); // HTTP DELETE - static response del(const std::string& url, size_t timeout); + static response del(const std::string& url, size_t timeout = 0); private: // writedata callback function diff --git a/source/.DS_Store b/source/.DS_Store deleted file mode 100644 index f9cbac553f8c7d4eb393a5feaf09d5615cc839e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKJxc>o5S-N%0U@Nce5IA(KR7}Zto;L$XdxUX_|adNpB-mEl!Vj5#zJOcckb=& z+`F6N?JWRXygyt4a{yDiBX%Cf=J(x4c2XH5()o-vdOYC~&v+YEf1hyf3@_xol5@zv z%=Ko`oR#HF;{3``)vb Date: Mon, 10 Aug 2015 15:21:01 +0300 Subject: [PATCH 009/212] default parameter compile issue --- source/restclient.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/restclient.cpp b/source/restclient.cpp index 7e4d57f7..94297f4b 100644 --- a/source/restclient.cpp +++ b/source/restclient.cpp @@ -33,7 +33,7 @@ void RestClient::setAuth(const std::string& user,const std::string& password){ * * @return response struct */ -RestClient::response RestClient::get(const std::string& url, size_t timeout = 0) +RestClient::response RestClient::get(const std::string& url, size_t timeout) { /** create return struct */ RestClient::response ret = {}; @@ -99,7 +99,7 @@ RestClient::response RestClient::get(const std::string& url, size_t timeout = 0) RestClient::response RestClient::post(const std::string& url, const std::string& ctype, const std::string& data, - const size_t timeout = 0) + const size_t timeout) { /** create return struct */ RestClient::response ret = {}; @@ -176,7 +176,7 @@ RestClient::response RestClient::post(const std::string& url, */ RestClient::response RestClient::put(const std::string& url, const std::string& ctype, - const std::string& data, size_t timeout = 0) + const std::string& data, size_t timeout) { /** create return struct */ RestClient::response ret = {}; @@ -260,7 +260,7 @@ RestClient::response RestClient::put(const std::string& url, * * @return response struct */ -RestClient::response RestClient::del(const std::string& url, size_t timeout = 0) +RestClient::response RestClient::del(const std::string& url, size_t timeout) { /** create return struct */ RestClient::response ret = {}; From c7417104829e8bd741a3a12ff36378ea3c71a866 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 10 Aug 2015 11:46:44 -0400 Subject: [PATCH 010/212] update CONTRIBUTING --- CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 376c4355..e5c155da 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,4 +4,5 @@ - Add tests for it. This is important so I don't break it in a future version unintentionally. - Commit, do not mess with version +- If you add functionality, document it in the README - Send me a pull request. Bonus points for topic branches. From 8e8c164f41af460d87e9c674c974ad8ae9ca34c4 Mon Sep 17 00:00:00 2001 From: Islam Yasar Date: Thu, 13 Aug 2015 12:44:59 +0300 Subject: [PATCH 011/212] test-1 --- test/test_restclient_delete.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/test_restclient_delete.cpp b/test/test_restclient_delete.cpp index aab2a82b..33fcc804 100644 --- a/test/test_restclient_delete.cpp +++ b/test/test_restclient_delete.cpp @@ -54,3 +54,11 @@ TEST_F(RestClientDeleteTest, TestRestClientDeleteHeaders) RestClient::response res = RestClient::del(url); EXPECT_EQ("keep-alive", res.headers["Connection"]); } + +TEST_F(RestClientDeleteTest, TestRestClientDeleteTimeout) +{ + std::string u = "http://httpbin.org/delay/10"; + RestClient::response res = RestClient::del(u, 5); + EXPECT_EQ(28, res.code); +} + From 75268410042e810f1f71ef9c9170f770354d738b Mon Sep 17 00:00:00 2001 From: Islam Yasar Date: Thu, 13 Aug 2015 17:31:11 +0300 Subject: [PATCH 012/212] timeout tests --- include/restclient-cpp/restclient.h | 8 ++++---- source/restclient.cpp | 30 ++++++++++++++++++++++++++--- test/test_restclient_get.cpp | 8 ++++++++ test/test_restclient_post.cpp | 8 ++++++++ test/test_restclient_put.cpp | 7 +++++++ 5 files changed, 54 insertions(+), 7 deletions(-) diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index 0d70beee..97ea01d7 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -43,15 +43,15 @@ class RestClient static void clearAuth(); static void setAuth(const std::string& user,const std::string& password); // HTTP GET - static response get(const std::string& url, size_t timeout = 0); + static response get(const std::string& url, const size_t timeout = 0); // HTTP POST static response post(const std::string& url, const std::string& ctype, - const std::string& data, size_t timeout = 0); + const std::string& data, const size_t timeout = 0); // HTTP PUT static response put(const std::string& url, const std::string& ctype, - const std::string& data, size_t timeout = 0); + const std::string& data, const size_t timeout = 0); // HTTP DELETE - static response del(const std::string& url, size_t timeout = 0); + static response del(const std::string& url, const size_t timeout = 0); private: // writedata callback function diff --git a/source/restclient.cpp b/source/restclient.cpp index 94297f4b..3bb15f5d 100644 --- a/source/restclient.cpp +++ b/source/restclient.cpp @@ -33,7 +33,7 @@ void RestClient::setAuth(const std::string& user,const std::string& password){ * * @return response struct */ -RestClient::response RestClient::get(const std::string& url, size_t timeout) +RestClient::response RestClient::get(const std::string& url, const size_t timeout) { /** create return struct */ RestClient::response ret = {}; @@ -73,6 +73,12 @@ RestClient::response RestClient::get(const std::string& url, size_t timeout) res = curl_easy_perform(curl); if (res != CURLE_OK) { + if (res == CURLE_OPERATION_TIMEDOUT) { + ret.code = res; + ret.body = "Operation Timeout."; + return ret; + } + ret.body = "Failed to query."; ret.code = -1; return ret; @@ -150,6 +156,12 @@ RestClient::response RestClient::post(const std::string& url, res = curl_easy_perform(curl); if (res != CURLE_OK) { + if (res == CURLE_OPERATION_TIMEDOUT) { + ret.code = res; + ret.body = "Operation Timeout."; + return ret; + } + ret.body = "Failed to query."; ret.code = -1; return ret; @@ -176,7 +188,7 @@ RestClient::response RestClient::post(const std::string& url, */ RestClient::response RestClient::put(const std::string& url, const std::string& ctype, - const std::string& data, size_t timeout) + const std::string& data, const size_t timeout) { /** create return struct */ RestClient::response ret = {}; @@ -238,6 +250,12 @@ RestClient::response RestClient::put(const std::string& url, res = curl_easy_perform(curl); if (res != CURLE_OK) { + if (res == CURLE_OPERATION_TIMEDOUT) { + ret.code = res; + ret.body = "Operation Timeout."; + return ret; + } + ret.body = "Failed to query."; ret.code = -1; return ret; @@ -260,7 +278,7 @@ RestClient::response RestClient::put(const std::string& url, * * @return response struct */ -RestClient::response RestClient::del(const std::string& url, size_t timeout) +RestClient::response RestClient::del(const std::string& url, const size_t timeout) { /** create return struct */ RestClient::response ret = {}; @@ -305,6 +323,12 @@ RestClient::response RestClient::del(const std::string& url, size_t timeout) res = curl_easy_perform(curl); if (res != CURLE_OK) { + if (res == CURLE_OPERATION_TIMEDOUT) { + ret.code = res; + ret.body = "Operation Timeout."; + return ret; + } + ret.body = "Failed to query."; ret.code = -1; return ret; diff --git a/test/test_restclient_get.cpp b/test/test_restclient_get.cpp index e030067b..96b72f0c 100644 --- a/test/test_restclient_get.cpp +++ b/test/test_restclient_get.cpp @@ -56,3 +56,11 @@ TEST_F(RestClientGetTest, TestRestClientGETHeaders) EXPECT_EQ("keep-alive", res.headers["Connection"]); } +TEST_F(RestClientGetTest, TestRestClientGETTimeout) +{ + std::string u = "http://httpbin.org/delay/10"; + RestClient::response res = RestClient::get(u, 5); + EXPECT_EQ(28, res.code); +} + + diff --git a/test/test_restclient_post.cpp b/test/test_restclient_post.cpp index 59d3a139..421b6f7d 100644 --- a/test/test_restclient_post.cpp +++ b/test/test_restclient_post.cpp @@ -68,3 +68,11 @@ TEST_F(RestClientPostTest, TestRestClientPOSTHeaders) RestClient::response res = RestClient::post(url, ctype, data); EXPECT_EQ("keep-alive", res.headers["Connection"]); } + +TEST_F(RestClientPostTest, TestRestClientPOSTTimeout) +{ + std::string u = "http://httpbin.org/delay/10"; + RestClient::response res = RestClient::post(u, ctype, data, 5); + EXPECT_EQ(28, res.code); +} + diff --git a/test/test_restclient_put.cpp b/test/test_restclient_put.cpp index 0db4ff2c..252fe8d7 100644 --- a/test/test_restclient_put.cpp +++ b/test/test_restclient_put.cpp @@ -66,3 +66,10 @@ TEST_F(RestClientPutTest, TestRestClientPUTHeaders) RestClient::response res = RestClient::put(url, ctype, data); EXPECT_EQ("keep-alive", res.headers["Connection"]); } + +TEST_F(RestClientPutTest, TestRestClientPUTTimeout) +{ + std::string u = "http://httpbin.org/delay/10"; + RestClient::response res = RestClient::put(u, ctype, data, 5); + EXPECT_EQ(28, res.code); +} From 8b0a55d6c24c9b984974535e7a441adb89bd21fb Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 14 Aug 2015 00:30:32 -0400 Subject: [PATCH 013/212] remove old vendorized gtest --- vendor/gtest-1.6.0/autom4te.cache/output.0 | 18355 ------------------ vendor/gtest-1.6.0/autom4te.cache/output.1 | 18370 ------------------- vendor/gtest-1.6.0/autom4te.cache/output.2 | 18370 ------------------- vendor/gtest-1.6.0/autom4te.cache/requests | 527 - vendor/gtest-1.6.0/autom4te.cache/traces.0 | 3189 ---- vendor/gtest-1.6.0/autom4te.cache/traces.1 | 662 - vendor/gtest-1.6.0/autom4te.cache/traces.2 | 3187 ---- vendor/gtest-1.6.0/build-aux/compile | 347 - vendor/gtest-1.6.0/build-aux/test-driver | 139 - 9 files changed, 63146 deletions(-) delete mode 100644 vendor/gtest-1.6.0/autom4te.cache/output.0 delete mode 100644 vendor/gtest-1.6.0/autom4te.cache/output.1 delete mode 100644 vendor/gtest-1.6.0/autom4te.cache/output.2 delete mode 100644 vendor/gtest-1.6.0/autom4te.cache/requests delete mode 100644 vendor/gtest-1.6.0/autom4te.cache/traces.0 delete mode 100644 vendor/gtest-1.6.0/autom4te.cache/traces.1 delete mode 100644 vendor/gtest-1.6.0/autom4te.cache/traces.2 delete mode 100755 vendor/gtest-1.6.0/build-aux/compile delete mode 100755 vendor/gtest-1.6.0/build-aux/test-driver diff --git a/vendor/gtest-1.6.0/autom4te.cache/output.0 b/vendor/gtest-1.6.0/autom4te.cache/output.0 deleted file mode 100644 index 734cb8e9..00000000 --- a/vendor/gtest-1.6.0/autom4te.cache/output.0 +++ /dev/null @@ -1,18355 +0,0 @@ -@%:@! /bin/sh -@%:@ Guess values for system-dependent variables and create Makefiles. -@%:@ Generated by GNU Autoconf 2.69 for Google C++ Testing Framework 1.6.0. -@%:@ -@%:@ Report bugs to . -@%:@ -@%:@ -@%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -@%:@ -@%:@ -@%:@ This configure script is free software; the Free Software Foundation -@%:@ gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in @%:@( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in @%:@(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in @%:@ (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 - - test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in @%:@( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in @%:@ (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: googletestframework@googlegroups.com about your system, -$0: including any error possibly output before this -$0: message. Then install a modern shell, or manually run -$0: the script under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -@%:@ as_fn_unset VAR -@%:@ --------------- -@%:@ Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -@%:@ as_fn_set_status STATUS -@%:@ ----------------------- -@%:@ Set @S|@? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} @%:@ as_fn_set_status - -@%:@ as_fn_exit STATUS -@%:@ ----------------- -@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} @%:@ as_fn_exit - -@%:@ as_fn_mkdir_p -@%:@ ------------- -@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} @%:@ as_fn_mkdir_p - -@%:@ as_fn_executable_p FILE -@%:@ ----------------------- -@%:@ Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} @%:@ as_fn_executable_p -@%:@ as_fn_append VAR VALUE -@%:@ ---------------------- -@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take -@%:@ advantage of any shell optimizations that allow amortized linear growth over -@%:@ repeated appends, instead of the typical quadratic growth present in naive -@%:@ implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -@%:@ as_fn_arith ARG... -@%:@ ------------------ -@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the -@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments -@%:@ must be portable across @S|@(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] -@%:@ ---------------------------------------- -@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are -@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the -@%:@ script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} @%:@ as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -SHELL=${CONFIG_SHELL-/bin/sh} - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIB@&t@OBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='Google C++ Testing Framework' -PACKAGE_TARNAME='gtest' -PACKAGE_VERSION='1.6.0' -PACKAGE_STRING='Google C++ Testing Framework 1.6.0' -PACKAGE_BUGREPORT='googletestframework@googlegroups.com' -PACKAGE_URL='' - -ac_unique_file="./COPYING" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='am__EXEEXT_FALSE -am__EXEEXT_TRUE -LTLIBOBJS -LIB@&t@OBJS -HAVE_PTHREADS_FALSE -HAVE_PTHREADS_TRUE -PTHREAD_CFLAGS -PTHREAD_LIBS -PTHREAD_CC -acx_pthread_config -HAVE_PYTHON_FALSE -HAVE_PYTHON_TRUE -PYTHON -CXXCPP -CPP -OTOOL64 -OTOOL -LIPO -NMEDIT -DSYMUTIL -MANIFEST_TOOL -RANLIB -ac_ct_AR -AR -DLLTOOL -OBJDUMP -LN_S -NM -ac_ct_DUMPBIN -DUMPBIN -LD -FGREP -EGREP -GREP -SED -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -LIBTOOL -am__fastdepCXX_FALSE -am__fastdepCXX_TRUE -CXXDEPMODE -ac_ct_CXX -CXXFLAGS -CXX -am__fastdepCC_FALSE -am__fastdepCC_TRUE -CCDEPMODE -am__nodep -AMDEPBACKSLASH -AMDEP_FALSE -AMDEP_TRUE -am__quote -am__include -DEPDIR -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -AM_BACKSLASH -AM_DEFAULT_VERBOSITY -AM_DEFAULT_V -AM_V -am__untar -am__tar -AMTAR -am__leading_dot -SET_MAKE -AWK -mkdir_p -MKDIR_P -INSTALL_STRIP_PROGRAM -STRIP -install_sh -MAKEINFO -AUTOHEADER -AUTOMAKE -AUTOCONF -ACLOCAL -VERSION -PACKAGE -CYGPATH_W -am__isrc -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_silent_rules -enable_dependency_tracking -enable_shared -enable_static -with_pic -enable_fast_install -with_gnu_ld -with_sysroot -enable_libtool_lock -with_pthreads -' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CXX -CXXFLAGS -CCC -CPP -CXXCPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures Google C++ Testing Framework 1.6.0 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - @<:@@S|@ac_default_prefix@:>@ - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - @<:@PREFIX@:>@ - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gtest@:>@ - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of Google C++ Testing Framework 1.6.0:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-silent-rules less verbose build output (undo: "make V=1") - --disable-silent-rules verbose build output (undo: "make V=0") - --enable-dependency-tracking - do not reject slow dependency extractors - --disable-dependency-tracking - speeds up one-time build - --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ - --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ - --enable-fast-install@<:@=PKGS@:>@ - optimize for fast installation @<:@default=yes@:>@ - --disable-libtool-lock avoid locking (might break parallel builds) - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-pic try to use only PIC/non-PIC objects @<:@default=use - both@:>@ - --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ - --with-sysroot=DIR Search for dependent libraries within DIR - (or the compiler's sysroot if not specified). - --with-pthreads use pthreads (default is yes) - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CPP C preprocessor - CXXCPP C++ preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -Google C++ Testing Framework configure 1.6.0 -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -@%:@ ac_fn_c_try_compile LINENO -@%:@ -------------------------- -@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_compile - -@%:@ ac_fn_cxx_try_compile LINENO -@%:@ ---------------------------- -@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_compile - -@%:@ ac_fn_c_try_link LINENO -@%:@ ----------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_link - -@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -@%:@ ------------------------------------------------------- -@%:@ Tests whether HEADER exists and can be compiled using the include files in -@%:@ INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -@%:@include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_header_compile - -@%:@ ac_fn_c_try_cpp LINENO -@%:@ ---------------------- -@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_cpp - -@%:@ ac_fn_c_try_run LINENO -@%:@ ---------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes -@%:@ that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_run - -@%:@ ac_fn_c_check_func LINENO FUNC VAR -@%:@ ---------------------------------- -@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_func - -@%:@ ac_fn_cxx_try_cpp LINENO -@%:@ ------------------------ -@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_cpp - -@%:@ ac_fn_cxx_try_link LINENO -@%:@ ------------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_link -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by Google C++ Testing Framework $as_me 1.6.0, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in @%:@(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -# Provide various options to initialize the Autoconf and configure processes. - - - -ac_aux_dir= -for ac_dir in build-aux "$srcdir"/build-aux; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -ac_config_headers="$ac_config_headers build-aux/config.h" - -ac_config_files="$ac_config_files Makefile" - -ac_config_files="$ac_config_files scripts/gtest-config" - - -# Initialize Automake with various options. We require at least v1.9, prevent -# pedantic complaints about package files, and enable various distribution -# targets. -am__api_version='1.14' - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in @%:@(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; -esac - -# Do 'set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken - alias in your environment" "$LINENO" 5 - fi - if test "$2" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi - -rm -f conftest.file - -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} -fi - -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi - -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS - -fi - - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -@%:@ Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : - enableval=$enable_silent_rules; -fi - -case $enable_silent_rules in @%:@ ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=1;; -esac -am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AM_BACKSLASH='\' - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE='gtest' - VERSION='1.6.0' - - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -@%:@define VERSION "$VERSION" -_ACEOF - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -mkdir_p='$(MKDIR_P)' - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' - - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar pax cpio none' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' - - - - - - -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. - -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . - -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. - -END - as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 - fi -fi - -# Check for programs used in building Google Test. -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $@%:@ != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 - ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -@%:@ Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -depcc="$CXX" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.2.6b' -macro_revision='1.3017' - - - - - - - - - - - - - -ltmain="$ac_aux_dir/ltmain.sh" - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} - -case "$ECHO" in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; -esac - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_SED" || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_FGREP" || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -@%:@ Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DUMPBIN" && break - done -fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DUMPBIN=$ac_ct_DUMPBIN - fi -fi - - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac - -fi - -if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - - - - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } - - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac - -fi - -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac - -fi - -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then - reload_cmds=false - fi - ;; - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - - - - - - - - - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - - - - - - - - -if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AR" && break - done -fi -if test -z "$AR"; then - ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_AR" && break -done - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -fi - -: ${AR=ar} -: ${AR_FLAGS=cru} - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ar_at_file=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT@&t@_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT@&t@_DLSYM_CONST -#else -# define LT@&t@_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT@&t@_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done - -fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } - -@%:@ Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : - withval=$with_sysroot; -else - with_sysroot=no -fi - - -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 -$as_echo "${with_sysroot}" >&6; } - as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 - ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } - - - - - - -@%:@ Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : - enableval=$enable_libtool_lock; -fi - -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - lt_cv_cc_needs_belf=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL - fi -else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" -fi - -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi - - - - - - - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&5 - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&5 - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -@%:@define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - -func_stripname_cnf () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname_cnf - - - - - -# Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - - - @%:@ Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=yes -fi - - - - - - - - - - @%:@ Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_static=yes -fi - - - - - - - - - - -@%:@ Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : - withval=$with_pic; pic_mode="$withval" -else - pic_mode=default -fi - - -test -z "$pic_mode" && pic_mode=default - - - - - - - - @%:@ Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_fast_install=yes -fi - - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -@%:@define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -lt_save_CC="$CC" -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then - -lt_prog_compiler_no_builtin_flag= - -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } - -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : -fi - -fi - - - - - - - lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - - - if test "$GCC" = yes; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - if test -n "$lt_prog_compiler_pic"; then - lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" - fi - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ F* | *Sun*Fortran*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - *Intel*\ [CF]*Compiler*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - *Portland\ Group*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works" = xyes; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi - -fi - - - - - - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } - -if test x"$lt_cv_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - ld_shlibs=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='${wl}--export-all-symbols' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs=yes - ;; - - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = no; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds='' - hardcode_direct=yes - hardcode_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='${wl}-f,' - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' ${wl}-bernotok' - allow_undefined_flag=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - enable_shared_with_static_runtimes=yes - ;; - esac - ;; - - darwin* | rhapsody*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - - else - ld_shlibs=no - fi - - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler__b=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } - -if test x"$lt_cv_prog_compiler__b" = xyes; then - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_irix_exported_symbol=yes -else - lt_cv_irix_exported_symbol=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test "$lt_cv_irix_exported_symbol" = yes; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - else - ld_shlibs=no - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' - ;; - esac - fi - fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([A-Za-z]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test "X$hardcode_automatic" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } - -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - ac_cv_lib_dld_shl_load=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi - - - - - - - - - - - - - # Report which library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } - - - - -fi -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -CC="$lt_save_CC" - - if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 -$as_echo_n "checking how to run the C++ preprocessor... " >&6; } -if test -z "$CXXCPP"; then - if ${ac_cv_prog_CXXCPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 -$as_echo "$CXXCPP" >&6; } -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -else - _lt_caught_CXX_error=yes -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -compiler_needs_object_CXX=no -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_direct_absolute_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_shlibpath_var_CXX=unsupported -hardcode_automatic_CXX=no -inherit_rpath_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -reload_flag_CXX=$reload_flag -reload_cmds_CXX=$reload_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - - # save warnings/boilerplate of simple test code - ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - - ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - compiler_CXX=$CC - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' - else - lt_prog_compiler_no_builtin_flag_CXX= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - - -@%:@ Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_CXX= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - ld_shlibs_CXX=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_CXX='' - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - file_list_spec_CXX='${wl}-f,' - - if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct_CXX=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_CXX=yes - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_libdir_separator_CXX= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec_CXX='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - always_export_symbols_CXX=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_CXX='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - - archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_CXX="-z nodefs" - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_CXX=' ${wl}-bernotok' - allow_undefined_flag_CXX=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX='$convenience' - fi - archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_CXX=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_CXX=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_CXX=' ' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=yes - file_list_spec_CXX='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' - enable_shared_with_static_runtimes_CXX=yes - # Don't use ranlib - old_postinstall_cmds_CXX='chmod 644 $oldlib' - postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=no - enable_shared_with_static_runtimes_CXX=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs_CXX=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - - - archive_cmds_need_lc_CXX=no - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec_CXX='' - fi - link_all_deplibs_CXX=yes - allow_undefined_flag_CXX="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - if test "$lt_cv_apple_cc_single_mod" != "yes"; then - archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" - fi - - else - ld_shlibs_CXX=no - fi - - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - freebsd2.*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - ld_shlibs_CXX=no - ;; - - freebsd-elf*) - archive_cmds_need_lc_CXX=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - - gnu*) - ;; - - haiku*) - archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs_CXX=yes - ;; - - hpux9*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - export_dynamic_flag_spec_CXX='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - *) - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - interix[3-9]*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' - fi - fi - link_all_deplibs_CXX=yes - ;; - esac - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - inherit_rpath_CXX=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [1-5].* | *pgcpp\ [1-5].*) - prelink_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - old_archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - hardcode_libdir_flag_spec_CXX='-R$libdir' - whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object_CXX=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - ld_shlibs_CXX=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - ld_shlibs_CXX=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - hardcode_direct_absolute_CXX=yes - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - export_dynamic_flag_spec_CXX='${wl}-E' - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - ld_shlibs_CXX=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - case $host in - osf3*) - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - ;; - *) - allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - ;; - esac - - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_shlibpath_var_CXX=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - no_undefined_flag_CXX=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - fi - - hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag_CXX='${wl}-z,text' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag_CXX='${wl}-z,text' - allow_undefined_flag_CXX='${wl}-z,nodefs' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - export_dynamic_flag_spec_CXX='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ - '"$old_archive_cmds_CXX" - reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ - '"$reload_cmds_CXX" - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } - test "$ld_shlibs_CXX" = no && can_build_shared=no - - GCC_CXX="$GXX" - LD_CXX="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - # Dependencies to place before and after the object being linked: -predep_objects_CXX= -postdep_objects_CXX= -predeps_CXX= -postdeps_CXX= -compiler_lib_search_path_CXX= - -cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF - - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; -esac - -if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" || - test $p = "-R"; then - prev=$p - continue - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$compiler_lib_search_path_CXX"; then - compiler_lib_search_path_CXX="${prev}${p}" - else - compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$postdeps_CXX"; then - postdeps_CXX="${prev}${p}" - else - postdeps_CXX="${postdeps_CXX} ${prev}${p}" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$predep_objects_CXX"; then - predep_objects_CXX="$p" - else - predep_objects_CXX="$predep_objects_CXX $p" - fi - else - if test -z "$postdep_objects_CXX"; then - postdep_objects_CXX="$p" - else - postdep_objects_CXX="$postdep_objects_CXX $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling CXX test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -case $host_os in -interix[3-9]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - predep_objects_CXX= - postdep_objects_CXX= - postdeps_CXX= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac - - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - compiler_lib_search_dirs_CXX= -if test -n "${compiler_lib_search_path_CXX}"; then - compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= - - - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic_CXX='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_CXX='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - lt_prog_compiler_pic_CXX= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static_CXX= - ;; - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix[4-9]*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - else - lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - dgux*) - case $cc_basename in - ec++*) - lt_prog_compiler_pic_CXX='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - lt_prog_compiler_pic_CXX='+Z' - fi - ;; - aCC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - lt_prog_compiler_static_CXX='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fpic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-qpic' - lt_prog_compiler_static_CXX='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd*) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - lt_prog_compiler_wl_CXX='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - lt_prog_compiler_pic_CXX='-pic' - ;; - cxx*) - # Digital/Compaq C++ - lt_prog_compiler_wl_CXX='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - lt_prog_compiler_pic_CXX='-pic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - lcc*) - # Lucid - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - lt_prog_compiler_pic_CXX='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - lt_prog_compiler_can_build_shared_CXX=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_CXX= - ;; - *) - lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } -lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } -if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works_CXX=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then - case $lt_prog_compiler_pic_CXX in - "" | " "*) ;; - *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; - esac -else - lt_prog_compiler_pic_CXX= - lt_prog_compiler_can_build_shared_CXX=no -fi - -fi - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works_CXX=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works_CXX=yes - fi - else - lt_cv_prog_compiler_static_works_CXX=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then - : -else - lt_prog_compiler_static_CXX= -fi - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - case $host_os in - aix[4-9]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - export_symbols_cmds_CXX="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) - exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - ;; - esac - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } -test "$ld_shlibs_CXX" = no && can_build_shared=no - -with_gnu_ld_CXX=$with_gnu_ld - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_CXX" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_CXX=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_CXX in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - pic_flag=$lt_prog_compiler_pic_CXX - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_CXX - allow_undefined_flag_CXX= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc_CXX=no - else - lt_cv_archive_cmds_need_lc_CXX=yes - fi - allow_undefined_flag_CXX=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } - archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action_CXX= -if test -n "$hardcode_libdir_flag_spec_CXX" || - test -n "$runpath_var_CXX" || - test "X$hardcode_automatic_CXX" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct_CXX" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && - test "$hardcode_minus_L_CXX" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_CXX=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_CXX=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_CXX=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 -$as_echo "$hardcode_action_CXX" >&6; } - -if test "$hardcode_action_CXX" = relink || - test "$inherit_rpath_CXX" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - -# TODO(chandlerc@google.com): Currently we aren't running the Python tests -# against the interpreter detected by AM_PATH_PYTHON, and so we condition -# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's -# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env" -# hashbang. -PYTHON= # We *do not* allow the user to specify a python interpreter -# Extract the first word of "python", so it can be a program name with args. -set dummy python; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PYTHON+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $PYTHON in - [\\/]* | ?:[\\/]*) - ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_path_PYTHON" && ac_cv_path_PYTHON=":" - ;; -esac -fi -PYTHON=$ac_cv_path_PYTHON -if test -n "$PYTHON"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 -$as_echo "$PYTHON" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -if test "$PYTHON" != ":"; then : - prog="import sys -# split strings by '.' and convert to numeric. Append some zeros -# because we need at least 4 digits for the hex conversion. -# map returns an iterator in Python 3.0 and a list in 2.x -minver = list(map(int, '2.3'.split('.'))) + [0, 0, 0] -minverhex = 0 -# xrange is not present in Python 3.0 and range returns an iterator -for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] -sys.exit(sys.hexversion < minverhex)" - if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5 - ($PYTHON -c "$prog") >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then : - : -else - PYTHON=":" -fi -fi - if test "$PYTHON" != ":"; then - HAVE_PYTHON_TRUE= - HAVE_PYTHON_FALSE='#' -else - HAVE_PYTHON_TRUE='#' - HAVE_PYTHON_FALSE= -fi - - -# Configure pthreads. - -@%:@ Check whether --with-pthreads was given. -if test "${with_pthreads+set}" = set; then : - withval=$with_pthreads; with_pthreads=$withval -else - with_pthreads=check -fi - - -have_pthreads=no -if test "x$with_pthreads" != "xno"; then : - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -acx_pthread_ok=no - -# We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on True64 or Sequent). -# It gets checked for in the link test anyway. - -# First of all, check if the user has set any of the PTHREAD_LIBS, -# etcetera environment variables, and if threads linking works using -# them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 -$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_join (); -int -main () -{ -return pthread_join (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - acx_pthread_ok=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 -$as_echo "$acx_pthread_ok" >&6; } - if test x"$acx_pthread_ok" = xno; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" - fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" -fi - -# We must check for the threads library under a number of different -# names; the ordering is very important because some systems -# (e.g. DEC) have both -lpthread and -lpthreads, where one of the -# libraries is broken (non-POSIX). - -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all, and "pthread-config" -# which is a program returning the flags for the Pth emulation library. - -acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" - -# The ordering *is* (sometimes) important. Some notes on the -# individual items follow: - -# pthreads: AIX (must check this before -lpthread) -# none: in case threads are in libc; should be tried before -Kthread and -# other compiler flags to prevent continual compiler warnings -# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc -# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# ... -mt is also the pthreads flag for HP/aCC -# pthread: Linux, etcetera -# --thread-safe: KAI C++ -# pthread-config: use pthread-config program (for GNU Pth library) - -case "${host_cpu}-${host_os}" in - *solaris*) - - # On Solaris (at least, for some versions), libc contains stubbed - # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (We need to link with -pthreads/-mt/ - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather - # a function called by this macro, so we could check for that, but - # who knows whether they'll stub that too in a future libc.) So, - # we'll just look for -pthreads and -lpthread first: - - acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" - ;; -esac - -if test x"$acx_pthread_ok" = xno; then -for flag in $acx_pthread_flags; do - - case $flag in - none) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 -$as_echo_n "checking whether pthreads work without any flags... " >&6; } - ;; - - -*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 -$as_echo_n "checking whether pthreads work with $flag... " >&6; } - PTHREAD_CFLAGS="$flag" - ;; - - pthread-config) - # Extract the first word of "pthread-config", so it can be a program name with args. -set dummy pthread-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_acx_pthread_config+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$acx_pthread_config"; then - ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_acx_pthread_config="yes" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no" -fi -fi -acx_pthread_config=$ac_cv_prog_acx_pthread_config -if test -n "$acx_pthread_config"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_config" >&5 -$as_echo "$acx_pthread_config" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - if test x"$acx_pthread_config" = xno; then continue; fi - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; - - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 -$as_echo_n "checking for the pthreads library -l$flag... " >&6; } - PTHREAD_LIBS="-l$flag" - ;; - esac - - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - acx_pthread_ok=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 -$as_echo "$acx_pthread_ok" >&6; } - if test "x$acx_pthread_ok" = xyes; then - break; - fi - - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" -done -fi - -# Various other checks: -if test "x$acx_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 -$as_echo_n "checking for joinable pthread attribute... " >&6; } - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -int attr=$attr; return attr; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - attr_name=$attr; break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 -$as_echo "$attr_name" >&6; } - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then - -cat >>confdefs.h <<_ACEOF -@%:@define PTHREAD_CREATE_JOINABLE $attr_name -_ACEOF - - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 -$as_echo_n "checking if more special flags are required for pthreads... " >&6; } - flag=no - case "${host_cpu}-${host_os}" in - *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; - *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 -$as_echo "${flag}" >&6; } - if test "x$flag" != xno; then - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" - fi - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - # More AIX lossage: must compile with xlc_r or cc_r - if test x"$GCC" != xyes; then - for ac_prog in xlc_r cc_r -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_PTHREAD_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$PTHREAD_CC"; then - ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_PTHREAD_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -PTHREAD_CC=$ac_cv_prog_PTHREAD_CC -if test -n "$PTHREAD_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 -$as_echo "$PTHREAD_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$PTHREAD_CC" && break -done -test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" - - else - PTHREAD_CC=$CC - fi - - # The next part tries to detect GCC inconsistency with -shared on some - # architectures and systems. The problem is that in certain - # configurations, when -shared is specified, GCC "forgets" to - # internally use various flags which are still necessary. - - # - # Prepare the flags - # - save_CFLAGS="$CFLAGS" - save_LIBS="$LIBS" - save_CC="$CC" - - # Try with the flags determined by the earlier checks. - # - # -Wl,-z,defs forces link-time symbol resolution, so that the - # linking checks with -shared actually have any value - # - # FIXME: -fPIC is required for -shared on many architectures, - # so we specify it here, but the right way would probably be to - # properly detect whether it is actually required. - CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CC="$PTHREAD_CC" - - # In order not to create several levels of indentation, we test - # the value of "$done" until we find the cure or run out of ideas. - done="no" - - # First, make sure the CFLAGS we added are actually accepted by our - # compiler. If not (and OS X's ld, for instance, does not accept -z), - # then we can't do this test. - if test x"$done" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to check for GCC pthread/shared inconsistencies" >&5 -$as_echo_n "checking whether to check for GCC pthread/shared inconsistencies... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - -else - done=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - if test "x$done" = xyes ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - fi - fi - - if test x"$done" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -pthread is sufficient with -shared" >&5 -$as_echo_n "checking whether -pthread is sufficient with -shared... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - done=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - if test "x$done" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - fi - - # - # Linux gcc on some architectures such as mips/mipsel forgets - # about -lpthread - # - if test x"$done" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lpthread fixes that" >&5 -$as_echo_n "checking whether -lpthread fixes that... " >&6; } - LIBS="-lpthread $PTHREAD_LIBS $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - done=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - if test "x$done" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - PTHREAD_LIBS="-lpthread $PTHREAD_LIBS" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - fi - # - # FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc - # - if test x"$done" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc_r fixes that" >&5 -$as_echo_n "checking whether -lc_r fixes that... " >&6; } - LIBS="-lc_r $PTHREAD_LIBS $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - done=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - if test "x$done" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - PTHREAD_LIBS="-lc_r $PTHREAD_LIBS" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - fi - if test x"$done" = xno; then - # OK, we have run out of ideas - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Impossible to determine how to use pthreads with shared libraries" >&5 -$as_echo "$as_me: WARNING: Impossible to determine how to use pthreads with shared libraries" >&2;} - - # so it's not safe to assume that we may use pthreads - acx_pthread_ok=no - fi - - CFLAGS="$save_CFLAGS" - LIBS="$save_LIBS" - CC="$save_CC" -else - PTHREAD_CC="$CC" -fi - - - - - -# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$acx_pthread_ok" = xyes; then - -$as_echo "@%:@define HAVE_PTHREAD 1" >>confdefs.h - - : -else - acx_pthread_ok=no - if test "x$with_pthreads" != "xcheck"; then : - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "--with-pthreads was specified, but unable to be used -See \`config.log' for more details" "$LINENO" 5; } -fi -fi -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - - have_pthreads="$acx_pthread_ok" -fi - if test "x$have_pthreads" == "xyes"; then - HAVE_PTHREADS_TRUE= - HAVE_PTHREADS_FALSE='#' -else - HAVE_PTHREADS_TRUE='#' - HAVE_PTHREADS_FALSE= -fi - - - - -# TODO(chandlerc@google.com) Check for the necessary system headers. - -# TODO(chandlerc@google.com) Check the types, structures, and other compiler -# and architecture characteristics. - -# Output the generated files. No further autoconf macros may be used. -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIB@&t@OBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 -$as_echo_n "checking that generated files are newer than configure... " >&6; } - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 -$as_echo "done" >&6; } - if test -n "$EXEEXT"; then - am__EXEEXT_TRUE= - am__EXEEXT_FALSE='#' -else - am__EXEEXT_TRUE='#' - am__EXEEXT_FALSE= -fi - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error $? "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${HAVE_PYTHON_TRUE}" && test -z "${HAVE_PYTHON_FALSE}"; then - as_fn_error $? "conditional \"HAVE_PYTHON\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${HAVE_PTHREADS_TRUE}" && test -z "${HAVE_PTHREADS_FALSE}"; then - as_fn_error $? "conditional \"HAVE_PTHREADS\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in @%:@( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in @%:@(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] -@%:@ ---------------------------------------- -@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are -@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the -@%:@ script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} @%:@ as_fn_error - - -@%:@ as_fn_set_status STATUS -@%:@ ----------------------- -@%:@ Set @S|@? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} @%:@ as_fn_set_status - -@%:@ as_fn_exit STATUS -@%:@ ----------------- -@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} @%:@ as_fn_exit - -@%:@ as_fn_unset VAR -@%:@ --------------- -@%:@ Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -@%:@ as_fn_append VAR VALUE -@%:@ ---------------------- -@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take -@%:@ advantage of any shell optimizations that allow amortized linear growth over -@%:@ repeated appends, instead of the typical quadratic growth present in naive -@%:@ implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -@%:@ as_fn_arith ARG... -@%:@ ------------------ -@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the -@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments -@%:@ must be portable across @S|@(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -@%:@ as_fn_mkdir_p -@%:@ ------------- -@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} @%:@ as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - - -@%:@ as_fn_executable_p FILE -@%:@ ----------------------- -@%:@ Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} @%:@ as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by Google C++ Testing Framework $as_me 1.6.0, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -Google C++ Testing Framework config.status 1.6.0 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2012 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX -@%:@@%:@ Running $as_me. @%:@@%:@ -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' -macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' -enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' -enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' -pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' -SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' -ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' -PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' -host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' -host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' -host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' -build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' -build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' -build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' -SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' -Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' -GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' -EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' -FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' -LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' -NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' -LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' -ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' -exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' -lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' -lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' -lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' -reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' -file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' -want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' -DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' -sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' -AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' -archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' -STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' -RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' -lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' -CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' -compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' -GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' -nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' -lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' -objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' -need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' -MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' -LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' -OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' -libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' -module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' -postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' -need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' -version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' -runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' -libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' -soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' -install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' -finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' -old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' -striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' -predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' -postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' -predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' -postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' -LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' -reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' -reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' -GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' -inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' -link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' -always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' -exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' -predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' -postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' -predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' -postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in SHELL \ -ECHO \ -PATH_SEPARATOR \ -SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -OBJDUMP \ -deplibs_check_method \ -file_magic_cmd \ -file_magic_glob \ -want_nocaseglob \ -DLLTOOL \ -sharedlib_from_linklib_cmd \ -AR \ -AR_FLAGS \ -archiver_list_spec \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -nm_file_list_spec \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_pic \ -lt_prog_compiler_wl \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -MANIFEST_TOOL \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_separator \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -install_override_mode \ -finish_eval \ -old_striplib \ -striplib \ -compiler_lib_search_dirs \ -predep_objects \ -postdep_objects \ -predeps \ -postdeps \ -compiler_lib_search_path \ -LD_CXX \ -reload_flag_CXX \ -compiler_CXX \ -lt_prog_compiler_no_builtin_flag_CXX \ -lt_prog_compiler_pic_CXX \ -lt_prog_compiler_wl_CXX \ -lt_prog_compiler_static_CXX \ -lt_cv_prog_compiler_c_o_CXX \ -export_dynamic_flag_spec_CXX \ -whole_archive_flag_spec_CXX \ -compiler_needs_object_CXX \ -with_gnu_ld_CXX \ -allow_undefined_flag_CXX \ -no_undefined_flag_CXX \ -hardcode_libdir_flag_spec_CXX \ -hardcode_libdir_separator_CXX \ -exclude_expsyms_CXX \ -include_expsyms_CXX \ -file_list_spec_CXX \ -compiler_lib_search_dirs_CXX \ -predep_objects_CXX \ -postdep_objects_CXX \ -predeps_CXX \ -postdeps_CXX \ -compiler_lib_search_path_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postlink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec \ -reload_cmds_CXX \ -old_archive_cmds_CXX \ -old_archive_from_new_cmds_CXX \ -old_archive_from_expsyms_cmds_CXX \ -archive_cmds_CXX \ -archive_expsym_cmds_CXX \ -module_cmds_CXX \ -module_expsym_cmds_CXX \ -export_symbols_cmds_CXX \ -prelink_cmds_CXX \ -postlink_cmds_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' - -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile' - - - - - - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "build-aux/config.h") CONFIG_HEADERS="$CONFIG_HEADERS build-aux/config.h" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "scripts/gtest-config") CONFIG_FILES="$CONFIG_FILES scripts/gtest-config" ;; - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' >$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi -# Compute "$ac_file"'s index in $config_headers. -_am_arg="$ac_file" -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || -$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$_am_arg" : 'X\(//\)[^/]' \| \ - X"$_am_arg" : 'X\(//\)$' \| \ - X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'`/stamp-h$_am_stamp_count - ;; - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "scripts/gtest-config":F) chmod +x scripts/gtest-config ;; - "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Older Autoconf quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} - ;; - "libtool":C) - - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -# The names of the tagged configurations supported by this script. -available_tags="CXX " - -# ### BEGIN LIBTOOL CONFIG - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that protects backslashes. -ECHO=$lt_ECHO - -# The PATH separator for the build system. -PATH_SEPARATOR=$lt_PATH_SEPARATOR - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="\$SED -e 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# convert \$build file names to \$host format. -to_host_file_cmd=$lt_cv_to_host_file_cmd - -# convert \$build files to toolchain format. -to_tool_file_cmd=$lt_cv_to_tool_file_cmd - -# An object symbol dumper. -OBJDUMP=$lt_OBJDUMP - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method = "file_magic". -file_magic_cmd=$lt_file_magic_cmd - -# How to find potential files when deplibs_check_method = "file_magic". -file_magic_glob=$lt_file_magic_glob - -# Find potential files using nocaseglob when deplibs_check_method = "file_magic". -want_nocaseglob=$lt_want_nocaseglob - -# DLL creation program. -DLLTOOL=$lt_DLLTOOL - -# Command to associate shared and link libraries. -sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd - -# The archiver. -AR=$lt_AR - -# Flags to create an archive. -AR_FLAGS=$lt_AR_FLAGS - -# How to feed a file listing to the archiver. -archiver_list_spec=$lt_archiver_list_spec - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Whether to use a lock for old archive extraction. -lock_old_archive_extraction=$lock_old_archive_extraction - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration. -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair. -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# Specify filename containing input files for \$NM. -nm_file_list_spec=$lt_nm_file_list_spec - -# The root where to search for dependent libraries,and in which our libraries should be installed. -lt_sysroot=$lt_sysroot - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Manifest tool. -MANIFEST_TOOL=$lt_MANIFEST_TOOL - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# Do we need the "lib" prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Permission mode override for installation of shared libraries. -install_override_mode=$lt_install_override_mode - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Compile-time system search path for libraries. -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects -postdep_objects=$lt_postdep_objects -predeps=$lt_predeps -postdeps=$lt_postdeps - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path - -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - -ltmain="$ac_aux_dir/ltmain.sh" - - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - if test x"$xsi_shell" = xyes; then - sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ -func_dirname ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_basename ()$/,/^} # func_basename /c\ -func_basename ()\ -{\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ -func_dirname_and_basename ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ -func_stripname ()\ -{\ -\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ -\ # positional parameters, so assign one to ordinary parameter first.\ -\ func_stripname_result=${3}\ -\ func_stripname_result=${func_stripname_result#"${1}"}\ -\ func_stripname_result=${func_stripname_result%"${2}"}\ -} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ -func_split_long_opt ()\ -{\ -\ func_split_long_opt_name=${1%%=*}\ -\ func_split_long_opt_arg=${1#*=}\ -} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ -func_split_short_opt ()\ -{\ -\ func_split_short_opt_arg=${1#??}\ -\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ -} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ -func_lo2o ()\ -{\ -\ case ${1} in\ -\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ -\ *) func_lo2o_result=${1} ;;\ -\ esac\ -} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_xform ()$/,/^} # func_xform /c\ -func_xform ()\ -{\ - func_xform_result=${1%.*}.lo\ -} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_arith ()$/,/^} # func_arith /c\ -func_arith ()\ -{\ - func_arith_result=$(( $* ))\ -} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_len ()$/,/^} # func_len /c\ -func_len ()\ -{\ - func_len_result=${#1}\ -} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - -fi - -if test x"$lt_shell_append" = xyes; then - sed -e '/^func_append ()$/,/^} # func_append /c\ -func_append ()\ -{\ - eval "${1}+=\\${2}"\ -} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ -func_append_quoted ()\ -{\ -\ func_quote_for_eval "${2}"\ -\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ -} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 -$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} -fi - - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - - cat <<_LT_EOF >> "$ofile" - -# ### BEGIN LIBTOOL TAG CONFIG: CXX - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# How to create reloadable object files. -reload_flag=$lt_reload_flag_CXX -reload_cmds=$lt_reload_cmds_CXX - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds_CXX - -# A language specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU compiler? -with_gcc=$GCC_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object_CXX - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld_CXX - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute_CXX - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L_CXX - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic_CXX - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath_CXX - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_CXX - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols_CXX - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_CXX - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_CXX - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_CXX - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds_CXX - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds_CXX - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec_CXX - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects_CXX -postdep_objects=$lt_postdep_objects_CXX -predeps=$lt_predeps_CXX -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# ### END LIBTOOL TAG CONFIG: CXX -_LT_EOF - - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - diff --git a/vendor/gtest-1.6.0/autom4te.cache/output.1 b/vendor/gtest-1.6.0/autom4te.cache/output.1 deleted file mode 100644 index 4eeb1c84..00000000 --- a/vendor/gtest-1.6.0/autom4te.cache/output.1 +++ /dev/null @@ -1,18370 +0,0 @@ -@%:@! /bin/sh -@%:@ Guess values for system-dependent variables and create Makefiles. -@%:@ Generated by GNU Autoconf 2.69 for Google C++ Testing Framework 1.6.0. -@%:@ -@%:@ Report bugs to . -@%:@ -@%:@ -@%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -@%:@ -@%:@ -@%:@ This configure script is free software; the Free Software Foundation -@%:@ gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in @%:@( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in @%:@(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in @%:@ (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 - - test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in @%:@( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in @%:@ (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: googletestframework@googlegroups.com about your system, -$0: including any error possibly output before this -$0: message. Then install a modern shell, or manually run -$0: the script under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -@%:@ as_fn_unset VAR -@%:@ --------------- -@%:@ Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -@%:@ as_fn_set_status STATUS -@%:@ ----------------------- -@%:@ Set @S|@? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} @%:@ as_fn_set_status - -@%:@ as_fn_exit STATUS -@%:@ ----------------- -@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} @%:@ as_fn_exit - -@%:@ as_fn_mkdir_p -@%:@ ------------- -@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} @%:@ as_fn_mkdir_p - -@%:@ as_fn_executable_p FILE -@%:@ ----------------------- -@%:@ Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} @%:@ as_fn_executable_p -@%:@ as_fn_append VAR VALUE -@%:@ ---------------------- -@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take -@%:@ advantage of any shell optimizations that allow amortized linear growth over -@%:@ repeated appends, instead of the typical quadratic growth present in naive -@%:@ implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -@%:@ as_fn_arith ARG... -@%:@ ------------------ -@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the -@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments -@%:@ must be portable across @S|@(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] -@%:@ ---------------------------------------- -@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are -@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the -@%:@ script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} @%:@ as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -SHELL=${CONFIG_SHELL-/bin/sh} - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIB@&t@OBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='Google C++ Testing Framework' -PACKAGE_TARNAME='gtest' -PACKAGE_VERSION='1.6.0' -PACKAGE_STRING='Google C++ Testing Framework 1.6.0' -PACKAGE_BUGREPORT='googletestframework@googlegroups.com' -PACKAGE_URL='' - -ac_unique_file="./COPYING" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='am__EXEEXT_FALSE -am__EXEEXT_TRUE -LTLIBOBJS -LIB@&t@OBJS -HAVE_PTHREADS_FALSE -HAVE_PTHREADS_TRUE -PTHREAD_CFLAGS -PTHREAD_LIBS -PTHREAD_CC -acx_pthread_config -HAVE_PYTHON_FALSE -HAVE_PYTHON_TRUE -PYTHON -CXXCPP -CPP -OTOOL64 -OTOOL -LIPO -NMEDIT -DSYMUTIL -MANIFEST_TOOL -RANLIB -ac_ct_AR -AR -DLLTOOL -OBJDUMP -LN_S -NM -ac_ct_DUMPBIN -DUMPBIN -LD -FGREP -EGREP -GREP -SED -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -LIBTOOL -am__fastdepCXX_FALSE -am__fastdepCXX_TRUE -CXXDEPMODE -ac_ct_CXX -CXXFLAGS -CXX -am__fastdepCC_FALSE -am__fastdepCC_TRUE -CCDEPMODE -am__nodep -AMDEPBACKSLASH -AMDEP_FALSE -AMDEP_TRUE -am__quote -am__include -DEPDIR -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -AM_BACKSLASH -AM_DEFAULT_VERBOSITY -AM_DEFAULT_V -AM_V -am__untar -am__tar -AMTAR -am__leading_dot -SET_MAKE -AWK -mkdir_p -MKDIR_P -INSTALL_STRIP_PROGRAM -STRIP -install_sh -MAKEINFO -AUTOHEADER -AUTOMAKE -AUTOCONF -ACLOCAL -VERSION -PACKAGE -CYGPATH_W -am__isrc -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_silent_rules -enable_dependency_tracking -enable_shared -enable_static -with_pic -enable_fast_install -with_gnu_ld -with_sysroot -enable_libtool_lock -with_pthreads -' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CXX -CXXFLAGS -CCC -CPP -CXXCPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures Google C++ Testing Framework 1.6.0 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - @<:@@S|@ac_default_prefix@:>@ - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - @<:@PREFIX@:>@ - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gtest@:>@ - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of Google C++ Testing Framework 1.6.0:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-silent-rules less verbose build output (undo: "make V=1") - --disable-silent-rules verbose build output (undo: "make V=0") - --enable-dependency-tracking - do not reject slow dependency extractors - --disable-dependency-tracking - speeds up one-time build - --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ - --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ - --enable-fast-install@<:@=PKGS@:>@ - optimize for fast installation @<:@default=yes@:>@ - --disable-libtool-lock avoid locking (might break parallel builds) - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use - both@:>@ - --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ - --with-sysroot=DIR Search for dependent libraries within DIR - (or the compiler's sysroot if not specified). - --with-pthreads use pthreads (default is yes) - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CPP C preprocessor - CXXCPP C++ preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -Google C++ Testing Framework configure 1.6.0 -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -@%:@ ac_fn_c_try_compile LINENO -@%:@ -------------------------- -@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_compile - -@%:@ ac_fn_cxx_try_compile LINENO -@%:@ ---------------------------- -@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_compile - -@%:@ ac_fn_c_try_link LINENO -@%:@ ----------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_link - -@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -@%:@ ------------------------------------------------------- -@%:@ Tests whether HEADER exists and can be compiled using the include files in -@%:@ INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -@%:@include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_header_compile - -@%:@ ac_fn_c_try_cpp LINENO -@%:@ ---------------------- -@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_cpp - -@%:@ ac_fn_c_try_run LINENO -@%:@ ---------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes -@%:@ that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_run - -@%:@ ac_fn_c_check_func LINENO FUNC VAR -@%:@ ---------------------------------- -@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_func - -@%:@ ac_fn_cxx_try_cpp LINENO -@%:@ ------------------------ -@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_cpp - -@%:@ ac_fn_cxx_try_link LINENO -@%:@ ------------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_link -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by Google C++ Testing Framework $as_me 1.6.0, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in @%:@(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -# Provide various options to initialize the Autoconf and configure processes. - - - -ac_aux_dir= -for ac_dir in build-aux "$srcdir"/build-aux; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -ac_config_headers="$ac_config_headers build-aux/config.h" - -ac_config_files="$ac_config_files Makefile" - -ac_config_files="$ac_config_files scripts/gtest-config" - - -# Initialize Automake with various options. We require at least v1.9, prevent -# pedantic complaints about package files, and enable various distribution -# targets. -am__api_version='1.14' - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in @%:@(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; -esac - -# Do 'set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken - alias in your environment" "$LINENO" 5 - fi - if test "$2" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi - -rm -f conftest.file - -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} -fi - -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi - -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS - -fi - - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -@%:@ Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : - enableval=$enable_silent_rules; -fi - -case $enable_silent_rules in @%:@ ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=1;; -esac -am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AM_BACKSLASH='\' - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE='gtest' - VERSION='1.6.0' - - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -@%:@define VERSION "$VERSION" -_ACEOF - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -mkdir_p='$(MKDIR_P)' - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' - - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar pax cpio none' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' - - - - - - -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. - -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . - -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. - -END - as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 - fi -fi - -# Check for programs used in building Google Test. -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $@%:@ != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 - ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -@%:@ Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -depcc="$CXX" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.4.2' -macro_revision='1.3337' - - - - - - - - - - - - - -ltmain="$ac_aux_dir/ltmain.sh" - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} - -case "$ECHO" in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; -esac - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_SED" || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_FGREP" || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -@%:@ Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DUMPBIN" && break - done -fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DUMPBIN=$ac_ct_DUMPBIN - fi -fi - - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac - -fi - -if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - - - - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } - - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac - -fi - -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac - -fi - -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then - reload_cmds=false - fi - ;; - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - - - - - - - - - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - - - - - - - - -if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AR" && break - done -fi -if test -z "$AR"; then - ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_AR" && break -done - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -fi - -: ${AR=ar} -: ${AR_FLAGS=cru} - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ar_at_file=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT@&t@_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT@&t@_DLSYM_CONST -#else -# define LT@&t@_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT@&t@_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done - -fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } - -@%:@ Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : - withval=$with_sysroot; -else - with_sysroot=no -fi - - -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 -$as_echo "${with_sysroot}" >&6; } - as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 - ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } - - - - - - -@%:@ Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : - enableval=$enable_libtool_lock; -fi - -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - lt_cv_cc_needs_belf=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL - fi -else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" -fi - -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi - - - - - - - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&5 - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&5 - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -@%:@define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - -func_stripname_cnf () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname_cnf - - - - - -# Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - - - @%:@ Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=yes -fi - - - - - - - - - - @%:@ Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_static=yes -fi - - - - - - - - - - -@%:@ Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : - withval=$with_pic; lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for lt_pkg in $withval; do - IFS="$lt_save_ifs" - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - pic_mode=default -fi - - -test -z "$pic_mode" && pic_mode=default - - - - - - - - @%:@ Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_fast_install=yes -fi - - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -@%:@define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -lt_save_CC="$CC" -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then - -lt_prog_compiler_no_builtin_flag= - -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } - -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : -fi - -fi - - - - - - - lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - - - if test "$GCC" = yes; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - if test -n "$lt_prog_compiler_pic"; then - lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" - fi - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ F* | *Sun*Fortran*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - *Intel*\ [CF]*Compiler*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - *Portland\ Group*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works" = xyes; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi - -fi - - - - - - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } - -if test x"$lt_cv_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - ld_shlibs=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='${wl}--export-all-symbols' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs=yes - ;; - - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = no; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds='' - hardcode_direct=yes - hardcode_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='${wl}-f,' - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' ${wl}-bernotok' - allow_undefined_flag=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - enable_shared_with_static_runtimes=yes - ;; - esac - ;; - - darwin* | rhapsody*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - - else - ld_shlibs=no - fi - - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler__b=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } - -if test x"$lt_cv_prog_compiler__b" = xyes; then - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_irix_exported_symbol=yes -else - lt_cv_irix_exported_symbol=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test "$lt_cv_irix_exported_symbol" = yes; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - else - ld_shlibs=no - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' - ;; - esac - fi - fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([A-Za-z]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test "X$hardcode_automatic" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } - -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - ac_cv_lib_dld_shl_load=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi - - - - - - - - - - - - - # Report which library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } - - - - -fi -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -CC="$lt_save_CC" - - if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 -$as_echo_n "checking how to run the C++ preprocessor... " >&6; } -if test -z "$CXXCPP"; then - if ${ac_cv_prog_CXXCPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 -$as_echo "$CXXCPP" >&6; } -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -else - _lt_caught_CXX_error=yes -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -compiler_needs_object_CXX=no -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_direct_absolute_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_shlibpath_var_CXX=unsupported -hardcode_automatic_CXX=no -inherit_rpath_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -reload_flag_CXX=$reload_flag -reload_cmds_CXX=$reload_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - - # save warnings/boilerplate of simple test code - ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - - ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - compiler_CXX=$CC - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' - else - lt_prog_compiler_no_builtin_flag_CXX= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - - -@%:@ Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_CXX= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - ld_shlibs_CXX=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_CXX='' - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - file_list_spec_CXX='${wl}-f,' - - if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct_CXX=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_CXX=yes - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_libdir_separator_CXX= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec_CXX='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - always_export_symbols_CXX=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_CXX='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - - archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_CXX="-z nodefs" - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_CXX=' ${wl}-bernotok' - allow_undefined_flag_CXX=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX='$convenience' - fi - archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_CXX=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_CXX=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_CXX=' ' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=yes - file_list_spec_CXX='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' - enable_shared_with_static_runtimes_CXX=yes - # Don't use ranlib - old_postinstall_cmds_CXX='chmod 644 $oldlib' - postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=no - enable_shared_with_static_runtimes_CXX=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs_CXX=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - - - archive_cmds_need_lc_CXX=no - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec_CXX='' - fi - link_all_deplibs_CXX=yes - allow_undefined_flag_CXX="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - if test "$lt_cv_apple_cc_single_mod" != "yes"; then - archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" - fi - - else - ld_shlibs_CXX=no - fi - - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - freebsd2.*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - ld_shlibs_CXX=no - ;; - - freebsd-elf*) - archive_cmds_need_lc_CXX=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - - gnu*) - ;; - - haiku*) - archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs_CXX=yes - ;; - - hpux9*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - export_dynamic_flag_spec_CXX='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - *) - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - interix[3-9]*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' - fi - fi - link_all_deplibs_CXX=yes - ;; - esac - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - inherit_rpath_CXX=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [1-5].* | *pgcpp\ [1-5].*) - prelink_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - old_archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - hardcode_libdir_flag_spec_CXX='-R$libdir' - whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object_CXX=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - ld_shlibs_CXX=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - ld_shlibs_CXX=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - hardcode_direct_absolute_CXX=yes - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - export_dynamic_flag_spec_CXX='${wl}-E' - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - ld_shlibs_CXX=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - case $host in - osf3*) - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - ;; - *) - allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - ;; - esac - - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_shlibpath_var_CXX=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - no_undefined_flag_CXX=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - fi - - hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag_CXX='${wl}-z,text' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag_CXX='${wl}-z,text' - allow_undefined_flag_CXX='${wl}-z,nodefs' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - export_dynamic_flag_spec_CXX='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ - '"$old_archive_cmds_CXX" - reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ - '"$reload_cmds_CXX" - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } - test "$ld_shlibs_CXX" = no && can_build_shared=no - - GCC_CXX="$GXX" - LD_CXX="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - # Dependencies to place before and after the object being linked: -predep_objects_CXX= -postdep_objects_CXX= -predeps_CXX= -postdeps_CXX= -compiler_lib_search_path_CXX= - -cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF - - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; -esac - -if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" || - test $p = "-R"; then - prev=$p - continue - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$compiler_lib_search_path_CXX"; then - compiler_lib_search_path_CXX="${prev}${p}" - else - compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$postdeps_CXX"; then - postdeps_CXX="${prev}${p}" - else - postdeps_CXX="${postdeps_CXX} ${prev}${p}" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$predep_objects_CXX"; then - predep_objects_CXX="$p" - else - predep_objects_CXX="$predep_objects_CXX $p" - fi - else - if test -z "$postdep_objects_CXX"; then - postdep_objects_CXX="$p" - else - postdep_objects_CXX="$postdep_objects_CXX $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling CXX test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -case $host_os in -interix[3-9]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - predep_objects_CXX= - postdep_objects_CXX= - postdeps_CXX= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac - - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - compiler_lib_search_dirs_CXX= -if test -n "${compiler_lib_search_path_CXX}"; then - compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= - - - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic_CXX='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_CXX='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - lt_prog_compiler_pic_CXX= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static_CXX= - ;; - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix[4-9]*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - else - lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - dgux*) - case $cc_basename in - ec++*) - lt_prog_compiler_pic_CXX='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - lt_prog_compiler_pic_CXX='+Z' - fi - ;; - aCC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - lt_prog_compiler_static_CXX='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fpic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-qpic' - lt_prog_compiler_static_CXX='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd*) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - lt_prog_compiler_wl_CXX='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - lt_prog_compiler_pic_CXX='-pic' - ;; - cxx*) - # Digital/Compaq C++ - lt_prog_compiler_wl_CXX='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - lt_prog_compiler_pic_CXX='-pic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - lcc*) - # Lucid - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - lt_prog_compiler_pic_CXX='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - lt_prog_compiler_can_build_shared_CXX=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_CXX= - ;; - *) - lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } -lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } -if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works_CXX=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then - case $lt_prog_compiler_pic_CXX in - "" | " "*) ;; - *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; - esac -else - lt_prog_compiler_pic_CXX= - lt_prog_compiler_can_build_shared_CXX=no -fi - -fi - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works_CXX=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works_CXX=yes - fi - else - lt_cv_prog_compiler_static_works_CXX=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then - : -else - lt_prog_compiler_static_CXX= -fi - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - case $host_os in - aix[4-9]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - export_symbols_cmds_CXX="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) - exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - ;; - esac - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } -test "$ld_shlibs_CXX" = no && can_build_shared=no - -with_gnu_ld_CXX=$with_gnu_ld - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_CXX" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_CXX=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_CXX in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - pic_flag=$lt_prog_compiler_pic_CXX - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_CXX - allow_undefined_flag_CXX= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc_CXX=no - else - lt_cv_archive_cmds_need_lc_CXX=yes - fi - allow_undefined_flag_CXX=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } - archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action_CXX= -if test -n "$hardcode_libdir_flag_spec_CXX" || - test -n "$runpath_var_CXX" || - test "X$hardcode_automatic_CXX" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct_CXX" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && - test "$hardcode_minus_L_CXX" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_CXX=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_CXX=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_CXX=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 -$as_echo "$hardcode_action_CXX" >&6; } - -if test "$hardcode_action_CXX" = relink || - test "$inherit_rpath_CXX" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - -# TODO(chandlerc@google.com): Currently we aren't running the Python tests -# against the interpreter detected by AM_PATH_PYTHON, and so we condition -# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's -# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env" -# hashbang. -PYTHON= # We *do not* allow the user to specify a python interpreter -# Extract the first word of "python", so it can be a program name with args. -set dummy python; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PYTHON+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $PYTHON in - [\\/]* | ?:[\\/]*) - ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_path_PYTHON" && ac_cv_path_PYTHON=":" - ;; -esac -fi -PYTHON=$ac_cv_path_PYTHON -if test -n "$PYTHON"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 -$as_echo "$PYTHON" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -if test "$PYTHON" != ":"; then : - prog="import sys -# split strings by '.' and convert to numeric. Append some zeros -# because we need at least 4 digits for the hex conversion. -# map returns an iterator in Python 3.0 and a list in 2.x -minver = list(map(int, '2.3'.split('.'))) + [0, 0, 0] -minverhex = 0 -# xrange is not present in Python 3.0 and range returns an iterator -for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] -sys.exit(sys.hexversion < minverhex)" - if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5 - ($PYTHON -c "$prog") >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then : - : -else - PYTHON=":" -fi -fi - if test "$PYTHON" != ":"; then - HAVE_PYTHON_TRUE= - HAVE_PYTHON_FALSE='#' -else - HAVE_PYTHON_TRUE='#' - HAVE_PYTHON_FALSE= -fi - - -# Configure pthreads. - -@%:@ Check whether --with-pthreads was given. -if test "${with_pthreads+set}" = set; then : - withval=$with_pthreads; with_pthreads=$withval -else - with_pthreads=check -fi - - -have_pthreads=no -if test "x$with_pthreads" != "xno"; then : - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -acx_pthread_ok=no - -# We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on True64 or Sequent). -# It gets checked for in the link test anyway. - -# First of all, check if the user has set any of the PTHREAD_LIBS, -# etcetera environment variables, and if threads linking works using -# them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 -$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_join (); -int -main () -{ -return pthread_join (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - acx_pthread_ok=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 -$as_echo "$acx_pthread_ok" >&6; } - if test x"$acx_pthread_ok" = xno; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" - fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" -fi - -# We must check for the threads library under a number of different -# names; the ordering is very important because some systems -# (e.g. DEC) have both -lpthread and -lpthreads, where one of the -# libraries is broken (non-POSIX). - -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all, and "pthread-config" -# which is a program returning the flags for the Pth emulation library. - -acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" - -# The ordering *is* (sometimes) important. Some notes on the -# individual items follow: - -# pthreads: AIX (must check this before -lpthread) -# none: in case threads are in libc; should be tried before -Kthread and -# other compiler flags to prevent continual compiler warnings -# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc -# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# ... -mt is also the pthreads flag for HP/aCC -# pthread: Linux, etcetera -# --thread-safe: KAI C++ -# pthread-config: use pthread-config program (for GNU Pth library) - -case "${host_cpu}-${host_os}" in - *solaris*) - - # On Solaris (at least, for some versions), libc contains stubbed - # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (We need to link with -pthreads/-mt/ - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather - # a function called by this macro, so we could check for that, but - # who knows whether they'll stub that too in a future libc.) So, - # we'll just look for -pthreads and -lpthread first: - - acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" - ;; -esac - -if test x"$acx_pthread_ok" = xno; then -for flag in $acx_pthread_flags; do - - case $flag in - none) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 -$as_echo_n "checking whether pthreads work without any flags... " >&6; } - ;; - - -*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 -$as_echo_n "checking whether pthreads work with $flag... " >&6; } - PTHREAD_CFLAGS="$flag" - ;; - - pthread-config) - # Extract the first word of "pthread-config", so it can be a program name with args. -set dummy pthread-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_acx_pthread_config+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$acx_pthread_config"; then - ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_acx_pthread_config="yes" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no" -fi -fi -acx_pthread_config=$ac_cv_prog_acx_pthread_config -if test -n "$acx_pthread_config"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_config" >&5 -$as_echo "$acx_pthread_config" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - if test x"$acx_pthread_config" = xno; then continue; fi - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; - - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 -$as_echo_n "checking for the pthreads library -l$flag... " >&6; } - PTHREAD_LIBS="-l$flag" - ;; - esac - - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - acx_pthread_ok=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 -$as_echo "$acx_pthread_ok" >&6; } - if test "x$acx_pthread_ok" = xyes; then - break; - fi - - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" -done -fi - -# Various other checks: -if test "x$acx_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 -$as_echo_n "checking for joinable pthread attribute... " >&6; } - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -int attr=$attr; return attr; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - attr_name=$attr; break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 -$as_echo "$attr_name" >&6; } - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then - -cat >>confdefs.h <<_ACEOF -@%:@define PTHREAD_CREATE_JOINABLE $attr_name -_ACEOF - - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 -$as_echo_n "checking if more special flags are required for pthreads... " >&6; } - flag=no - case "${host_cpu}-${host_os}" in - *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; - *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 -$as_echo "${flag}" >&6; } - if test "x$flag" != xno; then - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" - fi - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - # More AIX lossage: must compile with xlc_r or cc_r - if test x"$GCC" != xyes; then - for ac_prog in xlc_r cc_r -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_PTHREAD_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$PTHREAD_CC"; then - ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_PTHREAD_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -PTHREAD_CC=$ac_cv_prog_PTHREAD_CC -if test -n "$PTHREAD_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 -$as_echo "$PTHREAD_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$PTHREAD_CC" && break -done -test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" - - else - PTHREAD_CC=$CC - fi - - # The next part tries to detect GCC inconsistency with -shared on some - # architectures and systems. The problem is that in certain - # configurations, when -shared is specified, GCC "forgets" to - # internally use various flags which are still necessary. - - # - # Prepare the flags - # - save_CFLAGS="$CFLAGS" - save_LIBS="$LIBS" - save_CC="$CC" - - # Try with the flags determined by the earlier checks. - # - # -Wl,-z,defs forces link-time symbol resolution, so that the - # linking checks with -shared actually have any value - # - # FIXME: -fPIC is required for -shared on many architectures, - # so we specify it here, but the right way would probably be to - # properly detect whether it is actually required. - CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CC="$PTHREAD_CC" - - # In order not to create several levels of indentation, we test - # the value of "$done" until we find the cure or run out of ideas. - done="no" - - # First, make sure the CFLAGS we added are actually accepted by our - # compiler. If not (and OS X's ld, for instance, does not accept -z), - # then we can't do this test. - if test x"$done" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to check for GCC pthread/shared inconsistencies" >&5 -$as_echo_n "checking whether to check for GCC pthread/shared inconsistencies... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - -else - done=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - if test "x$done" = xyes ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - fi - fi - - if test x"$done" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -pthread is sufficient with -shared" >&5 -$as_echo_n "checking whether -pthread is sufficient with -shared... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - done=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - if test "x$done" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - fi - - # - # Linux gcc on some architectures such as mips/mipsel forgets - # about -lpthread - # - if test x"$done" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lpthread fixes that" >&5 -$as_echo_n "checking whether -lpthread fixes that... " >&6; } - LIBS="-lpthread $PTHREAD_LIBS $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - done=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - if test "x$done" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - PTHREAD_LIBS="-lpthread $PTHREAD_LIBS" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - fi - # - # FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc - # - if test x"$done" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc_r fixes that" >&5 -$as_echo_n "checking whether -lc_r fixes that... " >&6; } - LIBS="-lc_r $PTHREAD_LIBS $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - done=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - if test "x$done" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - PTHREAD_LIBS="-lc_r $PTHREAD_LIBS" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - fi - if test x"$done" = xno; then - # OK, we have run out of ideas - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Impossible to determine how to use pthreads with shared libraries" >&5 -$as_echo "$as_me: WARNING: Impossible to determine how to use pthreads with shared libraries" >&2;} - - # so it's not safe to assume that we may use pthreads - acx_pthread_ok=no - fi - - CFLAGS="$save_CFLAGS" - LIBS="$save_LIBS" - CC="$save_CC" -else - PTHREAD_CC="$CC" -fi - - - - - -# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$acx_pthread_ok" = xyes; then - -$as_echo "@%:@define HAVE_PTHREAD 1" >>confdefs.h - - : -else - acx_pthread_ok=no - if test "x$with_pthreads" != "xcheck"; then : - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "--with-pthreads was specified, but unable to be used -See \`config.log' for more details" "$LINENO" 5; } -fi -fi -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - - have_pthreads="$acx_pthread_ok" -fi - if test "x$have_pthreads" == "xyes"; then - HAVE_PTHREADS_TRUE= - HAVE_PTHREADS_FALSE='#' -else - HAVE_PTHREADS_TRUE='#' - HAVE_PTHREADS_FALSE= -fi - - - - -# TODO(chandlerc@google.com) Check for the necessary system headers. - -# TODO(chandlerc@google.com) Check the types, structures, and other compiler -# and architecture characteristics. - -# Output the generated files. No further autoconf macros may be used. -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIB@&t@OBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 -$as_echo_n "checking that generated files are newer than configure... " >&6; } - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 -$as_echo "done" >&6; } - if test -n "$EXEEXT"; then - am__EXEEXT_TRUE= - am__EXEEXT_FALSE='#' -else - am__EXEEXT_TRUE='#' - am__EXEEXT_FALSE= -fi - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error $? "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${HAVE_PYTHON_TRUE}" && test -z "${HAVE_PYTHON_FALSE}"; then - as_fn_error $? "conditional \"HAVE_PYTHON\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${HAVE_PTHREADS_TRUE}" && test -z "${HAVE_PTHREADS_FALSE}"; then - as_fn_error $? "conditional \"HAVE_PTHREADS\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in @%:@( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in @%:@(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] -@%:@ ---------------------------------------- -@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are -@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the -@%:@ script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} @%:@ as_fn_error - - -@%:@ as_fn_set_status STATUS -@%:@ ----------------------- -@%:@ Set @S|@? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} @%:@ as_fn_set_status - -@%:@ as_fn_exit STATUS -@%:@ ----------------- -@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} @%:@ as_fn_exit - -@%:@ as_fn_unset VAR -@%:@ --------------- -@%:@ Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -@%:@ as_fn_append VAR VALUE -@%:@ ---------------------- -@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take -@%:@ advantage of any shell optimizations that allow amortized linear growth over -@%:@ repeated appends, instead of the typical quadratic growth present in naive -@%:@ implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -@%:@ as_fn_arith ARG... -@%:@ ------------------ -@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the -@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments -@%:@ must be portable across @S|@(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -@%:@ as_fn_mkdir_p -@%:@ ------------- -@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} @%:@ as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - - -@%:@ as_fn_executable_p FILE -@%:@ ----------------------- -@%:@ Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} @%:@ as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by Google C++ Testing Framework $as_me 1.6.0, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -Google C++ Testing Framework config.status 1.6.0 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2012 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX -@%:@@%:@ Running $as_me. @%:@@%:@ -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' -macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' -enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' -enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' -pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' -SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' -ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' -PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' -host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' -host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' -host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' -build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' -build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' -build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' -SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' -Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' -GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' -EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' -FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' -LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' -NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' -LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' -ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' -exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' -lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' -lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' -lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' -reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' -file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' -want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' -DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' -sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' -AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' -archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' -STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' -RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' -lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' -CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' -compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' -GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' -nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' -lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' -objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' -need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' -MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' -LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' -OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' -libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' -module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' -postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' -need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' -version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' -runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' -libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' -soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' -install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' -finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' -old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' -striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' -predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' -postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' -predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' -postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' -LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' -reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' -reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' -GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' -inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' -link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' -always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' -exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' -predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' -postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' -predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' -postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in SHELL \ -ECHO \ -PATH_SEPARATOR \ -SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -OBJDUMP \ -deplibs_check_method \ -file_magic_cmd \ -file_magic_glob \ -want_nocaseglob \ -DLLTOOL \ -sharedlib_from_linklib_cmd \ -AR \ -AR_FLAGS \ -archiver_list_spec \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -nm_file_list_spec \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_pic \ -lt_prog_compiler_wl \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -MANIFEST_TOOL \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_separator \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -install_override_mode \ -finish_eval \ -old_striplib \ -striplib \ -compiler_lib_search_dirs \ -predep_objects \ -postdep_objects \ -predeps \ -postdeps \ -compiler_lib_search_path \ -LD_CXX \ -reload_flag_CXX \ -compiler_CXX \ -lt_prog_compiler_no_builtin_flag_CXX \ -lt_prog_compiler_pic_CXX \ -lt_prog_compiler_wl_CXX \ -lt_prog_compiler_static_CXX \ -lt_cv_prog_compiler_c_o_CXX \ -export_dynamic_flag_spec_CXX \ -whole_archive_flag_spec_CXX \ -compiler_needs_object_CXX \ -with_gnu_ld_CXX \ -allow_undefined_flag_CXX \ -no_undefined_flag_CXX \ -hardcode_libdir_flag_spec_CXX \ -hardcode_libdir_separator_CXX \ -exclude_expsyms_CXX \ -include_expsyms_CXX \ -file_list_spec_CXX \ -compiler_lib_search_dirs_CXX \ -predep_objects_CXX \ -postdep_objects_CXX \ -predeps_CXX \ -postdeps_CXX \ -compiler_lib_search_path_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postlink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec \ -reload_cmds_CXX \ -old_archive_cmds_CXX \ -old_archive_from_new_cmds_CXX \ -old_archive_from_expsyms_cmds_CXX \ -archive_cmds_CXX \ -archive_expsym_cmds_CXX \ -module_cmds_CXX \ -module_expsym_cmds_CXX \ -export_symbols_cmds_CXX \ -prelink_cmds_CXX \ -postlink_cmds_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' - -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile' - - - - - - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "build-aux/config.h") CONFIG_HEADERS="$CONFIG_HEADERS build-aux/config.h" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "scripts/gtest-config") CONFIG_FILES="$CONFIG_FILES scripts/gtest-config" ;; - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' >$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi -# Compute "$ac_file"'s index in $config_headers. -_am_arg="$ac_file" -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || -$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$_am_arg" : 'X\(//\)[^/]' \| \ - X"$_am_arg" : 'X\(//\)$' \| \ - X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'`/stamp-h$_am_stamp_count - ;; - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "scripts/gtest-config":F) chmod +x scripts/gtest-config ;; - "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Older Autoconf quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} - ;; - "libtool":C) - - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -# The names of the tagged configurations supported by this script. -available_tags="CXX " - -# ### BEGIN LIBTOOL CONFIG - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that protects backslashes. -ECHO=$lt_ECHO - -# The PATH separator for the build system. -PATH_SEPARATOR=$lt_PATH_SEPARATOR - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="\$SED -e 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# convert \$build file names to \$host format. -to_host_file_cmd=$lt_cv_to_host_file_cmd - -# convert \$build files to toolchain format. -to_tool_file_cmd=$lt_cv_to_tool_file_cmd - -# An object symbol dumper. -OBJDUMP=$lt_OBJDUMP - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method = "file_magic". -file_magic_cmd=$lt_file_magic_cmd - -# How to find potential files when deplibs_check_method = "file_magic". -file_magic_glob=$lt_file_magic_glob - -# Find potential files using nocaseglob when deplibs_check_method = "file_magic". -want_nocaseglob=$lt_want_nocaseglob - -# DLL creation program. -DLLTOOL=$lt_DLLTOOL - -# Command to associate shared and link libraries. -sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd - -# The archiver. -AR=$lt_AR - -# Flags to create an archive. -AR_FLAGS=$lt_AR_FLAGS - -# How to feed a file listing to the archiver. -archiver_list_spec=$lt_archiver_list_spec - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Whether to use a lock for old archive extraction. -lock_old_archive_extraction=$lock_old_archive_extraction - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration. -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair. -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# Specify filename containing input files for \$NM. -nm_file_list_spec=$lt_nm_file_list_spec - -# The root where to search for dependent libraries,and in which our libraries should be installed. -lt_sysroot=$lt_sysroot - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Manifest tool. -MANIFEST_TOOL=$lt_MANIFEST_TOOL - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# Do we need the "lib" prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Permission mode override for installation of shared libraries. -install_override_mode=$lt_install_override_mode - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Compile-time system search path for libraries. -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects -postdep_objects=$lt_postdep_objects -predeps=$lt_predeps -postdeps=$lt_postdeps - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path - -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - -ltmain="$ac_aux_dir/ltmain.sh" - - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - if test x"$xsi_shell" = xyes; then - sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ -func_dirname ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_basename ()$/,/^} # func_basename /c\ -func_basename ()\ -{\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ -func_dirname_and_basename ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ -func_stripname ()\ -{\ -\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ -\ # positional parameters, so assign one to ordinary parameter first.\ -\ func_stripname_result=${3}\ -\ func_stripname_result=${func_stripname_result#"${1}"}\ -\ func_stripname_result=${func_stripname_result%"${2}"}\ -} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ -func_split_long_opt ()\ -{\ -\ func_split_long_opt_name=${1%%=*}\ -\ func_split_long_opt_arg=${1#*=}\ -} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ -func_split_short_opt ()\ -{\ -\ func_split_short_opt_arg=${1#??}\ -\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ -} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ -func_lo2o ()\ -{\ -\ case ${1} in\ -\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ -\ *) func_lo2o_result=${1} ;;\ -\ esac\ -} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_xform ()$/,/^} # func_xform /c\ -func_xform ()\ -{\ - func_xform_result=${1%.*}.lo\ -} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_arith ()$/,/^} # func_arith /c\ -func_arith ()\ -{\ - func_arith_result=$(( $* ))\ -} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_len ()$/,/^} # func_len /c\ -func_len ()\ -{\ - func_len_result=${#1}\ -} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - -fi - -if test x"$lt_shell_append" = xyes; then - sed -e '/^func_append ()$/,/^} # func_append /c\ -func_append ()\ -{\ - eval "${1}+=\\${2}"\ -} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ -func_append_quoted ()\ -{\ -\ func_quote_for_eval "${2}"\ -\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ -} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 -$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} -fi - - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - - cat <<_LT_EOF >> "$ofile" - -# ### BEGIN LIBTOOL TAG CONFIG: CXX - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# How to create reloadable object files. -reload_flag=$lt_reload_flag_CXX -reload_cmds=$lt_reload_cmds_CXX - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds_CXX - -# A language specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU compiler? -with_gcc=$GCC_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object_CXX - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld_CXX - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute_CXX - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L_CXX - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic_CXX - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath_CXX - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_CXX - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols_CXX - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_CXX - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_CXX - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_CXX - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds_CXX - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds_CXX - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec_CXX - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects_CXX -postdep_objects=$lt_postdep_objects_CXX -predeps=$lt_predeps_CXX -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# ### END LIBTOOL TAG CONFIG: CXX -_LT_EOF - - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - diff --git a/vendor/gtest-1.6.0/autom4te.cache/output.2 b/vendor/gtest-1.6.0/autom4te.cache/output.2 deleted file mode 100644 index 4eeb1c84..00000000 --- a/vendor/gtest-1.6.0/autom4te.cache/output.2 +++ /dev/null @@ -1,18370 +0,0 @@ -@%:@! /bin/sh -@%:@ Guess values for system-dependent variables and create Makefiles. -@%:@ Generated by GNU Autoconf 2.69 for Google C++ Testing Framework 1.6.0. -@%:@ -@%:@ Report bugs to . -@%:@ -@%:@ -@%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -@%:@ -@%:@ -@%:@ This configure script is free software; the Free Software Foundation -@%:@ gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in @%:@( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in @%:@(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in @%:@ (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 - - test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in @%:@( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in @%:@ (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: googletestframework@googlegroups.com about your system, -$0: including any error possibly output before this -$0: message. Then install a modern shell, or manually run -$0: the script under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -@%:@ as_fn_unset VAR -@%:@ --------------- -@%:@ Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -@%:@ as_fn_set_status STATUS -@%:@ ----------------------- -@%:@ Set @S|@? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} @%:@ as_fn_set_status - -@%:@ as_fn_exit STATUS -@%:@ ----------------- -@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} @%:@ as_fn_exit - -@%:@ as_fn_mkdir_p -@%:@ ------------- -@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} @%:@ as_fn_mkdir_p - -@%:@ as_fn_executable_p FILE -@%:@ ----------------------- -@%:@ Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} @%:@ as_fn_executable_p -@%:@ as_fn_append VAR VALUE -@%:@ ---------------------- -@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take -@%:@ advantage of any shell optimizations that allow amortized linear growth over -@%:@ repeated appends, instead of the typical quadratic growth present in naive -@%:@ implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -@%:@ as_fn_arith ARG... -@%:@ ------------------ -@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the -@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments -@%:@ must be portable across @S|@(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] -@%:@ ---------------------------------------- -@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are -@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the -@%:@ script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} @%:@ as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -SHELL=${CONFIG_SHELL-/bin/sh} - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIB@&t@OBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='Google C++ Testing Framework' -PACKAGE_TARNAME='gtest' -PACKAGE_VERSION='1.6.0' -PACKAGE_STRING='Google C++ Testing Framework 1.6.0' -PACKAGE_BUGREPORT='googletestframework@googlegroups.com' -PACKAGE_URL='' - -ac_unique_file="./COPYING" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='am__EXEEXT_FALSE -am__EXEEXT_TRUE -LTLIBOBJS -LIB@&t@OBJS -HAVE_PTHREADS_FALSE -HAVE_PTHREADS_TRUE -PTHREAD_CFLAGS -PTHREAD_LIBS -PTHREAD_CC -acx_pthread_config -HAVE_PYTHON_FALSE -HAVE_PYTHON_TRUE -PYTHON -CXXCPP -CPP -OTOOL64 -OTOOL -LIPO -NMEDIT -DSYMUTIL -MANIFEST_TOOL -RANLIB -ac_ct_AR -AR -DLLTOOL -OBJDUMP -LN_S -NM -ac_ct_DUMPBIN -DUMPBIN -LD -FGREP -EGREP -GREP -SED -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -LIBTOOL -am__fastdepCXX_FALSE -am__fastdepCXX_TRUE -CXXDEPMODE -ac_ct_CXX -CXXFLAGS -CXX -am__fastdepCC_FALSE -am__fastdepCC_TRUE -CCDEPMODE -am__nodep -AMDEPBACKSLASH -AMDEP_FALSE -AMDEP_TRUE -am__quote -am__include -DEPDIR -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -AM_BACKSLASH -AM_DEFAULT_VERBOSITY -AM_DEFAULT_V -AM_V -am__untar -am__tar -AMTAR -am__leading_dot -SET_MAKE -AWK -mkdir_p -MKDIR_P -INSTALL_STRIP_PROGRAM -STRIP -install_sh -MAKEINFO -AUTOHEADER -AUTOMAKE -AUTOCONF -ACLOCAL -VERSION -PACKAGE -CYGPATH_W -am__isrc -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_silent_rules -enable_dependency_tracking -enable_shared -enable_static -with_pic -enable_fast_install -with_gnu_ld -with_sysroot -enable_libtool_lock -with_pthreads -' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CXX -CXXFLAGS -CCC -CPP -CXXCPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures Google C++ Testing Framework 1.6.0 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - @<:@@S|@ac_default_prefix@:>@ - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - @<:@PREFIX@:>@ - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gtest@:>@ - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of Google C++ Testing Framework 1.6.0:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-silent-rules less verbose build output (undo: "make V=1") - --disable-silent-rules verbose build output (undo: "make V=0") - --enable-dependency-tracking - do not reject slow dependency extractors - --disable-dependency-tracking - speeds up one-time build - --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ - --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ - --enable-fast-install@<:@=PKGS@:>@ - optimize for fast installation @<:@default=yes@:>@ - --disable-libtool-lock avoid locking (might break parallel builds) - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use - both@:>@ - --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ - --with-sysroot=DIR Search for dependent libraries within DIR - (or the compiler's sysroot if not specified). - --with-pthreads use pthreads (default is yes) - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CPP C preprocessor - CXXCPP C++ preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -Google C++ Testing Framework configure 1.6.0 -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -@%:@ ac_fn_c_try_compile LINENO -@%:@ -------------------------- -@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_compile - -@%:@ ac_fn_cxx_try_compile LINENO -@%:@ ---------------------------- -@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_compile - -@%:@ ac_fn_c_try_link LINENO -@%:@ ----------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_link - -@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -@%:@ ------------------------------------------------------- -@%:@ Tests whether HEADER exists and can be compiled using the include files in -@%:@ INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -@%:@include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_header_compile - -@%:@ ac_fn_c_try_cpp LINENO -@%:@ ---------------------- -@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_cpp - -@%:@ ac_fn_c_try_run LINENO -@%:@ ---------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes -@%:@ that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_run - -@%:@ ac_fn_c_check_func LINENO FUNC VAR -@%:@ ---------------------------------- -@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_func - -@%:@ ac_fn_cxx_try_cpp LINENO -@%:@ ------------------------ -@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_cpp - -@%:@ ac_fn_cxx_try_link LINENO -@%:@ ------------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_link -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by Google C++ Testing Framework $as_me 1.6.0, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in @%:@(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -# Provide various options to initialize the Autoconf and configure processes. - - - -ac_aux_dir= -for ac_dir in build-aux "$srcdir"/build-aux; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -ac_config_headers="$ac_config_headers build-aux/config.h" - -ac_config_files="$ac_config_files Makefile" - -ac_config_files="$ac_config_files scripts/gtest-config" - - -# Initialize Automake with various options. We require at least v1.9, prevent -# pedantic complaints about package files, and enable various distribution -# targets. -am__api_version='1.14' - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in @%:@(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; -esac - -# Do 'set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken - alias in your environment" "$LINENO" 5 - fi - if test "$2" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi - -rm -f conftest.file - -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} -fi - -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi - -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS - -fi - - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -@%:@ Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : - enableval=$enable_silent_rules; -fi - -case $enable_silent_rules in @%:@ ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=1;; -esac -am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AM_BACKSLASH='\' - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE='gtest' - VERSION='1.6.0' - - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -@%:@define VERSION "$VERSION" -_ACEOF - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -mkdir_p='$(MKDIR_P)' - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' - - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar pax cpio none' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' - - - - - - -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. - -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . - -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. - -END - as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 - fi -fi - -# Check for programs used in building Google Test. -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $@%:@ != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 - ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -@%:@ Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -depcc="$CXX" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.4.2' -macro_revision='1.3337' - - - - - - - - - - - - - -ltmain="$ac_aux_dir/ltmain.sh" - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} - -case "$ECHO" in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; -esac - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_SED" || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_FGREP" || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -@%:@ Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DUMPBIN" && break - done -fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DUMPBIN=$ac_ct_DUMPBIN - fi -fi - - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac - -fi - -if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - - - - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } - - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac - -fi - -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac - -fi - -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then - reload_cmds=false - fi - ;; - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - - - - - - - - - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - - - - - - - - -if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AR" && break - done -fi -if test -z "$AR"; then - ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_AR" && break -done - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -fi - -: ${AR=ar} -: ${AR_FLAGS=cru} - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ar_at_file=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT@&t@_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT@&t@_DLSYM_CONST -#else -# define LT@&t@_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT@&t@_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done - -fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } - -@%:@ Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : - withval=$with_sysroot; -else - with_sysroot=no -fi - - -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 -$as_echo "${with_sysroot}" >&6; } - as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 - ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } - - - - - - -@%:@ Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : - enableval=$enable_libtool_lock; -fi - -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - lt_cv_cc_needs_belf=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL - fi -else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" -fi - -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi - - - - - - - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&5 - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&5 - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -@%:@define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - -func_stripname_cnf () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname_cnf - - - - - -# Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - - - @%:@ Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=yes -fi - - - - - - - - - - @%:@ Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_static=yes -fi - - - - - - - - - - -@%:@ Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : - withval=$with_pic; lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for lt_pkg in $withval; do - IFS="$lt_save_ifs" - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - pic_mode=default -fi - - -test -z "$pic_mode" && pic_mode=default - - - - - - - - @%:@ Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_fast_install=yes -fi - - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -@%:@define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -lt_save_CC="$CC" -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then - -lt_prog_compiler_no_builtin_flag= - -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } - -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : -fi - -fi - - - - - - - lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - - - if test "$GCC" = yes; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - if test -n "$lt_prog_compiler_pic"; then - lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" - fi - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ F* | *Sun*Fortran*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - *Intel*\ [CF]*Compiler*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - *Portland\ Group*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works" = xyes; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi - -fi - - - - - - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } - -if test x"$lt_cv_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - ld_shlibs=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='${wl}--export-all-symbols' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs=yes - ;; - - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = no; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds='' - hardcode_direct=yes - hardcode_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='${wl}-f,' - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' ${wl}-bernotok' - allow_undefined_flag=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - enable_shared_with_static_runtimes=yes - ;; - esac - ;; - - darwin* | rhapsody*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - - else - ld_shlibs=no - fi - - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler__b=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } - -if test x"$lt_cv_prog_compiler__b" = xyes; then - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_irix_exported_symbol=yes -else - lt_cv_irix_exported_symbol=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test "$lt_cv_irix_exported_symbol" = yes; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - else - ld_shlibs=no - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' - ;; - esac - fi - fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([A-Za-z]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test "X$hardcode_automatic" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } - -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - ac_cv_lib_dld_shl_load=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi - - - - - - - - - - - - - # Report which library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } - - - - -fi -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -CC="$lt_save_CC" - - if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 -$as_echo_n "checking how to run the C++ preprocessor... " >&6; } -if test -z "$CXXCPP"; then - if ${ac_cv_prog_CXXCPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 -$as_echo "$CXXCPP" >&6; } -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -else - _lt_caught_CXX_error=yes -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -compiler_needs_object_CXX=no -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_direct_absolute_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_shlibpath_var_CXX=unsupported -hardcode_automatic_CXX=no -inherit_rpath_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -reload_flag_CXX=$reload_flag -reload_cmds_CXX=$reload_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - - # save warnings/boilerplate of simple test code - ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - - ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - compiler_CXX=$CC - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' - else - lt_prog_compiler_no_builtin_flag_CXX= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - - -@%:@ Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_CXX= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - ld_shlibs_CXX=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_CXX='' - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - file_list_spec_CXX='${wl}-f,' - - if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct_CXX=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_CXX=yes - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_libdir_separator_CXX= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec_CXX='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - always_export_symbols_CXX=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_CXX='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - - archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_CXX="-z nodefs" - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_CXX=' ${wl}-bernotok' - allow_undefined_flag_CXX=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX='$convenience' - fi - archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_CXX=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_CXX=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_CXX=' ' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=yes - file_list_spec_CXX='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' - enable_shared_with_static_runtimes_CXX=yes - # Don't use ranlib - old_postinstall_cmds_CXX='chmod 644 $oldlib' - postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=no - enable_shared_with_static_runtimes_CXX=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs_CXX=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - - - archive_cmds_need_lc_CXX=no - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec_CXX='' - fi - link_all_deplibs_CXX=yes - allow_undefined_flag_CXX="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - if test "$lt_cv_apple_cc_single_mod" != "yes"; then - archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" - fi - - else - ld_shlibs_CXX=no - fi - - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - freebsd2.*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - ld_shlibs_CXX=no - ;; - - freebsd-elf*) - archive_cmds_need_lc_CXX=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - - gnu*) - ;; - - haiku*) - archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs_CXX=yes - ;; - - hpux9*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - export_dynamic_flag_spec_CXX='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - *) - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - interix[3-9]*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' - fi - fi - link_all_deplibs_CXX=yes - ;; - esac - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - inherit_rpath_CXX=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [1-5].* | *pgcpp\ [1-5].*) - prelink_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - old_archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - hardcode_libdir_flag_spec_CXX='-R$libdir' - whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object_CXX=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - ld_shlibs_CXX=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - ld_shlibs_CXX=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - hardcode_direct_absolute_CXX=yes - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - export_dynamic_flag_spec_CXX='${wl}-E' - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - ld_shlibs_CXX=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - case $host in - osf3*) - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - ;; - *) - allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - ;; - esac - - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_shlibpath_var_CXX=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - no_undefined_flag_CXX=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - fi - - hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag_CXX='${wl}-z,text' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag_CXX='${wl}-z,text' - allow_undefined_flag_CXX='${wl}-z,nodefs' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - export_dynamic_flag_spec_CXX='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ - '"$old_archive_cmds_CXX" - reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ - '"$reload_cmds_CXX" - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } - test "$ld_shlibs_CXX" = no && can_build_shared=no - - GCC_CXX="$GXX" - LD_CXX="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - # Dependencies to place before and after the object being linked: -predep_objects_CXX= -postdep_objects_CXX= -predeps_CXX= -postdeps_CXX= -compiler_lib_search_path_CXX= - -cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF - - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; -esac - -if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" || - test $p = "-R"; then - prev=$p - continue - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$compiler_lib_search_path_CXX"; then - compiler_lib_search_path_CXX="${prev}${p}" - else - compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$postdeps_CXX"; then - postdeps_CXX="${prev}${p}" - else - postdeps_CXX="${postdeps_CXX} ${prev}${p}" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$predep_objects_CXX"; then - predep_objects_CXX="$p" - else - predep_objects_CXX="$predep_objects_CXX $p" - fi - else - if test -z "$postdep_objects_CXX"; then - postdep_objects_CXX="$p" - else - postdep_objects_CXX="$postdep_objects_CXX $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling CXX test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -case $host_os in -interix[3-9]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - predep_objects_CXX= - postdep_objects_CXX= - postdeps_CXX= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac - - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - compiler_lib_search_dirs_CXX= -if test -n "${compiler_lib_search_path_CXX}"; then - compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= - - - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic_CXX='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_CXX='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - lt_prog_compiler_pic_CXX= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static_CXX= - ;; - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix[4-9]*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - else - lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - dgux*) - case $cc_basename in - ec++*) - lt_prog_compiler_pic_CXX='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - lt_prog_compiler_pic_CXX='+Z' - fi - ;; - aCC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - lt_prog_compiler_static_CXX='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fpic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-qpic' - lt_prog_compiler_static_CXX='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd*) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - lt_prog_compiler_wl_CXX='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - lt_prog_compiler_pic_CXX='-pic' - ;; - cxx*) - # Digital/Compaq C++ - lt_prog_compiler_wl_CXX='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - lt_prog_compiler_pic_CXX='-pic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - lcc*) - # Lucid - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - lt_prog_compiler_pic_CXX='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - lt_prog_compiler_can_build_shared_CXX=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_CXX= - ;; - *) - lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } -lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } -if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works_CXX=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then - case $lt_prog_compiler_pic_CXX in - "" | " "*) ;; - *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; - esac -else - lt_prog_compiler_pic_CXX= - lt_prog_compiler_can_build_shared_CXX=no -fi - -fi - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works_CXX=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works_CXX=yes - fi - else - lt_cv_prog_compiler_static_works_CXX=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then - : -else - lt_prog_compiler_static_CXX= -fi - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - case $host_os in - aix[4-9]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - export_symbols_cmds_CXX="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) - exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - ;; - esac - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } -test "$ld_shlibs_CXX" = no && can_build_shared=no - -with_gnu_ld_CXX=$with_gnu_ld - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_CXX" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_CXX=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_CXX in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - pic_flag=$lt_prog_compiler_pic_CXX - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_CXX - allow_undefined_flag_CXX= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc_CXX=no - else - lt_cv_archive_cmds_need_lc_CXX=yes - fi - allow_undefined_flag_CXX=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } - archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action_CXX= -if test -n "$hardcode_libdir_flag_spec_CXX" || - test -n "$runpath_var_CXX" || - test "X$hardcode_automatic_CXX" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct_CXX" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && - test "$hardcode_minus_L_CXX" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_CXX=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_CXX=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_CXX=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 -$as_echo "$hardcode_action_CXX" >&6; } - -if test "$hardcode_action_CXX" = relink || - test "$inherit_rpath_CXX" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - -# TODO(chandlerc@google.com): Currently we aren't running the Python tests -# against the interpreter detected by AM_PATH_PYTHON, and so we condition -# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's -# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env" -# hashbang. -PYTHON= # We *do not* allow the user to specify a python interpreter -# Extract the first word of "python", so it can be a program name with args. -set dummy python; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PYTHON+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $PYTHON in - [\\/]* | ?:[\\/]*) - ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_path_PYTHON" && ac_cv_path_PYTHON=":" - ;; -esac -fi -PYTHON=$ac_cv_path_PYTHON -if test -n "$PYTHON"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 -$as_echo "$PYTHON" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -if test "$PYTHON" != ":"; then : - prog="import sys -# split strings by '.' and convert to numeric. Append some zeros -# because we need at least 4 digits for the hex conversion. -# map returns an iterator in Python 3.0 and a list in 2.x -minver = list(map(int, '2.3'.split('.'))) + [0, 0, 0] -minverhex = 0 -# xrange is not present in Python 3.0 and range returns an iterator -for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] -sys.exit(sys.hexversion < minverhex)" - if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5 - ($PYTHON -c "$prog") >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then : - : -else - PYTHON=":" -fi -fi - if test "$PYTHON" != ":"; then - HAVE_PYTHON_TRUE= - HAVE_PYTHON_FALSE='#' -else - HAVE_PYTHON_TRUE='#' - HAVE_PYTHON_FALSE= -fi - - -# Configure pthreads. - -@%:@ Check whether --with-pthreads was given. -if test "${with_pthreads+set}" = set; then : - withval=$with_pthreads; with_pthreads=$withval -else - with_pthreads=check -fi - - -have_pthreads=no -if test "x$with_pthreads" != "xno"; then : - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -acx_pthread_ok=no - -# We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on True64 or Sequent). -# It gets checked for in the link test anyway. - -# First of all, check if the user has set any of the PTHREAD_LIBS, -# etcetera environment variables, and if threads linking works using -# them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 -$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_join (); -int -main () -{ -return pthread_join (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - acx_pthread_ok=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 -$as_echo "$acx_pthread_ok" >&6; } - if test x"$acx_pthread_ok" = xno; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" - fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" -fi - -# We must check for the threads library under a number of different -# names; the ordering is very important because some systems -# (e.g. DEC) have both -lpthread and -lpthreads, where one of the -# libraries is broken (non-POSIX). - -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all, and "pthread-config" -# which is a program returning the flags for the Pth emulation library. - -acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" - -# The ordering *is* (sometimes) important. Some notes on the -# individual items follow: - -# pthreads: AIX (must check this before -lpthread) -# none: in case threads are in libc; should be tried before -Kthread and -# other compiler flags to prevent continual compiler warnings -# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc -# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# ... -mt is also the pthreads flag for HP/aCC -# pthread: Linux, etcetera -# --thread-safe: KAI C++ -# pthread-config: use pthread-config program (for GNU Pth library) - -case "${host_cpu}-${host_os}" in - *solaris*) - - # On Solaris (at least, for some versions), libc contains stubbed - # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (We need to link with -pthreads/-mt/ - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather - # a function called by this macro, so we could check for that, but - # who knows whether they'll stub that too in a future libc.) So, - # we'll just look for -pthreads and -lpthread first: - - acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" - ;; -esac - -if test x"$acx_pthread_ok" = xno; then -for flag in $acx_pthread_flags; do - - case $flag in - none) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 -$as_echo_n "checking whether pthreads work without any flags... " >&6; } - ;; - - -*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 -$as_echo_n "checking whether pthreads work with $flag... " >&6; } - PTHREAD_CFLAGS="$flag" - ;; - - pthread-config) - # Extract the first word of "pthread-config", so it can be a program name with args. -set dummy pthread-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_acx_pthread_config+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$acx_pthread_config"; then - ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_acx_pthread_config="yes" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no" -fi -fi -acx_pthread_config=$ac_cv_prog_acx_pthread_config -if test -n "$acx_pthread_config"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_config" >&5 -$as_echo "$acx_pthread_config" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - if test x"$acx_pthread_config" = xno; then continue; fi - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; - - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 -$as_echo_n "checking for the pthreads library -l$flag... " >&6; } - PTHREAD_LIBS="-l$flag" - ;; - esac - - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - acx_pthread_ok=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 -$as_echo "$acx_pthread_ok" >&6; } - if test "x$acx_pthread_ok" = xyes; then - break; - fi - - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" -done -fi - -# Various other checks: -if test "x$acx_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 -$as_echo_n "checking for joinable pthread attribute... " >&6; } - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -int attr=$attr; return attr; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - attr_name=$attr; break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 -$as_echo "$attr_name" >&6; } - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then - -cat >>confdefs.h <<_ACEOF -@%:@define PTHREAD_CREATE_JOINABLE $attr_name -_ACEOF - - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 -$as_echo_n "checking if more special flags are required for pthreads... " >&6; } - flag=no - case "${host_cpu}-${host_os}" in - *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; - *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 -$as_echo "${flag}" >&6; } - if test "x$flag" != xno; then - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" - fi - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - # More AIX lossage: must compile with xlc_r or cc_r - if test x"$GCC" != xyes; then - for ac_prog in xlc_r cc_r -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_PTHREAD_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$PTHREAD_CC"; then - ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_PTHREAD_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -PTHREAD_CC=$ac_cv_prog_PTHREAD_CC -if test -n "$PTHREAD_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 -$as_echo "$PTHREAD_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$PTHREAD_CC" && break -done -test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" - - else - PTHREAD_CC=$CC - fi - - # The next part tries to detect GCC inconsistency with -shared on some - # architectures and systems. The problem is that in certain - # configurations, when -shared is specified, GCC "forgets" to - # internally use various flags which are still necessary. - - # - # Prepare the flags - # - save_CFLAGS="$CFLAGS" - save_LIBS="$LIBS" - save_CC="$CC" - - # Try with the flags determined by the earlier checks. - # - # -Wl,-z,defs forces link-time symbol resolution, so that the - # linking checks with -shared actually have any value - # - # FIXME: -fPIC is required for -shared on many architectures, - # so we specify it here, but the right way would probably be to - # properly detect whether it is actually required. - CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CC="$PTHREAD_CC" - - # In order not to create several levels of indentation, we test - # the value of "$done" until we find the cure or run out of ideas. - done="no" - - # First, make sure the CFLAGS we added are actually accepted by our - # compiler. If not (and OS X's ld, for instance, does not accept -z), - # then we can't do this test. - if test x"$done" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to check for GCC pthread/shared inconsistencies" >&5 -$as_echo_n "checking whether to check for GCC pthread/shared inconsistencies... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - -else - done=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - if test "x$done" = xyes ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - fi - fi - - if test x"$done" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -pthread is sufficient with -shared" >&5 -$as_echo_n "checking whether -pthread is sufficient with -shared... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - done=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - if test "x$done" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - fi - - # - # Linux gcc on some architectures such as mips/mipsel forgets - # about -lpthread - # - if test x"$done" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lpthread fixes that" >&5 -$as_echo_n "checking whether -lpthread fixes that... " >&6; } - LIBS="-lpthread $PTHREAD_LIBS $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - done=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - if test "x$done" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - PTHREAD_LIBS="-lpthread $PTHREAD_LIBS" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - fi - # - # FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc - # - if test x"$done" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc_r fixes that" >&5 -$as_echo_n "checking whether -lc_r fixes that... " >&6; } - LIBS="-lc_r $PTHREAD_LIBS $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - done=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - if test "x$done" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - PTHREAD_LIBS="-lc_r $PTHREAD_LIBS" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - fi - if test x"$done" = xno; then - # OK, we have run out of ideas - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Impossible to determine how to use pthreads with shared libraries" >&5 -$as_echo "$as_me: WARNING: Impossible to determine how to use pthreads with shared libraries" >&2;} - - # so it's not safe to assume that we may use pthreads - acx_pthread_ok=no - fi - - CFLAGS="$save_CFLAGS" - LIBS="$save_LIBS" - CC="$save_CC" -else - PTHREAD_CC="$CC" -fi - - - - - -# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$acx_pthread_ok" = xyes; then - -$as_echo "@%:@define HAVE_PTHREAD 1" >>confdefs.h - - : -else - acx_pthread_ok=no - if test "x$with_pthreads" != "xcheck"; then : - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "--with-pthreads was specified, but unable to be used -See \`config.log' for more details" "$LINENO" 5; } -fi -fi -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - - have_pthreads="$acx_pthread_ok" -fi - if test "x$have_pthreads" == "xyes"; then - HAVE_PTHREADS_TRUE= - HAVE_PTHREADS_FALSE='#' -else - HAVE_PTHREADS_TRUE='#' - HAVE_PTHREADS_FALSE= -fi - - - - -# TODO(chandlerc@google.com) Check for the necessary system headers. - -# TODO(chandlerc@google.com) Check the types, structures, and other compiler -# and architecture characteristics. - -# Output the generated files. No further autoconf macros may be used. -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIB@&t@OBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 -$as_echo_n "checking that generated files are newer than configure... " >&6; } - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 -$as_echo "done" >&6; } - if test -n "$EXEEXT"; then - am__EXEEXT_TRUE= - am__EXEEXT_FALSE='#' -else - am__EXEEXT_TRUE='#' - am__EXEEXT_FALSE= -fi - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error $? "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${HAVE_PYTHON_TRUE}" && test -z "${HAVE_PYTHON_FALSE}"; then - as_fn_error $? "conditional \"HAVE_PYTHON\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${HAVE_PTHREADS_TRUE}" && test -z "${HAVE_PTHREADS_FALSE}"; then - as_fn_error $? "conditional \"HAVE_PTHREADS\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in @%:@( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in @%:@(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] -@%:@ ---------------------------------------- -@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are -@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the -@%:@ script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} @%:@ as_fn_error - - -@%:@ as_fn_set_status STATUS -@%:@ ----------------------- -@%:@ Set @S|@? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} @%:@ as_fn_set_status - -@%:@ as_fn_exit STATUS -@%:@ ----------------- -@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} @%:@ as_fn_exit - -@%:@ as_fn_unset VAR -@%:@ --------------- -@%:@ Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -@%:@ as_fn_append VAR VALUE -@%:@ ---------------------- -@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take -@%:@ advantage of any shell optimizations that allow amortized linear growth over -@%:@ repeated appends, instead of the typical quadratic growth present in naive -@%:@ implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -@%:@ as_fn_arith ARG... -@%:@ ------------------ -@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the -@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments -@%:@ must be portable across @S|@(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -@%:@ as_fn_mkdir_p -@%:@ ------------- -@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} @%:@ as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - - -@%:@ as_fn_executable_p FILE -@%:@ ----------------------- -@%:@ Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} @%:@ as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by Google C++ Testing Framework $as_me 1.6.0, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -Google C++ Testing Framework config.status 1.6.0 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2012 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX -@%:@@%:@ Running $as_me. @%:@@%:@ -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' -macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' -enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' -enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' -pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' -SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' -ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' -PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' -host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' -host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' -host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' -build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' -build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' -build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' -SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' -Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' -GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' -EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' -FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' -LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' -NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' -LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' -ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' -exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' -lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' -lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' -lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' -reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' -file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' -want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' -DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' -sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' -AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' -archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' -STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' -RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' -lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' -CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' -compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' -GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' -nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' -lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' -objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' -need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' -MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' -LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' -OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' -libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' -module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' -postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' -need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' -version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' -runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' -libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' -soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' -install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' -finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' -old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' -striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' -predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' -postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' -predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' -postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' -LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' -reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' -reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' -GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' -inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' -link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' -always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' -exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' -predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' -postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' -predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' -postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in SHELL \ -ECHO \ -PATH_SEPARATOR \ -SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -OBJDUMP \ -deplibs_check_method \ -file_magic_cmd \ -file_magic_glob \ -want_nocaseglob \ -DLLTOOL \ -sharedlib_from_linklib_cmd \ -AR \ -AR_FLAGS \ -archiver_list_spec \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -nm_file_list_spec \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_pic \ -lt_prog_compiler_wl \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -MANIFEST_TOOL \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_separator \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -install_override_mode \ -finish_eval \ -old_striplib \ -striplib \ -compiler_lib_search_dirs \ -predep_objects \ -postdep_objects \ -predeps \ -postdeps \ -compiler_lib_search_path \ -LD_CXX \ -reload_flag_CXX \ -compiler_CXX \ -lt_prog_compiler_no_builtin_flag_CXX \ -lt_prog_compiler_pic_CXX \ -lt_prog_compiler_wl_CXX \ -lt_prog_compiler_static_CXX \ -lt_cv_prog_compiler_c_o_CXX \ -export_dynamic_flag_spec_CXX \ -whole_archive_flag_spec_CXX \ -compiler_needs_object_CXX \ -with_gnu_ld_CXX \ -allow_undefined_flag_CXX \ -no_undefined_flag_CXX \ -hardcode_libdir_flag_spec_CXX \ -hardcode_libdir_separator_CXX \ -exclude_expsyms_CXX \ -include_expsyms_CXX \ -file_list_spec_CXX \ -compiler_lib_search_dirs_CXX \ -predep_objects_CXX \ -postdep_objects_CXX \ -predeps_CXX \ -postdeps_CXX \ -compiler_lib_search_path_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postlink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec \ -reload_cmds_CXX \ -old_archive_cmds_CXX \ -old_archive_from_new_cmds_CXX \ -old_archive_from_expsyms_cmds_CXX \ -archive_cmds_CXX \ -archive_expsym_cmds_CXX \ -module_cmds_CXX \ -module_expsym_cmds_CXX \ -export_symbols_cmds_CXX \ -prelink_cmds_CXX \ -postlink_cmds_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' - -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile' - - - - - - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "build-aux/config.h") CONFIG_HEADERS="$CONFIG_HEADERS build-aux/config.h" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "scripts/gtest-config") CONFIG_FILES="$CONFIG_FILES scripts/gtest-config" ;; - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' >$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi -# Compute "$ac_file"'s index in $config_headers. -_am_arg="$ac_file" -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || -$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$_am_arg" : 'X\(//\)[^/]' \| \ - X"$_am_arg" : 'X\(//\)$' \| \ - X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'`/stamp-h$_am_stamp_count - ;; - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "scripts/gtest-config":F) chmod +x scripts/gtest-config ;; - "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Older Autoconf quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} - ;; - "libtool":C) - - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -# The names of the tagged configurations supported by this script. -available_tags="CXX " - -# ### BEGIN LIBTOOL CONFIG - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that protects backslashes. -ECHO=$lt_ECHO - -# The PATH separator for the build system. -PATH_SEPARATOR=$lt_PATH_SEPARATOR - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="\$SED -e 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# convert \$build file names to \$host format. -to_host_file_cmd=$lt_cv_to_host_file_cmd - -# convert \$build files to toolchain format. -to_tool_file_cmd=$lt_cv_to_tool_file_cmd - -# An object symbol dumper. -OBJDUMP=$lt_OBJDUMP - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method = "file_magic". -file_magic_cmd=$lt_file_magic_cmd - -# How to find potential files when deplibs_check_method = "file_magic". -file_magic_glob=$lt_file_magic_glob - -# Find potential files using nocaseglob when deplibs_check_method = "file_magic". -want_nocaseglob=$lt_want_nocaseglob - -# DLL creation program. -DLLTOOL=$lt_DLLTOOL - -# Command to associate shared and link libraries. -sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd - -# The archiver. -AR=$lt_AR - -# Flags to create an archive. -AR_FLAGS=$lt_AR_FLAGS - -# How to feed a file listing to the archiver. -archiver_list_spec=$lt_archiver_list_spec - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Whether to use a lock for old archive extraction. -lock_old_archive_extraction=$lock_old_archive_extraction - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration. -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair. -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# Specify filename containing input files for \$NM. -nm_file_list_spec=$lt_nm_file_list_spec - -# The root where to search for dependent libraries,and in which our libraries should be installed. -lt_sysroot=$lt_sysroot - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Manifest tool. -MANIFEST_TOOL=$lt_MANIFEST_TOOL - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# Do we need the "lib" prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Permission mode override for installation of shared libraries. -install_override_mode=$lt_install_override_mode - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Compile-time system search path for libraries. -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects -postdep_objects=$lt_postdep_objects -predeps=$lt_predeps -postdeps=$lt_postdeps - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path - -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - -ltmain="$ac_aux_dir/ltmain.sh" - - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - if test x"$xsi_shell" = xyes; then - sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ -func_dirname ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_basename ()$/,/^} # func_basename /c\ -func_basename ()\ -{\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ -func_dirname_and_basename ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ -func_stripname ()\ -{\ -\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ -\ # positional parameters, so assign one to ordinary parameter first.\ -\ func_stripname_result=${3}\ -\ func_stripname_result=${func_stripname_result#"${1}"}\ -\ func_stripname_result=${func_stripname_result%"${2}"}\ -} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ -func_split_long_opt ()\ -{\ -\ func_split_long_opt_name=${1%%=*}\ -\ func_split_long_opt_arg=${1#*=}\ -} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ -func_split_short_opt ()\ -{\ -\ func_split_short_opt_arg=${1#??}\ -\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ -} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ -func_lo2o ()\ -{\ -\ case ${1} in\ -\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ -\ *) func_lo2o_result=${1} ;;\ -\ esac\ -} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_xform ()$/,/^} # func_xform /c\ -func_xform ()\ -{\ - func_xform_result=${1%.*}.lo\ -} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_arith ()$/,/^} # func_arith /c\ -func_arith ()\ -{\ - func_arith_result=$(( $* ))\ -} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_len ()$/,/^} # func_len /c\ -func_len ()\ -{\ - func_len_result=${#1}\ -} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - -fi - -if test x"$lt_shell_append" = xyes; then - sed -e '/^func_append ()$/,/^} # func_append /c\ -func_append ()\ -{\ - eval "${1}+=\\${2}"\ -} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ -func_append_quoted ()\ -{\ -\ func_quote_for_eval "${2}"\ -\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ -} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 -$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} -fi - - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - - cat <<_LT_EOF >> "$ofile" - -# ### BEGIN LIBTOOL TAG CONFIG: CXX - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# How to create reloadable object files. -reload_flag=$lt_reload_flag_CXX -reload_cmds=$lt_reload_cmds_CXX - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds_CXX - -# A language specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU compiler? -with_gcc=$GCC_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object_CXX - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld_CXX - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute_CXX - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L_CXX - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic_CXX - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath_CXX - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_CXX - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols_CXX - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_CXX - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_CXX - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_CXX - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds_CXX - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds_CXX - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec_CXX - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects_CXX -postdep_objects=$lt_postdep_objects_CXX -predeps=$lt_predeps_CXX -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# ### END LIBTOOL TAG CONFIG: CXX -_LT_EOF - - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - diff --git a/vendor/gtest-1.6.0/autom4te.cache/requests b/vendor/gtest-1.6.0/autom4te.cache/requests deleted file mode 100644 index 7ffad672..00000000 --- a/vendor/gtest-1.6.0/autom4te.cache/requests +++ /dev/null @@ -1,527 +0,0 @@ -# This file was generated. -# It contains the lists of macros which have been traced. -# It can be safely removed. - -@request = ( - bless( [ - '0', - 1, - [ - '/usr/local/Cellar/autoconf/2.69/share/autoconf' - ], - [ - '/usr/local/Cellar/autoconf/2.69/share/autoconf/autoconf/autoconf.m4f', - '-', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/internal/ac-config-macro-dirs.m4', - '/usr/local/share/aclocal/argz.m4', - '/usr/local/share/aclocal/libtool.m4', - '/usr/local/share/aclocal/ltdl.m4', - '/usr/local/share/aclocal/lt~obsolete.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/amversion.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/auxdir.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/cond.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/depend.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/depout.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/init.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/install-sh.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/lead-dot.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/make.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/missing.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/options.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/prog-cc-c-o.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/python.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/runlog.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/sanity.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/silent.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/strip.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/substnot.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/tar.m4', - 'm4/ltoptions.m4', - 'm4/ltsugar.m4', - 'm4/ltversion.m4', - 'm4/lt~obsolete.m4', - 'configure.ac' - ], - { - 'AM_ENABLE_STATIC' => 1, - 'AC_LIBTOOL_LANG_RC_CONFIG' => 1, - '_LT_AC_SHELL_INIT' => 1, - 'AC_DEFUN' => 1, - 'AC_PROG_LIBTOOL' => 1, - '_LT_AC_LANG_CXX_CONFIG' => 1, - 'AM_PYTHON_CHECK_VERSION' => 1, - 'AM_AUTOMAKE_VERSION' => 1, - 'AM_SUBST_NOTMAKE' => 1, - 'AM_MISSING_PROG' => 1, - 'AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH' => 1, - '_LT_AC_LANG_C_CONFIG' => 1, - 'AM_PROG_INSTALL_STRIP' => 1, - '_m4_warn' => 1, - 'AC_LIBTOOL_OBJDIR' => 1, - 'gl_FUNC_ARGZ' => 1, - 'AM_SANITY_CHECK' => 1, - 'LTOBSOLETE_VERSION' => 1, - 'AC_LIBTOOL_LANG_GCJ_CONFIG' => 1, - 'AC_LIBTOOL_PROG_COMPILER_PIC' => 1, - 'LT_LIB_M' => 1, - '_LT_AC_CHECK_DLFCN' => 1, - 'AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE' => 1, - 'LTSUGAR_VERSION' => 1, - '_LT_PROG_LTMAIN' => 1, - 'LT_SYS_SYMBOL_USCORE' => 1, - '_AM_PROG_TAR' => 1, - 'AC_LIBTOOL_GCJ' => 1, - '_LT_WITH_SYSROOT' => 1, - 'LT_FUNC_DLSYM_USCORE' => 1, - 'LT_SYS_DLOPEN_DEPLIBS' => 1, - 'AC_LIBTOOL_CONFIG' => 1, - '_LT_AC_LANG_F77' => 1, - 'AC_CONFIG_MACRO_DIR' => 1, - '_AM_SUBST_NOTMAKE' => 1, - 'AC_LTDL_DLLIB' => 1, - '_AM_AUTOCONF_VERSION' => 1, - 'AM_DISABLE_SHARED' => 1, - '_LT_PROG_ECHO_BACKSLASH' => 1, - '_LTDL_SETUP' => 1, - '_LT_AC_LANG_CXX' => 1, - 'AM_PROG_LIBTOOL' => 1, - 'AC_LIB_LTDL' => 1, - '_LT_AC_FILE_LTDLL_C' => 1, - 'AM_PROG_LD' => 1, - 'AU_DEFUN' => 1, - 'AC_PROG_NM' => 1, - 'AC_LIBTOOL_DLOPEN' => 1, - 'AC_PROG_LD' => 1, - 'AC_PROG_LD_GNU' => 1, - 'AC_ENABLE_FAST_INSTALL' => 1, - 'AC_LIBTOOL_FC' => 1, - 'LTDL_CONVENIENCE' => 1, - '_AM_SET_OPTION' => 1, - 'AC_LTDL_PREOPEN' => 1, - '_LT_LINKER_BOILERPLATE' => 1, - '_LT_PREPARE_SED_QUOTE_VARS' => 1, - 'AC_LIBTOOL_LANG_CXX_CONFIG' => 1, - 'AC_LIBTOOL_PROG_CC_C_O' => 1, - 'gl_PREREQ_ARGZ' => 1, - 'LT_SUPPORTED_TAG' => 1, - 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, - 'LT_SYS_MODULE_EXT' => 1, - 'LT_PROG_RC' => 1, - 'AC_DEFUN_ONCE' => 1, - '_LT_AC_LANG_GCJ' => 1, - 'AC_LTDL_OBJDIR' => 1, - '_LT_PATH_TOOL_PREFIX' => 1, - 'AC_LIBTOOL_RC' => 1, - 'AM_SILENT_RULES' => 1, - 'AC_DISABLE_FAST_INSTALL' => 1, - '_LT_AC_PROG_ECHO_BACKSLASH' => 1, - '_LT_AC_SYS_LIBPATH_AIX' => 1, - '_LT_AC_TRY_DLOPEN_SELF' => 1, - 'include' => 1, - 'LT_AC_PROG_SED' => 1, - 'AM_ENABLE_SHARED' => 1, - 'LTDL_INSTALLABLE' => 1, - '_LT_AC_LANG_GCJ_CONFIG' => 1, - 'AC_ENABLE_SHARED' => 1, - 'AC_ENABLE_STATIC' => 1, - 'AC_LIBTOOL_SYS_HARD_LINK_LOCKS' => 1, - '_LT_REQUIRED_DARWIN_CHECKS' => 1, - 'AM_PROG_CC_C_O' => 1, - '_LT_AC_TAGVAR' => 1, - 'AC_LIBTOOL_LANG_F77_CONFIG' => 1, - 'AM_CONDITIONAL' => 1, - 'LT_LIB_DLLOAD' => 1, - 'LTDL_INIT' => 1, - 'LTVERSION_VERSION' => 1, - '_LT_PROG_F77' => 1, - '_LT_PROG_CXX' => 1, - 'AM_PROG_INSTALL_SH' => 1, - 'm4_include' => 1, - 'AC_PROG_EGREP' => 1, - '_AC_AM_CONFIG_HEADER_HOOK' => 1, - 'AC_PATH_MAGIC' => 1, - 'AM_PATH_PYTHON' => 1, - 'AC_LTDL_SYSSEARCHPATH' => 1, - 'AM_MAKE_INCLUDE' => 1, - 'LT_CMD_MAX_LEN' => 1, - '_LT_AC_TAGCONFIG' => 1, - 'm4_pattern_forbid' => 1, - '_LT_LINKER_OPTION' => 1, - 'AC_LIBTOOL_COMPILER_OPTION' => 1, - 'AC_DISABLE_SHARED' => 1, - '_LT_COMPILER_BOILERPLATE' => 1, - 'AC_LIBTOOL_WIN32_DLL' => 1, - 'AC_LIBTOOL_SETUP' => 1, - 'AC_PROG_LD_RELOAD_FLAG' => 1, - 'AC_LTDL_DLSYM_USCORE' => 1, - 'AM_MISSING_HAS_RUN' => 1, - 'LT_LANG' => 1, - 'LT_SYS_DLSEARCH_PATH' => 1, - 'LT_CONFIG_LTDL_DIR' => 1, - 'AC_LIBTOOL_DLOPEN_SELF' => 1, - 'LT_OUTPUT' => 1, - 'AC_LIBTOOL_PROG_LD_SHLIBS' => 1, - '_AM_CONFIG_MACRO_DIRS' => 1, - 'AC_WITH_LTDL' => 1, - 'AC_LIBTOOL_LINKER_OPTION' => 1, - 'LT_AC_PROG_RC' => 1, - 'AC_LIBTOOL_CXX' => 1, - 'LT_INIT' => 1, - 'LT_AC_PROG_GCJ' => 1, - 'LT_SYS_DLOPEN_SELF' => 1, - 'AM_DISABLE_STATIC' => 1, - '_LT_AC_PROG_CXXCPP' => 1, - 'AM_DEP_TRACK' => 1, - '_AC_PROG_LIBTOOL' => 1, - '_AM_IF_OPTION' => 1, - 'AC_PATH_TOOL_PREFIX' => 1, - 'AC_LIBTOOL_F77' => 1, - 'm4_pattern_allow' => 1, - 'AM_SET_LEADING_DOT' => 1, - 'LT_AC_PROG_EGREP' => 1, - '_LT_PROG_FC' => 1, - '_AM_DEPENDENCIES' => 1, - 'AC_LIBTOOL_LANG_C_CONFIG' => 1, - 'LTOPTIONS_VERSION' => 1, - '_LT_AC_SYS_COMPILER' => 1, - '_AM_PROG_CC_C_O' => 1, - 'AM_PROG_NM' => 1, - 'AC_LIBLTDL_CONVENIENCE' => 1, - 'AC_DEPLIBS_CHECK_METHOD' => 1, - 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, - 'AC_LIBLTDL_INSTALLABLE' => 1, - 'AC_LTDL_ENABLE_INSTALL' => 1, - 'AC_LIBTOOL_SYS_DYNAMIC_LINKER' => 1, - 'LT_PROG_GCJ' => 1, - 'AM_INIT_AUTOMAKE' => 1, - 'AC_DISABLE_STATIC' => 1, - 'LT_PATH_NM' => 1, - 'AC_LTDL_SHLIBEXT' => 1, - '_LT_AC_LOCK' => 1, - '_LT_AC_LANG_RC_CONFIG' => 1, - 'LT_PROG_GO' => 1, - 'LT_SYS_MODULE_PATH' => 1, - 'AC_LIBTOOL_POSTDEP_PREDEP' => 1, - 'LT_WITH_LTDL' => 1, - 'AC_LTDL_SHLIBPATH' => 1, - 'AM_AUX_DIR_EXPAND' => 1, - '_LT_AC_LANG_F77_CONFIG' => 1, - 'AC_LIBTOOL_PROG_COMPILER_NO_RTTI' => 1, - '_AM_SET_OPTIONS' => 1, - '_LT_COMPILER_OPTION' => 1, - '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, - 'AM_RUN_LOG' => 1, - 'AC_LIBTOOL_SYS_OLD_ARCHIVE' => 1, - 'AC_LTDL_SYS_DLOPEN_DEPLIBS' => 1, - 'AC_LIBTOOL_PICMODE' => 1, - 'LT_PATH_LD' => 1, - 'AC_CHECK_LIBM' => 1, - 'ACX_PTHREAD' => 1, - 'AC_LIBTOOL_SYS_LIB_STRIP' => 1, - '_AM_MANGLE_OPTION' => 1, - 'AC_LTDL_SYMBOL_USCORE' => 1, - 'AC_LIBTOOL_SYS_MAX_CMD_LEN' => 1, - 'AC_CONFIG_MACRO_DIR_TRACE' => 1, - 'AM_SET_DEPDIR' => 1, - '_LT_CC_BASENAME' => 1, - '_LT_LIBOBJ' => 1 - } - ], 'Autom4te::Request' ), - bless( [ - '1', - 1, - [ - '/usr/local/Cellar/autoconf/2.69/share/autoconf' - ], - [ - '/usr/local/Cellar/autoconf/2.69/share/autoconf/autoconf/autoconf.m4f', - 'aclocal.m4', - 'configure.ac' - ], - { - 'AM_PROG_F77_C_O' => 1, - '_LT_AC_TAGCONFIG' => 1, - 'AC_INIT' => 1, - 'm4_pattern_forbid' => 1, - 'AC_CANONICAL_TARGET' => 1, - '_AM_COND_IF' => 1, - 'AC_CONFIG_LIBOBJ_DIR' => 1, - 'AC_SUBST' => 1, - 'AM_EXTRA_RECURSIVE_TARGETS' => 1, - 'AC_CANONICAL_HOST' => 1, - 'AC_FC_SRCEXT' => 1, - 'AC_PROG_LIBTOOL' => 1, - 'AM_PROG_MKDIR_P' => 1, - 'AM_INIT_AUTOMAKE' => 1, - 'AC_CONFIG_SUBDIRS' => 1, - 'AM_PATH_GUILE' => 1, - 'AM_AUTOMAKE_VERSION' => 1, - 'LT_CONFIG_LTDL_DIR' => 1, - 'AC_CONFIG_LINKS' => 1, - 'AC_REQUIRE_AUX_FILE' => 1, - 'LT_SUPPORTED_TAG' => 1, - 'm4_sinclude' => 1, - 'AM_MAINTAINER_MODE' => 1, - 'AM_NLS' => 1, - 'AC_FC_PP_DEFINE' => 1, - 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, - '_m4_warn' => 1, - 'AM_MAKEFILE_INCLUDE' => 1, - 'AM_PROG_CXX_C_O' => 1, - '_AM_MAKEFILE_INCLUDE' => 1, - '_AM_COND_ENDIF' => 1, - 'AM_ENABLE_MULTILIB' => 1, - 'AM_SILENT_RULES' => 1, - 'AM_PROG_MOC' => 1, - 'AC_CONFIG_FILES' => 1, - 'include' => 1, - 'LT_INIT' => 1, - 'AM_GNU_GETTEXT' => 1, - 'AM_PROG_AR' => 1, - 'AC_LIBSOURCE' => 1, - 'AC_CANONICAL_BUILD' => 1, - 'AM_PROG_FC_C_O' => 1, - 'AC_FC_FREEFORM' => 1, - 'AC_FC_PP_SRCEXT' => 1, - 'AH_OUTPUT' => 1, - 'AC_CONFIG_AUX_DIR' => 1, - '_AM_SUBST_NOTMAKE' => 1, - 'm4_pattern_allow' => 1, - 'AM_PROG_CC_C_O' => 1, - 'sinclude' => 1, - 'AM_CONDITIONAL' => 1, - 'AC_CANONICAL_SYSTEM' => 1, - 'AM_XGETTEXT_OPTION' => 1, - 'AC_CONFIG_HEADERS' => 1, - 'AC_DEFINE_TRACE_LITERAL' => 1, - 'AM_POT_TOOLS' => 1, - 'm4_include' => 1, - '_AM_COND_ELSE' => 1, - 'AC_SUBST_TRACE' => 1 - } - ], 'Autom4te::Request' ), - bless( [ - '2', - 1, - [ - '/usr/local/Cellar/autoconf/2.69/share/autoconf' - ], - [ - '/usr/local/Cellar/autoconf/2.69/share/autoconf/autoconf/autoconf.m4f', - '-', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/internal/ac-config-macro-dirs.m4', - '/usr/local/share/aclocal/argz.m4', - '/usr/local/share/aclocal/ltdl.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/amversion.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/auxdir.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/cond.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/depend.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/depout.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/init.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/install-sh.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/lead-dot.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/make.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/missing.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/options.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/prog-cc-c-o.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/python.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/runlog.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/sanity.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/silent.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/strip.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/substnot.m4', - '/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/tar.m4', - 'm4/libtool.m4', - 'm4/ltoptions.m4', - 'm4/ltsugar.m4', - 'm4/ltversion.m4', - 'm4/lt~obsolete.m4', - 'configure.ac' - ], - { - 'AM_ENABLE_STATIC' => 1, - 'AC_LIBTOOL_LANG_RC_CONFIG' => 1, - '_LT_AC_SHELL_INIT' => 1, - 'AC_DEFUN' => 1, - 'AC_PROG_LIBTOOL' => 1, - '_LT_AC_LANG_CXX_CONFIG' => 1, - 'AM_PYTHON_CHECK_VERSION' => 1, - 'AM_AUTOMAKE_VERSION' => 1, - 'AM_SUBST_NOTMAKE' => 1, - 'AM_MISSING_PROG' => 1, - 'AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH' => 1, - '_LT_AC_LANG_C_CONFIG' => 1, - 'AM_PROG_INSTALL_STRIP' => 1, - '_m4_warn' => 1, - 'AC_LIBTOOL_OBJDIR' => 1, - 'gl_FUNC_ARGZ' => 1, - 'LTOBSOLETE_VERSION' => 1, - 'AM_SANITY_CHECK' => 1, - 'AC_LIBTOOL_LANG_GCJ_CONFIG' => 1, - 'AC_LIBTOOL_PROG_COMPILER_PIC' => 1, - 'LT_LIB_M' => 1, - '_LT_AC_CHECK_DLFCN' => 1, - 'AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE' => 1, - 'LTSUGAR_VERSION' => 1, - '_LT_PROG_LTMAIN' => 1, - 'LT_SYS_SYMBOL_USCORE' => 1, - '_AM_PROG_TAR' => 1, - 'AC_LIBTOOL_GCJ' => 1, - '_LT_WITH_SYSROOT' => 1, - 'LT_FUNC_DLSYM_USCORE' => 1, - 'LT_SYS_DLOPEN_DEPLIBS' => 1, - '_LT_AC_LANG_F77' => 1, - 'AC_LIBTOOL_CONFIG' => 1, - 'AC_CONFIG_MACRO_DIR' => 1, - 'AC_LTDL_DLLIB' => 1, - '_AM_SUBST_NOTMAKE' => 1, - '_AM_AUTOCONF_VERSION' => 1, - 'AM_DISABLE_SHARED' => 1, - '_LT_PROG_ECHO_BACKSLASH' => 1, - '_LTDL_SETUP' => 1, - 'AM_PROG_LIBTOOL' => 1, - '_LT_AC_LANG_CXX' => 1, - 'AM_PROG_LD' => 1, - '_LT_AC_FILE_LTDLL_C' => 1, - 'AC_LIB_LTDL' => 1, - 'AU_DEFUN' => 1, - 'AC_PROG_NM' => 1, - 'AC_LIBTOOL_DLOPEN' => 1, - 'AC_PROG_LD' => 1, - 'AC_PROG_LD_GNU' => 1, - 'AC_ENABLE_FAST_INSTALL' => 1, - 'AC_LIBTOOL_FC' => 1, - 'LTDL_CONVENIENCE' => 1, - '_AM_SET_OPTION' => 1, - 'AC_LTDL_PREOPEN' => 1, - '_LT_LINKER_BOILERPLATE' => 1, - '_LT_PREPARE_SED_QUOTE_VARS' => 1, - 'AC_LIBTOOL_LANG_CXX_CONFIG' => 1, - 'AC_LIBTOOL_PROG_CC_C_O' => 1, - 'gl_PREREQ_ARGZ' => 1, - 'LT_SUPPORTED_TAG' => 1, - 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, - 'LT_SYS_MODULE_EXT' => 1, - 'LT_PROG_RC' => 1, - 'AC_DEFUN_ONCE' => 1, - '_LT_AC_LANG_GCJ' => 1, - 'AC_LTDL_OBJDIR' => 1, - '_LT_PATH_TOOL_PREFIX' => 1, - 'AC_LIBTOOL_RC' => 1, - '_LT_AC_PROG_ECHO_BACKSLASH' => 1, - 'AC_DISABLE_FAST_INSTALL' => 1, - 'AM_SILENT_RULES' => 1, - 'include' => 1, - '_LT_AC_TRY_DLOPEN_SELF' => 1, - '_LT_AC_SYS_LIBPATH_AIX' => 1, - 'LT_AC_PROG_SED' => 1, - 'AM_ENABLE_SHARED' => 1, - 'LTDL_INSTALLABLE' => 1, - '_LT_AC_LANG_GCJ_CONFIG' => 1, - 'AC_ENABLE_SHARED' => 1, - '_LT_REQUIRED_DARWIN_CHECKS' => 1, - 'AC_LIBTOOL_SYS_HARD_LINK_LOCKS' => 1, - 'AC_ENABLE_STATIC' => 1, - '_LT_AC_TAGVAR' => 1, - 'AM_PROG_CC_C_O' => 1, - 'AC_LIBTOOL_LANG_F77_CONFIG' => 1, - 'AM_CONDITIONAL' => 1, - 'LT_LIB_DLLOAD' => 1, - 'LTVERSION_VERSION' => 1, - '_LT_PROG_CXX' => 1, - '_LT_PROG_F77' => 1, - 'LTDL_INIT' => 1, - 'm4_include' => 1, - 'AM_PROG_INSTALL_SH' => 1, - 'AC_PROG_EGREP' => 1, - 'AM_PATH_PYTHON' => 1, - 'AC_PATH_MAGIC' => 1, - '_AC_AM_CONFIG_HEADER_HOOK' => 1, - 'AC_LTDL_SYSSEARCHPATH' => 1, - 'AM_MAKE_INCLUDE' => 1, - 'LT_CMD_MAX_LEN' => 1, - '_LT_AC_TAGCONFIG' => 1, - 'm4_pattern_forbid' => 1, - '_LT_LINKER_OPTION' => 1, - 'AC_LIBTOOL_COMPILER_OPTION' => 1, - 'AC_DISABLE_SHARED' => 1, - '_LT_COMPILER_BOILERPLATE' => 1, - 'AC_LIBTOOL_WIN32_DLL' => 1, - 'AC_LIBTOOL_SETUP' => 1, - 'AC_PROG_LD_RELOAD_FLAG' => 1, - 'AC_LTDL_DLSYM_USCORE' => 1, - 'AM_MISSING_HAS_RUN' => 1, - 'LT_LANG' => 1, - 'LT_SYS_DLSEARCH_PATH' => 1, - 'LT_CONFIG_LTDL_DIR' => 1, - 'AC_LIBTOOL_DLOPEN_SELF' => 1, - 'LT_OUTPUT' => 1, - 'AC_LIBTOOL_PROG_LD_SHLIBS' => 1, - '_AM_CONFIG_MACRO_DIRS' => 1, - 'AC_WITH_LTDL' => 1, - 'AC_LIBTOOL_LINKER_OPTION' => 1, - 'LT_AC_PROG_RC' => 1, - 'AC_LIBTOOL_CXX' => 1, - 'LT_INIT' => 1, - 'LT_AC_PROG_GCJ' => 1, - 'LT_SYS_DLOPEN_SELF' => 1, - 'AM_DISABLE_STATIC' => 1, - '_LT_AC_PROG_CXXCPP' => 1, - 'AM_DEP_TRACK' => 1, - '_AC_PROG_LIBTOOL' => 1, - '_AM_IF_OPTION' => 1, - 'AC_PATH_TOOL_PREFIX' => 1, - 'm4_pattern_allow' => 1, - 'AC_LIBTOOL_F77' => 1, - 'AM_SET_LEADING_DOT' => 1, - '_LT_PROG_FC' => 1, - 'LT_AC_PROG_EGREP' => 1, - '_AM_DEPENDENCIES' => 1, - 'AC_LIBTOOL_LANG_C_CONFIG' => 1, - 'LTOPTIONS_VERSION' => 1, - '_LT_AC_SYS_COMPILER' => 1, - 'AM_PROG_NM' => 1, - '_AM_PROG_CC_C_O' => 1, - 'AC_LIBLTDL_CONVENIENCE' => 1, - 'AC_DEPLIBS_CHECK_METHOD' => 1, - 'AC_LIBLTDL_INSTALLABLE' => 1, - 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, - 'AC_LTDL_ENABLE_INSTALL' => 1, - 'LT_PROG_GCJ' => 1, - 'AC_LIBTOOL_SYS_DYNAMIC_LINKER' => 1, - 'AM_INIT_AUTOMAKE' => 1, - 'AC_DISABLE_STATIC' => 1, - 'LT_PATH_NM' => 1, - 'AC_LTDL_SHLIBEXT' => 1, - '_LT_AC_LOCK' => 1, - '_LT_AC_LANG_RC_CONFIG' => 1, - 'LT_PROG_GO' => 1, - 'LT_SYS_MODULE_PATH' => 1, - 'LT_WITH_LTDL' => 1, - 'AC_LIBTOOL_POSTDEP_PREDEP' => 1, - 'AC_LTDL_SHLIBPATH' => 1, - 'AM_AUX_DIR_EXPAND' => 1, - 'AC_LIBTOOL_PROG_COMPILER_NO_RTTI' => 1, - '_LT_AC_LANG_F77_CONFIG' => 1, - '_LT_COMPILER_OPTION' => 1, - '_AM_SET_OPTIONS' => 1, - 'AM_RUN_LOG' => 1, - '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, - 'AC_LIBTOOL_PICMODE' => 1, - 'AC_LTDL_SYS_DLOPEN_DEPLIBS' => 1, - 'AC_LIBTOOL_SYS_OLD_ARCHIVE' => 1, - 'ACX_PTHREAD' => 1, - 'AC_CHECK_LIBM' => 1, - 'LT_PATH_LD' => 1, - 'AC_LIBTOOL_SYS_LIB_STRIP' => 1, - '_AM_MANGLE_OPTION' => 1, - 'AC_CONFIG_MACRO_DIR_TRACE' => 1, - 'AC_LIBTOOL_SYS_MAX_CMD_LEN' => 1, - 'AC_LTDL_SYMBOL_USCORE' => 1, - 'AM_SET_DEPDIR' => 1, - '_LT_CC_BASENAME' => 1, - '_LT_LIBOBJ' => 1 - } - ], 'Autom4te::Request' ) - ); - diff --git a/vendor/gtest-1.6.0/autom4te.cache/traces.0 b/vendor/gtest-1.6.0/autom4te.cache/traces.0 deleted file mode 100644 index 59617b3d..00000000 --- a/vendor/gtest-1.6.0/autom4te.cache/traces.0 +++ /dev/null @@ -1,3189 +0,0 @@ -m4trace:/usr/local/share/aclocal/argz.m4:76: -1- AC_DEFUN([gl_FUNC_ARGZ], [gl_PREREQ_ARGZ - -AC_CHECK_HEADERS([argz.h], [], [], [AC_INCLUDES_DEFAULT]) - -AC_CHECK_TYPES([error_t], - [], - [AC_DEFINE([error_t], [int], - [Define to a type to use for `error_t' if it is not otherwise available.]) - AC_DEFINE([__error_t_defined], [1], [Define so that glibc/gnulib argp.h - does not typedef error_t.])], - [#if defined(HAVE_ARGZ_H) -# include -#endif]) - -ARGZ_H= -AC_CHECK_FUNCS([argz_add argz_append argz_count argz_create_sep argz_insert \ - argz_next argz_stringify], [], [ARGZ_H=argz.h; AC_LIBOBJ([argz])]) - -dnl if have system argz functions, allow forced use of -dnl libltdl-supplied implementation (and default to do so -dnl on "known bad" systems). Could use a runtime check, but -dnl (a) detecting malloc issues is notoriously unreliable -dnl (b) only known system that declares argz functions, -dnl provides them, yet they are broken, is cygwin -dnl releases prior to 16-Mar-2007 (1.5.24 and earlier) -dnl So, it's more straightforward simply to special case -dnl this for known bad systems. -AS_IF([test -z "$ARGZ_H"], - [AC_CACHE_CHECK( - [if argz actually works], - [lt_cv_sys_argz_works], - [[case $host_os in #( - *cygwin*) - lt_cv_sys_argz_works=no - if test "$cross_compiling" != no; then - lt_cv_sys_argz_works="guessing no" - else - lt_sed_extract_leading_digits='s/^\([0-9\.]*\).*/\1/' - save_IFS=$IFS - IFS=-. - set x `uname -r | sed -e "$lt_sed_extract_leading_digits"` - IFS=$save_IFS - lt_os_major=${2-0} - lt_os_minor=${3-0} - lt_os_micro=${4-0} - if test "$lt_os_major" -gt 1 \ - || { test "$lt_os_major" -eq 1 \ - && { test "$lt_os_minor" -gt 5 \ - || { test "$lt_os_minor" -eq 5 \ - && test "$lt_os_micro" -gt 24; }; }; }; then - lt_cv_sys_argz_works=yes - fi - fi - ;; #( - *) lt_cv_sys_argz_works=yes ;; - esac]]) - AS_IF([test "$lt_cv_sys_argz_works" = yes], - [AC_DEFINE([HAVE_WORKING_ARGZ], 1, - [This value is set to 1 to indicate that the system argz facility works])], - [ARGZ_H=argz.h - AC_LIBOBJ([argz])])]) - -AC_SUBST([ARGZ_H]) -]) -m4trace:/usr/local/share/aclocal/argz.m4:79: -1- AC_DEFUN([gl_PREREQ_ARGZ], [:]) -m4trace:/usr/local/share/aclocal/libtool.m4:104: -1- AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT -AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl -AC_BEFORE([$0], [LT_LANG])dnl -AC_BEFORE([$0], [LT_OUTPUT])dnl -AC_BEFORE([$0], [LTDL_INIT])dnl -m4_require([_LT_CHECK_BUILDDIR])dnl - -dnl Autoconf doesn't catch unexpanded LT_ macros by default: -m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl -m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl -dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 -dnl unless we require an AC_DEFUNed macro: -AC_REQUIRE([LTOPTIONS_VERSION])dnl -AC_REQUIRE([LTSUGAR_VERSION])dnl -AC_REQUIRE([LTVERSION_VERSION])dnl -AC_REQUIRE([LTOBSOLETE_VERSION])dnl -m4_require([_LT_PROG_LTMAIN])dnl - -_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) - -dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -_LT_SETUP - -# Only expand once: -m4_define([LT_INIT]) -]) -m4trace:/usr/local/share/aclocal/libtool.m4:107: -1- AU_DEFUN([AC_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:107: -1- AC_DEFUN([AC_PROG_LIBTOOL], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:108: -1- AU_DEFUN([AM_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:108: -1- AC_DEFUN([AM_PROG_LIBTOOL], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_LIBTOOL' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:694: -1- AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} -AC_MSG_NOTICE([creating $CONFIG_LT]) -_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], -[# Run this file to recreate a libtool stub with the current configuration.]) - -cat >>"$CONFIG_LT" <<\_LTEOF -lt_cl_silent=false -exec AS_MESSAGE_LOG_FD>>config.log -{ - echo - AS_BOX([Running $as_me.]) -} >&AS_MESSAGE_LOG_FD - -lt_cl_help="\ -\`$as_me' creates a local libtool stub from the current configuration, -for use in further configure time tests before the real libtool is -generated. - -Usage: $[0] [[OPTIONS]] - - -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - -Report bugs to ." - -lt_cl_version="\ -m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl -m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) -configured by $[0], generated by m4_PACKAGE_STRING. - -Copyright (C) 2011 Free Software Foundation, Inc. -This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." - -while test $[#] != 0 -do - case $[1] in - --version | --v* | -V ) - echo "$lt_cl_version"; exit 0 ;; - --help | --h* | -h ) - echo "$lt_cl_help"; exit 0 ;; - --debug | --d* | -d ) - debug=: ;; - --quiet | --q* | --silent | --s* | -q ) - lt_cl_silent=: ;; - - -*) AC_MSG_ERROR([unrecognized option: $[1] -Try \`$[0] --help' for more information.]) ;; - - *) AC_MSG_ERROR([unrecognized argument: $[1] -Try \`$[0] --help' for more information.]) ;; - esac - shift -done - -if $lt_cl_silent; then - exec AS_MESSAGE_FD>/dev/null -fi -_LTEOF - -cat >>"$CONFIG_LT" <<_LTEOF -_LT_OUTPUT_LIBTOOL_COMMANDS_INIT -_LTEOF - -cat >>"$CONFIG_LT" <<\_LTEOF -AC_MSG_NOTICE([creating $ofile]) -_LT_OUTPUT_LIBTOOL_COMMANDS -AS_EXIT(0) -_LTEOF -chmod +x "$CONFIG_LT" - -# configure is writing to config.log, but config.lt does its own redirection, -# appending to config.log, which fails on DOS, as config.log is still kept -# open by configure. Here we exec the FD to /dev/null, effectively closing -# config.log, so it can be properly (re)opened and appended to by config.lt. -lt_cl_success=: -test "$silent" = yes && - lt_config_lt_args="$lt_config_lt_args --quiet" -exec AS_MESSAGE_LOG_FD>/dev/null -$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false -exec AS_MESSAGE_LOG_FD>>config.log -$lt_cl_success || AS_EXIT(1) -]) -m4trace:/usr/local/share/aclocal/libtool.m4:790: -1- AC_DEFUN([LT_SUPPORTED_TAG], []) -m4trace:/usr/local/share/aclocal/libtool.m4:814: -1- AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl -m4_case([$1], - [C], [_LT_LANG(C)], - [C++], [_LT_LANG(CXX)], - [Go], [_LT_LANG(GO)], - [Java], [_LT_LANG(GCJ)], - [Fortran 77], [_LT_LANG(F77)], - [Fortran], [_LT_LANG(FC)], - [Windows Resource], [_LT_LANG(RC)], - [m4_ifdef([_LT_LANG_]$1[_CONFIG], - [_LT_LANG($1)], - [m4_fatal([$0: unsupported language: "$1"])])])dnl -]) -m4trace:/usr/local/share/aclocal/libtool.m4:893: -1- AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) -m4trace:/usr/local/share/aclocal/libtool.m4:893: -1- AC_DEFUN([AC_LIBTOOL_CXX], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_CXX' is obsolete. -You should run autoupdate.])dnl -LT_LANG(C++)]) -m4trace:/usr/local/share/aclocal/libtool.m4:894: -1- AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) -m4trace:/usr/local/share/aclocal/libtool.m4:894: -1- AC_DEFUN([AC_LIBTOOL_F77], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_F77' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Fortran 77)]) -m4trace:/usr/local/share/aclocal/libtool.m4:895: -1- AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) -m4trace:/usr/local/share/aclocal/libtool.m4:895: -1- AC_DEFUN([AC_LIBTOOL_FC], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_FC' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Fortran)]) -m4trace:/usr/local/share/aclocal/libtool.m4:896: -1- AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) -m4trace:/usr/local/share/aclocal/libtool.m4:896: -1- AC_DEFUN([AC_LIBTOOL_GCJ], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_GCJ' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Java)]) -m4trace:/usr/local/share/aclocal/libtool.m4:897: -1- AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) -m4trace:/usr/local/share/aclocal/libtool.m4:897: -1- AC_DEFUN([AC_LIBTOOL_RC], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_RC' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Windows Resource)]) -m4trace:/usr/local/share/aclocal/libtool.m4:1254: -1- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) -AC_ARG_WITH([sysroot], -[ --with-sysroot[=DIR] Search for dependent libraries within DIR - (or the compiler's sysroot if not specified).], -[], [with_sysroot=no]) - -dnl lt_sysroot will always be passed unquoted. We quote it here -dnl in case the user passed a directory name. -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - AC_MSG_RESULT([${with_sysroot}]) - AC_MSG_ERROR([The sysroot must be an absolute path.]) - ;; -esac - - AC_MSG_RESULT([${lt_sysroot:-no}]) -_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl -[dependent libraries, and in which our libraries should be installed.])]) -m4trace:/usr/local/share/aclocal/libtool.m4:1541: -1- AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - fi - $RM conftest* -]) - -if test x"[$]$2" = xyes; then - m4_if([$5], , :, [$5]) -else - m4_if([$6], , :, [$6]) -fi -]) -m4trace:/usr/local/share/aclocal/libtool.m4:1544: -1- AU_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:1544: -1- AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_COMPILER_OPTION' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:1585: -1- AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $3" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&AS_MESSAGE_LOG_FD - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - else - $2=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" -]) - -if test x"[$]$2" = xyes; then - m4_if([$4], , :, [$4]) -else - m4_if([$5], , :, [$5]) -fi -]) -m4trace:/usr/local/share/aclocal/libtool.m4:1588: -1- AU_DEFUN([AC_LIBTOOL_LINKER_OPTION], [m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:1588: -1- AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_LINKER_OPTION' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:1730: -1- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -# find the maximum length of command line arguments -AC_MSG_CHECKING([the maximum length of command line arguments]) -AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac -]) -if test -n $lt_cv_sys_max_cmd_len ; then - AC_MSG_RESULT($lt_cv_sys_max_cmd_len) -else - AC_MSG_RESULT(none) -fi -max_cmd_len=$lt_cv_sys_max_cmd_len -_LT_DECL([], [max_cmd_len], [0], - [What is the maximum length of a command?]) -]) -m4trace:/usr/local/share/aclocal/libtool.m4:1733: -1- AU_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:1733: -1- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_SYS_MAX_CMD_LEN' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:1958: -1- AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ]) - ;; - - *) - AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen="shl_load"], - [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], - [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen="dlopen"], - [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], - [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], - [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) - ]) - ]) - ]) - ]) - ]) - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - AC_CACHE_CHECK([whether a program can dlopen itself], - lt_cv_dlopen_self, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, - lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) - ]) - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, - lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) - ]) - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi -_LT_DECL([dlopen_support], [enable_dlopen], [0], - [Whether dlopen is supported]) -_LT_DECL([dlopen_self], [enable_dlopen_self], [0], - [Whether dlopen of programs is supported]) -_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], - [Whether dlopen of statically linked programs is supported]) -]) -m4trace:/usr/local/share/aclocal/libtool.m4:1961: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:1961: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN_SELF' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:2989: -1- AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl -AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, -[case $MAGIC_CMD in -[[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="m4_if([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - AC_MSG_RESULT($MAGIC_CMD) -else - AC_MSG_RESULT(no) -fi -_LT_DECL([], [MAGIC_CMD], [0], - [Used to examine libraries when file_magic_cmd begins with "file"])dnl -]) -m4trace:/usr/local/share/aclocal/libtool.m4:2992: -1- AU_DEFUN([AC_PATH_TOOL_PREFIX], [m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:2992: -1- AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_DIAGNOSE([obsolete], [The macro `AC_PATH_TOOL_PREFIX' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:3101: -1- AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PROG_ECHO_BACKSLASH])dnl - -AC_ARG_WITH([gnu-ld], - [AS_HELP_STRING([--with-gnu-ld], - [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], - [with_gnu_ld=no])dnl - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by $CC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]]* | ?:[[\\/]]*) - re_direlt='/[[^/]][[^/]]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(lt_cv_path_LD, -[if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi]) -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - AC_SUBST([DUMPBIN]) - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm -AC_SUBST([NM]) -_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl - -AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], - [lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) - cat conftest.out >&AS_MESSAGE_LOG_FD - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest*]) -]) -m4trace:/usr/local/share/aclocal/libtool.m4:3489: -1- AU_DEFUN([AM_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:3489: -1- AC_DEFUN([AM_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_NM' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:3490: -1- AU_DEFUN([AC_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:3490: -1- AC_DEFUN([AC_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_NM' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:3576: -1- AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) - # These system don't have libm, or don't need it - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, cos, LIBM="-lm") - ;; -esac -AC_SUBST([LIBM]) -]) -m4trace:/usr/local/share/aclocal/libtool.m4:3579: -1- AU_DEFUN([AC_CHECK_LIBM], [m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:3579: -1- AC_DEFUN([AC_CHECK_LIBM], [AC_DIAGNOSE([obsolete], [The macro `AC_CHECK_LIBM' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:7628: -1- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], - [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], - [AC_CHECK_TOOL(GCJ, gcj,) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS)])])[]dnl -]) -m4trace:/usr/local/share/aclocal/libtool.m4:7631: -1- AU_DEFUN([LT_AC_PROG_GCJ], [m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:7631: -1- AC_DEFUN([LT_AC_PROG_GCJ], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_GCJ' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:7640: -1- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) -]) -m4trace:/usr/local/share/aclocal/libtool.m4:7647: -1- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) -]) -m4trace:/usr/local/share/aclocal/libtool.m4:7650: -1- AU_DEFUN([LT_AC_PROG_RC], [m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:7650: -1- AC_DEFUN([LT_AC_PROG_RC], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_RC' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:7770: -1- AU_DEFUN([LT_AC_PROG_SED], [m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) -m4trace:/usr/local/share/aclocal/libtool.m4:7770: -1- AC_DEFUN([LT_AC_PROG_SED], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_SED' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:19: -1- AC_DEFUN([LT_CONFIG_LTDL_DIR], [AC_BEFORE([$0], [LTDL_INIT]) -_$0($*) -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:77: -1- AC_DEFUN([LTDL_CONVENIENCE], [AC_BEFORE([$0], [LTDL_INIT])dnl -dnl Although the argument is deprecated and no longer documented, -dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one -dnl here make sure it is the same as any other declaration of libltdl's -dnl location! This also ensures lt_ltdl_dir is set when configure.ac is -dnl not yet using an explicit LT_CONFIG_LTDL_DIR. -m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl -_$0() -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:83: -1- AU_DEFUN([AC_LIBLTDL_CONVENIENCE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_CONVENIENCE]) -m4trace:/usr/local/share/aclocal/ltdl.m4:83: -1- AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBLTDL_CONVENIENCE' is obsolete. -You should run autoupdate.])dnl -_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_CONVENIENCE]) -m4trace:/usr/local/share/aclocal/ltdl.m4:133: -1- AC_DEFUN([LTDL_INSTALLABLE], [AC_BEFORE([$0], [LTDL_INIT])dnl -dnl Although the argument is deprecated and no longer documented, -dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one -dnl here make sure it is the same as any other declaration of libltdl's -dnl location! This also ensures lt_ltdl_dir is set when configure.ac is -dnl not yet using an explicit LT_CONFIG_LTDL_DIR. -m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl -_$0() -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:139: -1- AU_DEFUN([AC_LIBLTDL_INSTALLABLE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_INSTALLABLE]) -m4trace:/usr/local/share/aclocal/ltdl.m4:139: -1- AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBLTDL_INSTALLABLE' is obsolete. -You should run autoupdate.])dnl -_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_INSTALLABLE]) -m4trace:/usr/local/share/aclocal/ltdl.m4:216: -1- AC_DEFUN([_LT_LIBOBJ], [ - m4_pattern_allow([^_LT_LIBOBJS$]) - _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:349: -1- AC_DEFUN([LTDL_INIT], [dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -dnl We need to keep our own list of libobjs separate from our parent project, -dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while -dnl we look for our own LIBOBJs. -m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) -m4_pushdef([AC_LIBSOURCES]) - -dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: -m4_if(_LTDL_MODE, [], - [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) - m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])], - [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])]) - -AC_ARG_WITH([included_ltdl], - [AS_HELP_STRING([--with-included-ltdl], - [use the GNU ltdl sources included here])]) - -if test "x$with_included_ltdl" != xyes; then - # We are not being forced to use the included libltdl sources, so - # decide whether there is a useful installed version we can use. - AC_CHECK_HEADER([ltdl.h], - [AC_CHECK_DECL([lt_dlinterface_register], - [AC_CHECK_LIB([ltdl], [lt_dladvise_preload], - [with_included_ltdl=no], - [with_included_ltdl=yes])], - [with_included_ltdl=yes], - [AC_INCLUDES_DEFAULT - #include ])], - [with_included_ltdl=yes], - [AC_INCLUDES_DEFAULT] - ) -fi - -dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE -dnl was called yet, then for old times' sake, we assume libltdl is in an -dnl eponymous directory: -AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])]) - -AC_ARG_WITH([ltdl_include], - [AS_HELP_STRING([--with-ltdl-include=DIR], - [use the ltdl headers installed in DIR])]) - -if test -n "$with_ltdl_include"; then - if test -f "$with_ltdl_include/ltdl.h"; then : - else - AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include']) - fi -else - with_ltdl_include=no -fi - -AC_ARG_WITH([ltdl_lib], - [AS_HELP_STRING([--with-ltdl-lib=DIR], - [use the libltdl.la installed in DIR])]) - -if test -n "$with_ltdl_lib"; then - if test -f "$with_ltdl_lib/libltdl.la"; then : - else - AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib']) - fi -else - with_ltdl_lib=no -fi - -case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in - ,yes,no,no,) - m4_case(m4_default(_LTDL_TYPE, [convenience]), - [convenience], [_LTDL_CONVENIENCE], - [installable], [_LTDL_INSTALLABLE], - [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)]) - ;; - ,no,no,no,) - # If the included ltdl is not to be used, then use the - # preinstalled libltdl we found. - AC_DEFINE([HAVE_LTDL], [1], - [Define this if a modern libltdl is already installed]) - LIBLTDL=-lltdl - LTDLDEPS= - LTDLINCL= - ;; - ,no*,no,*) - AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together]) - ;; - *) with_included_ltdl=no - LIBLTDL="-L$with_ltdl_lib -lltdl" - LTDLDEPS= - LTDLINCL="-I$with_ltdl_include" - ;; -esac -INCLTDL="$LTDLINCL" - -# Report our decision... -AC_MSG_CHECKING([where to find libltdl headers]) -AC_MSG_RESULT([$LTDLINCL]) -AC_MSG_CHECKING([where to find libltdl library]) -AC_MSG_RESULT([$LIBLTDL]) - -_LTDL_SETUP - -dnl restore autoconf definition. -m4_popdef([AC_LIBOBJ]) -m4_popdef([AC_LIBSOURCES]) - -AC_CONFIG_COMMANDS_PRE([ - _ltdl_libobjs= - _ltdl_ltlibobjs= - if test -n "$_LT_LIBOBJS"; then - # Remove the extension. - _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' - for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do - _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" - _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" - done - fi - AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) - AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) -]) - -# Only expand once: -m4_define([LTDL_INIT]) -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:352: -1- AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)]) -m4trace:/usr/local/share/aclocal/ltdl.m4:352: -1- AC_DEFUN([AC_LIB_LTDL], [AC_DIAGNOSE([obsolete], [The macro `AC_LIB_LTDL' is obsolete. -You should run autoupdate.])dnl -LTDL_INIT($@)]) -m4trace:/usr/local/share/aclocal/ltdl.m4:353: -1- AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)]) -m4trace:/usr/local/share/aclocal/ltdl.m4:353: -1- AC_DEFUN([AC_WITH_LTDL], [AC_DIAGNOSE([obsolete], [The macro `AC_WITH_LTDL' is obsolete. -You should run autoupdate.])dnl -LTDL_INIT($@)]) -m4trace:/usr/local/share/aclocal/ltdl.m4:354: -1- AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)]) -m4trace:/usr/local/share/aclocal/ltdl.m4:354: -1- AC_DEFUN([LT_WITH_LTDL], [AC_DIAGNOSE([obsolete], [The macro `LT_WITH_LTDL' is obsolete. -You should run autoupdate.])dnl -LTDL_INIT($@)]) -m4trace:/usr/local/share/aclocal/ltdl.m4:421: -1- AC_DEFUN([_LTDL_SETUP], [AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_SYS_MODULE_EXT])dnl -AC_REQUIRE([LT_SYS_MODULE_PATH])dnl -AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl -AC_REQUIRE([LT_LIB_DLLOAD])dnl -AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl -AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl -AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl -AC_REQUIRE([gl_FUNC_ARGZ])dnl - -m4_require([_LT_CHECK_OBJDIR])dnl -m4_require([_LT_HEADER_DLFCN])dnl -m4_require([_LT_CHECK_DLPREOPEN])dnl -m4_require([_LT_DECL_SED])dnl - -dnl Don't require this, or it will be expanded earlier than the code -dnl that sets the variables it relies on: -_LT_ENABLE_INSTALL - -dnl _LTDL_MODE specific code must be called at least once: -_LTDL_MODE_DISPATCH - -# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS -# the user used. This is so that ltdl.h can pick up the parent projects -# config.h file, The first file in AC_CONFIG_HEADERS must contain the -# definitions required by ltdl.c. -# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). -AC_CONFIG_COMMANDS_PRE([dnl -m4_pattern_allow([^LT_CONFIG_H$])dnl -m4_ifset([AH_HEADER], - [LT_CONFIG_H=AH_HEADER], - [m4_ifset([AC_LIST_HEADERS], - [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[ ]]*,,;s,[[ :]].*$,,'`], - [])])]) -AC_SUBST([LT_CONFIG_H]) - -AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], - [], [], [AC_INCLUDES_DEFAULT]) - -AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) -AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) - -m4_pattern_allow([LT_LIBEXT])dnl -AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) - -name= -eval "lt_libprefix=\"$libname_spec\"" -m4_pattern_allow([LT_LIBPREFIX])dnl -AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix]) - -name=ltdl -eval "LTDLOPEN=\"$libname_spec\"" -AC_SUBST([LTDLOPEN]) -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:539: -1- AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_CACHE_CHECK([whether deplibs are loaded by dlopen], - [lt_cv_sys_dlopen_deplibs], - [# PORTME does your system automatically load deplibs for dlopen? - # or its logical equivalent (e.g. shl_load for HP-UX < 11) - # For now, we just catch OSes we know something about -- in the - # future, we'll try test this programmatically. - lt_cv_sys_dlopen_deplibs=unknown - case $host_os in - aix3*|aix4.1.*|aix4.2.*) - # Unknown whether this is true for these versions of AIX, but - # we want this `case' here to explicitly catch those versions. - lt_cv_sys_dlopen_deplibs=unknown - ;; - aix[[4-9]]*) - lt_cv_sys_dlopen_deplibs=yes - ;; - amigaos*) - case $host_cpu in - powerpc) - lt_cv_sys_dlopen_deplibs=no - ;; - esac - ;; - darwin*) - # Assuming the user has installed a libdl from somewhere, this is true - # If you are looking for one http://www.opendarwin.org/projects/dlcompat - lt_cv_sys_dlopen_deplibs=yes - ;; - freebsd* | dragonfly*) - lt_cv_sys_dlopen_deplibs=yes - ;; - gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) - # GNU and its variants, using gnu ld.so (Glibc) - lt_cv_sys_dlopen_deplibs=yes - ;; - hpux10*|hpux11*) - lt_cv_sys_dlopen_deplibs=yes - ;; - interix*) - lt_cv_sys_dlopen_deplibs=yes - ;; - irix[[12345]]*|irix6.[[01]]*) - # Catch all versions of IRIX before 6.2, and indicate that we don't - # know how it worked for any of those versions. - lt_cv_sys_dlopen_deplibs=unknown - ;; - irix*) - # The case above catches anything before 6.2, and it's known that - # at 6.2 and later dlopen does load deplibs. - lt_cv_sys_dlopen_deplibs=yes - ;; - netbsd*) - lt_cv_sys_dlopen_deplibs=yes - ;; - openbsd*) - lt_cv_sys_dlopen_deplibs=yes - ;; - osf[[1234]]*) - # dlopen did load deplibs (at least at 4.x), but until the 5.x series, - # it did *not* use an RPATH in a shared library to find objects the - # library depends on, so we explicitly say `no'. - lt_cv_sys_dlopen_deplibs=no - ;; - osf5.0|osf5.0a|osf5.1) - # dlopen *does* load deplibs and with the right loader patch applied - # it even uses RPATH in a shared library to search for shared objects - # that the library depends on, but there's no easy way to know if that - # patch is installed. Since this is the case, all we can really - # say is unknown -- it depends on the patch being installed. If - # it is, this changes to `yes'. Without it, it would be `no'. - lt_cv_sys_dlopen_deplibs=unknown - ;; - osf*) - # the two cases above should catch all versions of osf <= 5.1. Read - # the comments above for what we know about them. - # At > 5.1, deplibs are loaded *and* any RPATH in a shared library - # is used to find them so we can finally say `yes'. - lt_cv_sys_dlopen_deplibs=yes - ;; - qnx*) - lt_cv_sys_dlopen_deplibs=yes - ;; - solaris*) - lt_cv_sys_dlopen_deplibs=yes - ;; - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - libltdl_cv_sys_dlopen_deplibs=yes - ;; - esac - ]) -if test "$lt_cv_sys_dlopen_deplibs" != yes; then - AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], - [Define if the OS needs help to load dependent libraries for dlopen().]) -fi -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:542: -1- AU_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:542: -1- AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYS_DLOPEN_DEPLIBS' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:569: -1- AC_DEFUN([LT_SYS_MODULE_EXT], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([which extension is used for runtime loadable modules], - [libltdl_cv_shlibext], -[ -module=yes -eval libltdl_cv_shlibext=$shrext_cmds -module=no -eval libltdl_cv_shrext=$shrext_cmds - ]) -if test -n "$libltdl_cv_shlibext"; then - m4_pattern_allow([LT_MODULE_EXT])dnl - AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], - [Define to the extension used for runtime loadable modules, say, ".so".]) -fi -if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then - m4_pattern_allow([LT_SHARED_EXT])dnl - AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], - [Define to the shared library suffix, say, ".dylib".]) -fi -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:572: -1- AU_DEFUN([AC_LTDL_SHLIBEXT], [m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:572: -1- AC_DEFUN([AC_LTDL_SHLIBEXT], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SHLIBEXT' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:588: -1- AC_DEFUN([LT_SYS_MODULE_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([which variable specifies run-time module search path], - [lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"]) -if test -n "$lt_cv_module_path_var"; then - m4_pattern_allow([LT_MODULE_PATH_VAR])dnl - AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"], - [Define to the name of the environment variable that determines the run-time module search path.]) -fi -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:591: -1- AU_DEFUN([AC_LTDL_SHLIBPATH], [m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:591: -1- AC_DEFUN([AC_LTDL_SHLIBPATH], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SHLIBPATH' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:616: -1- AC_DEFUN([LT_SYS_DLSEARCH_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([for the default library search path], - [lt_cv_sys_dlsearch_path], - [lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"]) -if test -n "$lt_cv_sys_dlsearch_path"; then - sys_dlsearch_path= - for dir in $lt_cv_sys_dlsearch_path; do - if test -z "$sys_dlsearch_path"; then - sys_dlsearch_path="$dir" - else - sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir" - fi - done - m4_pattern_allow([LT_DLSEARCH_PATH])dnl - AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"], - [Define to the system default library search path.]) -fi -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:619: -1- AU_DEFUN([AC_LTDL_SYSSEARCHPATH], [m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:619: -1- AC_DEFUN([AC_LTDL_SYSSEARCHPATH], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYSSEARCHPATH' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:735: -1- AC_DEFUN([LT_LIB_DLLOAD], [m4_pattern_allow([^LT_DLLOADERS$]) -LT_DLLOADERS= -AC_SUBST([LT_DLLOADERS]) - -AC_LANG_PUSH([C]) - -LIBADD_DLOPEN= -AC_SEARCH_LIBS([dlopen], [dl], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - if test "$ac_cv_search_dlopen" != "none required" ; then - LIBADD_DLOPEN="-ldl" - fi - libltdl_cv_lib_dl_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], - [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H -# include -#endif - ]], [[dlopen(0, 0);]])], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - libltdl_cv_func_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], - [AC_CHECK_LIB([svld], [dlopen], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])]) -if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes -then - lt_save_LIBS="$LIBS" - LIBS="$LIBS $LIBADD_DLOPEN" - AC_CHECK_FUNCS([dlerror]) - LIBS="$lt_save_LIBS" -fi -AC_SUBST([LIBADD_DLOPEN]) - -LIBADD_SHL_LOAD= -AC_CHECK_FUNC([shl_load], - [AC_DEFINE([HAVE_SHL_LOAD], [1], - [Define if you have the shl_load function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"], - [AC_CHECK_LIB([dld], [shl_load], - [AC_DEFINE([HAVE_SHL_LOAD], [1], - [Define if you have the shl_load function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" - LIBADD_SHL_LOAD="-ldld"])]) -AC_SUBST([LIBADD_SHL_LOAD]) - -case $host_os in -darwin[[1567]].*) -# We only want this for pre-Mac OS X 10.4. - AC_CHECK_FUNC([_dyld_func_lookup], - [AC_DEFINE([HAVE_DYLD], [1], - [Define if you have the _dyld_func_lookup function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"]) - ;; -beos*) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" - ;; -cygwin* | mingw* | os2* | pw32*) - AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include ]]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" - ;; -esac - -AC_CHECK_LIB([dld], [dld_link], - [AC_DEFINE([HAVE_DLD], [1], - [Define if you have the GNU dld library.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"]) -AC_SUBST([LIBADD_DLD_LINK]) - -m4_pattern_allow([^LT_DLPREOPEN$]) -LT_DLPREOPEN= -if test -n "$LT_DLLOADERS" -then - for lt_loader in $LT_DLLOADERS; do - LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " - done - AC_DEFINE([HAVE_LIBDLLOADER], [1], - [Define if libdlloader will be built on this platform]) -fi -AC_SUBST([LT_DLPREOPEN]) - -dnl This isn't used anymore, but set it for backwards compatibility -LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" -AC_SUBST([LIBADD_DL]) - -AC_LANG_POP -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:738: -1- AU_DEFUN([AC_LTDL_DLLIB], [m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:738: -1- AC_DEFUN([AC_LTDL_DLLIB], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_DLLIB' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:780: -1- AC_DEFUN([LT_SYS_SYMBOL_USCORE], [m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -AC_CACHE_CHECK([for _ prefix in compiled symbols], - [lt_cv_sys_symbol_underscore], - [lt_cv_sys_symbol_underscore=no - cat > conftest.$ac_ext <<_LT_EOF -void nm_test_func(){} -int main(){nm_test_func;return 0;} -_LT_EOF - if AC_TRY_EVAL(ac_compile); then - # Now try to grab the symbols. - ac_nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then - # See whether the symbols have a leading underscore. - if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then - lt_cv_sys_symbol_underscore=yes - else - if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then - : - else - echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD - fi - fi - else - echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD - fi - else - echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD - cat conftest.c >&AS_MESSAGE_LOG_FD - fi - rm -rf conftest* - ]) - sys_symbol_underscore=$lt_cv_sys_symbol_underscore - AC_SUBST([sys_symbol_underscore]) -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:783: -1- AU_DEFUN([AC_LTDL_SYMBOL_USCORE], [m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:783: -1- AC_DEFUN([AC_LTDL_SYMBOL_USCORE], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYMBOL_USCORE' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:812: -1- AC_DEFUN([LT_FUNC_DLSYM_USCORE], [AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl -if test x"$lt_cv_sys_symbol_underscore" = xyes; then - if test x"$libltdl_cv_func_dlopen" = xyes || - test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then - AC_CACHE_CHECK([whether we have to add an underscore for dlsym], - [libltdl_cv_need_uscore], - [libltdl_cv_need_uscore=unknown - save_LIBS="$LIBS" - LIBS="$LIBS $LIBADD_DLOPEN" - _LT_TRY_DLOPEN_SELF( - [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes], - [], [libltdl_cv_need_uscore=cross]) - LIBS="$save_LIBS" - ]) - fi -fi - -if test x"$libltdl_cv_need_uscore" = xyes; then - AC_DEFINE([NEED_USCORE], [1], - [Define if dlsym() requires a leading underscore in symbol names.]) -fi -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:815: -1- AU_DEFUN([AC_LTDL_DLSYM_USCORE], [m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:815: -1- AC_DEFUN([AC_LTDL_DLSYM_USCORE], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_DLSYM_USCORE' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:36: -1- AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:40: -1- AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:41: -1- AC_DEFUN([_LT_AC_SHELL_INIT]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:42: -1- AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:44: -1- AC_DEFUN([_LT_AC_TAGVAR]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:45: -1- AC_DEFUN([AC_LTDL_ENABLE_INSTALL]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:46: -1- AC_DEFUN([AC_LTDL_PREOPEN]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:47: -1- AC_DEFUN([_LT_AC_SYS_COMPILER]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:48: -1- AC_DEFUN([_LT_AC_LOCK]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:49: -1- AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:50: -1- AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:51: -1- AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:52: -1- AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:53: -1- AC_DEFUN([AC_LIBTOOL_OBJDIR]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:54: -1- AC_DEFUN([AC_LTDL_OBJDIR]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:55: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:56: -1- AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:57: -1- AC_DEFUN([AC_PATH_MAGIC]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:58: -1- AC_DEFUN([AC_PROG_LD_GNU]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:59: -1- AC_DEFUN([AC_PROG_LD_RELOAD_FLAG]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:60: -1- AC_DEFUN([AC_DEPLIBS_CHECK_METHOD]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:61: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:62: -1- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:63: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:64: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:65: -1- AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:66: -1- AC_DEFUN([LT_AC_PROG_EGREP]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:71: -1- AC_DEFUN([_AC_PROG_LIBTOOL]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:72: -1- AC_DEFUN([AC_LIBTOOL_SETUP]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:73: -1- AC_DEFUN([_LT_AC_CHECK_DLFCN]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:74: -1- AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:75: -1- AC_DEFUN([_LT_AC_TAGCONFIG]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:76: -1- AC_DEFUN([AC_DISABLE_FAST_INSTALL]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:77: -1- AC_DEFUN([_LT_AC_LANG_CXX]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:78: -1- AC_DEFUN([_LT_AC_LANG_F77]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:79: -1- AC_DEFUN([_LT_AC_LANG_GCJ]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:80: -1- AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:81: -1- AC_DEFUN([_LT_AC_LANG_C_CONFIG]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:82: -1- AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:83: -1- AC_DEFUN([_LT_AC_LANG_CXX_CONFIG]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:84: -1- AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:85: -1- AC_DEFUN([_LT_AC_LANG_F77_CONFIG]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:86: -1- AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:87: -1- AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:88: -1- AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:89: -1- AC_DEFUN([_LT_AC_LANG_RC_CONFIG]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:90: -1- AC_DEFUN([AC_LIBTOOL_CONFIG]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:91: -1- AC_DEFUN([_LT_AC_FILE_LTDLL_C]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:93: -1- AC_DEFUN([_LT_AC_PROG_CXXCPP]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:96: -1- AC_DEFUN([_LT_PROG_F77]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:97: -1- AC_DEFUN([_LT_PROG_FC]) -m4trace:/usr/local/share/aclocal/lt~obsolete.m4:98: -1- AC_DEFUN([_LT_PROG_CXX]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/amversion.m4:20: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' -dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to -dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.14.1], [], - [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/amversion.m4:37: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14.1])dnl -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/auxdir.m4:52: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/cond.m4:32: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl - m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE])dnl -AC_SUBST([$1_FALSE])dnl -_AM_SUBST_NOTMAKE([$1_TRUE])dnl -_AM_SUBST_NOTMAKE([$1_FALSE])dnl -m4_define([_AM_COND_VALUE_$1], [$2])dnl -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/depend.m4:156: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], - [$1], [CXX], [depcc="$CXX" am_compiler_list=], - [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], - [$1], [UPC], [depcc="$UPC" am_compiler_list=], - [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - am__universal=false - m4_case([$1], [CC], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac], - [CXX], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac]) - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/depend.m4:166: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/depend.m4:189: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl -AS_HELP_STRING( - [--enable-dependency-tracking], - [do not reject slow dependency extractors]) -AS_HELP_STRING( - [--disable-dependency-tracking], - [speeds up one-time build])]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH])dnl -_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -AC_SUBST([am__nodep])dnl -_AM_SUBST_NOTMAKE([am__nodep])dnl -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/depout.m4:61: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Older Autoconf quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/init.m4:167: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[AC_DIAGNOSE([obsolete], - [$0: two- and three-arguments forms are deprecated.]) -m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl -dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if( - m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), - [ok:ok],, - [m4_fatal([AC_INIT should be called with package and version arguments])])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) - AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) -AM_MISSING_PROG([AUTOCONF], [autoconf]) -AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) -AM_MISSING_PROG([AUTOHEADER], [autoheader]) -AM_MISSING_PROG([MAKEINFO], [makeinfo]) -AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES([CC])], - [m4_define([AC_PROG_CC], - m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES([CXX])], - [m4_define([AC_PROG_CXX], - m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES([OBJC])], - [m4_define([AC_PROG_OBJC], - m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], - [_AM_DEPENDENCIES([OBJCXX])], - [m4_define([AC_PROG_OBJCXX], - m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl -]) -AC_REQUIRE([AM_SILENT_RULES])dnl -dnl The testsuite driver may need to know about EXEEXT, so add the -dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This -dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. -AC_CONFIG_COMMANDS_PRE(dnl -[m4_provide_if([_AM_COMPILER_EXEEXT], - [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl - -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. - -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . - -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. - -END - AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) - fi -fi]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/init.m4:194: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. -_am_arg=$1 -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/install-sh.m4:21: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi -AC_SUBST([install_sh])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/lead-dot.m4:19: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/make.m4:49: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/missing.m4:38: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([missing])dnl -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " -else - am_missing_run= - AC_MSG_WARN(['missing' script is too old or missing]) -fi -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/options.m4:12: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/options.m4:18: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/options.m4:24: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/options.m4:30: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/prog-cc-c-o.m4:44: -1- AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -AC_LANG_PUSH([C])dnl -AC_CACHE_CHECK( - [whether $CC understands -c and -o together], - [am_cv_prog_cc_c_o], - [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i]) -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -AC_LANG_POP([C])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/prog-cc-c-o.m4:47: -1- AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/python.m4:219: -1- AC_DEFUN([AM_PATH_PYTHON], [ - dnl Find a Python interpreter. Python versions prior to 2.0 are not - dnl supported. (2.0 was released on October 16, 2000). - m4_define_default([_AM_PYTHON_INTERPRETER_LIST], -[python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 dnl - python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0]) - - AC_ARG_VAR([PYTHON], [the Python interpreter]) - - m4_if([$1],[],[ - dnl No version check is needed. - # Find any Python interpreter. - if test -z "$PYTHON"; then - AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) - fi - am_display_PYTHON=python - ], [ - dnl A version check is needed. - if test -n "$PYTHON"; then - # If the user set $PYTHON, use it and don't search something else. - AC_MSG_CHECKING([whether $PYTHON version is >= $1]) - AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], - [AC_MSG_RESULT([yes])], - [AC_MSG_RESULT([no]) - AC_MSG_ERROR([Python interpreter is too old])]) - am_display_PYTHON=$PYTHON - else - # Otherwise, try each interpreter until we find one that satisfies - # VERSION. - AC_CACHE_CHECK([for a Python interpreter with version >= $1], - [am_cv_pathless_PYTHON],[ - for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do - test "$am_cv_pathless_PYTHON" = none && break - AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) - done]) - # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. - if test "$am_cv_pathless_PYTHON" = none; then - PYTHON=: - else - AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) - fi - am_display_PYTHON=$am_cv_pathless_PYTHON - fi - ]) - - if test "$PYTHON" = :; then - dnl Run any user-specified action, or abort. - m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) - else - - dnl Query Python for its version number. Getting [:3] seems to be - dnl the best way to do this; it's what "site.py" does in the standard - dnl library. - - AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], - [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`]) - AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) - - dnl Use the values of $prefix and $exec_prefix for the corresponding - dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made - dnl distinct variables so they can be overridden if need be. However, - dnl general consensus is that you shouldn't need this ability. - - AC_SUBST([PYTHON_PREFIX], ['${prefix}']) - AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) - - dnl At times (like when building shared libraries) you may want - dnl to know which OS platform Python thinks this is. - - AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], - [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) - AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) - - # Just factor out some code duplication. - am_python_setup_sysconfig="\ -import sys -# Prefer sysconfig over distutils.sysconfig, for better compatibility -# with python 3.x. See automake bug#10227. -try: - import sysconfig -except ImportError: - can_use_sysconfig = 0 -else: - can_use_sysconfig = 1 -# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: -# -try: - from platform import python_implementation - if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7': - can_use_sysconfig = 0 -except ImportError: - pass" - - dnl Set up 4 directories: - - dnl pythondir -- where to install python scripts. This is the - dnl site-packages directory, not the python standard library - dnl directory like in previous automake betas. This behavior - dnl is more consistent with lispdir.m4 for example. - dnl Query distutils for this directory. - AC_CACHE_CHECK([for $am_display_PYTHON script directory], - [am_cv_python_pythondir], - [if test "x$prefix" = xNONE - then - am_py_prefix=$ac_default_prefix - else - am_py_prefix=$prefix - fi - am_cv_python_pythondir=`$PYTHON -c " -$am_python_setup_sysconfig -if can_use_sysconfig: - sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) -else: - from distutils import sysconfig - sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') -sys.stdout.write(sitedir)"` - case $am_cv_python_pythondir in - $am_py_prefix*) - am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` - am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` - ;; - *) - case $am_py_prefix in - /usr|/System*) ;; - *) - am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages - ;; - esac - ;; - esac - ]) - AC_SUBST([pythondir], [$am_cv_python_pythondir]) - - dnl pkgpythondir -- $PACKAGE directory under pythondir. Was - dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is - dnl more consistent with the rest of automake. - - AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) - - dnl pyexecdir -- directory for installing python extension modules - dnl (shared libraries) - dnl Query distutils for this directory. - AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], - [am_cv_python_pyexecdir], - [if test "x$exec_prefix" = xNONE - then - am_py_exec_prefix=$am_py_prefix - else - am_py_exec_prefix=$exec_prefix - fi - am_cv_python_pyexecdir=`$PYTHON -c " -$am_python_setup_sysconfig -if can_use_sysconfig: - sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) -else: - from distutils import sysconfig - sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') -sys.stdout.write(sitedir)"` - case $am_cv_python_pyexecdir in - $am_py_exec_prefix*) - am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` - am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` - ;; - *) - case $am_py_exec_prefix in - /usr|/System*) ;; - *) - am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages - ;; - esac - ;; - esac - ]) - AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) - - dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) - - AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) - - dnl Run any user-specified action. - $2 - fi - -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/python.m4:239: -1- AC_DEFUN([AM_PYTHON_CHECK_VERSION], [prog="import sys -# split strings by '.' and convert to numeric. Append some zeros -# because we need at least 4 digits for the hex conversion. -# map returns an iterator in Python 3.0 and a list in 2.x -minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] -minverhex = 0 -# xrange is not present in Python 3.0 and range returns an iterator -for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] -sys.exit(sys.hexversion < minverhex)" - AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/runlog.m4:17: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD - ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - (exit $ac_status); }]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/sanity.m4:82: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[[\\\"\#\$\&\'\`$am_lf]]*) - AC_MSG_ERROR([unsafe absolute working directory name]);; -esac -case $srcdir in - *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; -esac - -# Do 'set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken - alias in your environment]) - fi - if test "$[2]" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT([yes]) -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi -AC_CONFIG_COMMANDS_PRE( - [AC_MSG_CHECKING([that generated files are newer than configure]) - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - AC_MSG_RESULT([done])]) -rm -f conftest.file -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/silent.m4:60: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl -AS_HELP_STRING( - [--enable-silent-rules], - [less verbose build output (undo: "make V=1")]) -AS_HELP_STRING( - [--disable-silent-rules], - [verbose build output (undo: "make V=0")])dnl -]) -case $enable_silent_rules in @%:@ ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; -esac -dnl -dnl A few 'make' implementations (e.g., NonStop OS and NextStep) -dnl do not support nested variable expansions. -dnl See automake bug#9928 and bug#10237. -am_make=${MAKE-make} -AC_CACHE_CHECK([whether $am_make supports nested variables], - [am_cv_make_support_nested_variables], - [if AS_ECHO([['TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi]) -if test $am_cv_make_support_nested_variables = yes; then - dnl Using '$V' instead of '$(V)' breaks IRIX make. - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AC_SUBST([AM_V])dnl -AM_SUBST_NOTMAKE([AM_V])dnl -AC_SUBST([AM_DEFAULT_V])dnl -AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl -AC_SUBST([AM_DEFAULT_VERBOSITY])dnl -AM_BACKSLASH='\' -AC_SUBST([AM_BACKSLASH])dnl -_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/strip.m4:28: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/substnot.m4:12: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/substnot.m4:17: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/tar.m4:132: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AC_SUBST([AMTAR], ['$${TAR-tar}']) - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' - -m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - - [m4_case([$1], - [ustar], - [# The POSIX 1988 'ustar' format is defined with fixed-size fields. - # There is notably a 21 bits limit for the UID and the GID. In fact, - # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 - # and bug#13588). - am_max_uid=2097151 # 2^21 - 1 - am_max_gid=$am_max_uid - # The $UID and $GID variables are not portable, so we need to resort - # to the POSIX-mandated id(1) utility. Errors in the 'id' calls - # below are definitely unexpected, so allow the users to see them - # (that is, avoid stderr redirection). - am_uid=`id -u || echo unknown` - am_gid=`id -g || echo unknown` - AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) - if test $am_uid -le $am_max_uid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi - AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) - if test $am_gid -le $am_max_gid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi], - - [pax], - [], - - [m4_fatal([Unknown tar format])]) - - AC_MSG_CHECKING([how to create a $1 tar archive]) - - # Go ahead even if we have the value already cached. We do so because we - # need to set the values for the 'am__tar' and 'am__untar' variables. - _am_tools=${am_cv_prog_tar_$1-$_am_tools} - - for _am_tool in $_am_tools; do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works. - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi - done - rm -rf conftest.dir - - AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) - AC_MSG_RESULT([$am_cv_prog_tar_$1])]) - -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) -m4trace:m4/ltoptions.m4:13: -1- AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) -m4trace:m4/ltoptions.m4:115: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:115: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:151: -1- AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:151: -1- AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete. -You should run autoupdate.])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:196: -1- AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) -]) -m4trace:m4/ltoptions.m4:200: -1- AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) -]) -m4trace:m4/ltoptions.m4:202: -1- AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -m4trace:m4/ltoptions.m4:202: -1- AC_DEFUN([AM_ENABLE_SHARED], [AC_DIAGNOSE([obsolete], [The macro `AM_ENABLE_SHARED' is obsolete. -You should run autoupdate.])dnl -AC_ENABLE_SHARED($@)]) -m4trace:m4/ltoptions.m4:203: -1- AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) -m4trace:m4/ltoptions.m4:203: -1- AC_DEFUN([AM_DISABLE_SHARED], [AC_DIAGNOSE([obsolete], [The macro `AM_DISABLE_SHARED' is obsolete. -You should run autoupdate.])dnl -AC_DISABLE_SHARED($@)]) -m4trace:m4/ltoptions.m4:250: -1- AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) -]) -m4trace:m4/ltoptions.m4:254: -1- AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) -]) -m4trace:m4/ltoptions.m4:256: -1- AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -m4trace:m4/ltoptions.m4:256: -1- AC_DEFUN([AM_ENABLE_STATIC], [AC_DIAGNOSE([obsolete], [The macro `AM_ENABLE_STATIC' is obsolete. -You should run autoupdate.])dnl -AC_ENABLE_STATIC($@)]) -m4trace:m4/ltoptions.m4:257: -1- AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) -m4trace:m4/ltoptions.m4:257: -1- AC_DEFUN([AM_DISABLE_STATIC], [AC_DIAGNOSE([obsolete], [The macro `AM_DISABLE_STATIC' is obsolete. -You should run autoupdate.])dnl -AC_DISABLE_STATIC($@)]) -m4trace:m4/ltoptions.m4:307: -1- AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:307: -1- AC_DEFUN([AC_ENABLE_FAST_INSTALL], [AC_DIAGNOSE([obsolete], [The macro `AC_ENABLE_FAST_INSTALL' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:314: -1- AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:314: -1- AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_DIAGNOSE([obsolete], [The macro `AC_DISABLE_FAST_INSTALL' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:347: -1- AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:347: -1- AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_PICMODE' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltsugar.m4:13: -1- AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) -m4trace:m4/ltversion.m4:23: -1- AC_DEFUN([LTVERSION_VERSION], [macro_version='2.2.6b' -macro_revision='1.3017' -_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) -_LT_DECL(, macro_revision, 0) -]) -m4trace:m4/lt~obsolete.m4:36: -1- AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) -m4trace:configure.ac:1: -1- m4_include([m4/acx_pthread.m4]) -m4trace:m4/acx_pthread.m4:363: -1- AC_DEFUN([ACX_PTHREAD], [ -AC_REQUIRE([AC_CANONICAL_HOST]) -AC_LANG_SAVE -AC_LANG_C -acx_pthread_ok=no - -# We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on True64 or Sequent). -# It gets checked for in the link test anyway. - -# First of all, check if the user has set any of the PTHREAD_LIBS, -# etcetera environment variables, and if threads linking works using -# them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) - AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) - AC_MSG_RESULT($acx_pthread_ok) - if test x"$acx_pthread_ok" = xno; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" - fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" -fi - -# We must check for the threads library under a number of different -# names; the ordering is very important because some systems -# (e.g. DEC) have both -lpthread and -lpthreads, where one of the -# libraries is broken (non-POSIX). - -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all, and "pthread-config" -# which is a program returning the flags for the Pth emulation library. - -acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" - -# The ordering *is* (sometimes) important. Some notes on the -# individual items follow: - -# pthreads: AIX (must check this before -lpthread) -# none: in case threads are in libc; should be tried before -Kthread and -# other compiler flags to prevent continual compiler warnings -# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc -# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# ... -mt is also the pthreads flag for HP/aCC -# pthread: Linux, etcetera -# --thread-safe: KAI C++ -# pthread-config: use pthread-config program (for GNU Pth library) - -case "${host_cpu}-${host_os}" in - *solaris*) - - # On Solaris (at least, for some versions), libc contains stubbed - # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (We need to link with -pthreads/-mt/ - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather - # a function called by this macro, so we could check for that, but - # who knows whether they'll stub that too in a future libc.) So, - # we'll just look for -pthreads and -lpthread first: - - acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" - ;; -esac - -if test x"$acx_pthread_ok" = xno; then -for flag in $acx_pthread_flags; do - - case $flag in - none) - AC_MSG_CHECKING([whether pthreads work without any flags]) - ;; - - -*) - AC_MSG_CHECKING([whether pthreads work with $flag]) - PTHREAD_CFLAGS="$flag" - ;; - - pthread-config) - AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) - if test x"$acx_pthread_config" = xno; then continue; fi - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; - - *) - AC_MSG_CHECKING([for the pthreads library -l$flag]) - PTHREAD_LIBS="-l$flag" - ;; - esac - - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. - AC_TRY_LINK([#include ], - [pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], - [acx_pthread_ok=yes]) - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - - AC_MSG_RESULT($acx_pthread_ok) - if test "x$acx_pthread_ok" = xyes; then - break; - fi - - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" -done -fi - -# Various other checks: -if test "x$acx_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - AC_MSG_CHECKING([for joinable pthread attribute]) - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - AC_TRY_LINK([#include ], [int attr=$attr; return attr;], - [attr_name=$attr; break]) - done - AC_MSG_RESULT($attr_name) - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then - AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, - [Define to necessary symbol if this constant - uses a non-standard name on your system.]) - fi - - AC_MSG_CHECKING([if more special flags are required for pthreads]) - flag=no - case "${host_cpu}-${host_os}" in - *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; - *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; - esac - AC_MSG_RESULT(${flag}) - if test "x$flag" != xno; then - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" - fi - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - # More AIX lossage: must compile with xlc_r or cc_r - if test x"$GCC" != xyes; then - AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) - else - PTHREAD_CC=$CC - fi - - # The next part tries to detect GCC inconsistency with -shared on some - # architectures and systems. The problem is that in certain - # configurations, when -shared is specified, GCC "forgets" to - # internally use various flags which are still necessary. - - # - # Prepare the flags - # - save_CFLAGS="$CFLAGS" - save_LIBS="$LIBS" - save_CC="$CC" - - # Try with the flags determined by the earlier checks. - # - # -Wl,-z,defs forces link-time symbol resolution, so that the - # linking checks with -shared actually have any value - # - # FIXME: -fPIC is required for -shared on many architectures, - # so we specify it here, but the right way would probably be to - # properly detect whether it is actually required. - CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CC="$PTHREAD_CC" - - # In order not to create several levels of indentation, we test - # the value of "$done" until we find the cure or run out of ideas. - done="no" - - # First, make sure the CFLAGS we added are actually accepted by our - # compiler. If not (and OS X's ld, for instance, does not accept -z), - # then we can't do this test. - if test x"$done" = xno; then - AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies]) - AC_TRY_LINK(,, , [done=yes]) - - if test "x$done" = xyes ; then - AC_MSG_RESULT([no]) - else - AC_MSG_RESULT([yes]) - fi - fi - - if test x"$done" = xno; then - AC_MSG_CHECKING([whether -pthread is sufficient with -shared]) - AC_TRY_LINK([#include ], - [pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], - [done=yes]) - - if test "x$done" = xyes; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi - fi - - # - # Linux gcc on some architectures such as mips/mipsel forgets - # about -lpthread - # - if test x"$done" = xno; then - AC_MSG_CHECKING([whether -lpthread fixes that]) - LIBS="-lpthread $PTHREAD_LIBS $save_LIBS" - AC_TRY_LINK([#include ], - [pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], - [done=yes]) - - if test "x$done" = xyes; then - AC_MSG_RESULT([yes]) - PTHREAD_LIBS="-lpthread $PTHREAD_LIBS" - else - AC_MSG_RESULT([no]) - fi - fi - # - # FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc - # - if test x"$done" = xno; then - AC_MSG_CHECKING([whether -lc_r fixes that]) - LIBS="-lc_r $PTHREAD_LIBS $save_LIBS" - AC_TRY_LINK([#include ], - [pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], - [done=yes]) - - if test "x$done" = xyes; then - AC_MSG_RESULT([yes]) - PTHREAD_LIBS="-lc_r $PTHREAD_LIBS" - else - AC_MSG_RESULT([no]) - fi - fi - if test x"$done" = xno; then - # OK, we have run out of ideas - AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries]) - - # so it's not safe to assume that we may use pthreads - acx_pthread_ok=no - fi - - CFLAGS="$save_CFLAGS" - LIBS="$save_LIBS" - CC="$save_CC" -else - PTHREAD_CC="$CC" -fi - -AC_SUBST(PTHREAD_LIBS) -AC_SUBST(PTHREAD_CFLAGS) -AC_SUBST(PTHREAD_CC) - -# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$acx_pthread_ok" = xyes; then - ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) - : -else - acx_pthread_ok=no - $2 -fi -AC_LANG_RESTORE -]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^_?A[CHUM]_]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([_AC_]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) -m4trace:configure.ac:10: -1- m4_pattern_allow([^AS_FLAGS$]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^_?m4_]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^dnl$]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^_?AS_]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^SHELL$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PATH_SEPARATOR$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_NAME$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_VERSION$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_STRING$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_URL$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^exec_prefix$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^prefix$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^program_transform_name$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^bindir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^sbindir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^libexecdir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^datarootdir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^datadir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^sysconfdir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^sharedstatedir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^localstatedir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^includedir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^oldincludedir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^docdir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^infodir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^htmldir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^dvidir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^pdfdir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^psdir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^libdir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^localedir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^mandir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_NAME$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_VERSION$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_STRING$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_URL$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^DEFS$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^ECHO_C$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^ECHO_N$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^ECHO_T$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^build_alias$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^host_alias$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^target_alias$]) -m4trace:configure.ac:15: -1- AC_CONFIG_MACRO_DIR([m4]) -m4trace:configure.ac:24: -1- AM_INIT_AUTOMAKE([1.9 dist-bzip2 dist-zip foreign subdir-objects]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) -m4trace:configure.ac:24: -1- AM_SET_CURRENT_AUTOMAKE_VERSION -m4trace:configure.ac:24: -1- AM_AUTOMAKE_VERSION([1.14.1]) -m4trace:configure.ac:24: -1- _AM_AUTOCONF_VERSION([2.69]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^INSTALL_DATA$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^am__isrc$]) -m4trace:configure.ac:24: -1- _AM_SUBST_NOTMAKE([am__isrc]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^CYGPATH_W$]) -m4trace:configure.ac:24: -1- _AM_SET_OPTIONS([1.9 dist-bzip2 dist-zip foreign subdir-objects]) -m4trace:configure.ac:24: -1- _AM_SET_OPTION([1.9]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([1.9]) -m4trace:configure.ac:24: -1- _AM_SET_OPTION([dist-bzip2]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([dist-bzip2]) -m4trace:configure.ac:24: -1- _AM_SET_OPTION([dist-zip]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([dist-zip]) -m4trace:configure.ac:24: -1- _AM_SET_OPTION([foreign]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([foreign]) -m4trace:configure.ac:24: -1- _AM_SET_OPTION([subdir-objects]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([subdir-objects]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^PACKAGE$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^VERSION$]) -m4trace:configure.ac:24: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) - AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([no-define]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^PACKAGE$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^VERSION$]) -m4trace:configure.ac:24: -1- AM_SANITY_CHECK -m4trace:configure.ac:24: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) -m4trace:configure.ac:24: -1- AM_MISSING_HAS_RUN -m4trace:configure.ac:24: -1- AM_AUX_DIR_EXPAND -m4trace:configure.ac:24: -1- m4_pattern_allow([^ACLOCAL$]) -m4trace:configure.ac:24: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AUTOCONF$]) -m4trace:configure.ac:24: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AUTOMAKE$]) -m4trace:configure.ac:24: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AUTOHEADER$]) -m4trace:configure.ac:24: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^MAKEINFO$]) -m4trace:configure.ac:24: -1- AM_PROG_INSTALL_SH -m4trace:configure.ac:24: -1- m4_pattern_allow([^install_sh$]) -m4trace:configure.ac:24: -1- AM_PROG_INSTALL_STRIP -m4trace:configure.ac:24: -1- m4_pattern_allow([^STRIP$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^MKDIR_P$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^mkdir_p$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AWK$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^SET_MAKE$]) -m4trace:configure.ac:24: -1- AM_SET_LEADING_DOT -m4trace:configure.ac:24: -1- m4_pattern_allow([^am__leading_dot$]) -m4trace:configure.ac:24: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([tar-ustar]) -m4trace:configure.ac:24: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([tar-pax]) -m4trace:configure.ac:24: -1- _AM_PROG_TAR([v7]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AMTAR$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^am__tar$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^am__untar$]) -m4trace:configure.ac:24: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES([CC])], - [m4_define([AC_PROG_CC], - m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES([CXX])], - [m4_define([AC_PROG_CXX], - m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES([OBJC])], - [m4_define([AC_PROG_OBJC], - m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], - [_AM_DEPENDENCIES([OBJCXX])], - [m4_define([AC_PROG_OBJCXX], - m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl -]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([no-dependencies]) -m4trace:configure.ac:24: -1- AM_SILENT_RULES -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_V$]) -m4trace:configure.ac:24: -1- AM_SUBST_NOTMAKE([AM_V]) -m4trace:configure.ac:24: -1- _AM_SUBST_NOTMAKE([AM_V]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_DEFAULT_V$]) -m4trace:configure.ac:24: -1- AM_SUBST_NOTMAKE([AM_DEFAULT_V]) -m4trace:configure.ac:24: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_BACKSLASH$]) -m4trace:configure.ac:24: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CFLAGS$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^LDFLAGS$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^ac_ct_CC$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^EXEEXT$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^OBJEXT$]) -m4trace:configure.ac:27: -1- _AM_PROG_CC_C_O -m4trace:configure.ac:27: -1- AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) -m4trace:configure.ac:27: -1- _AM_DEPENDENCIES([CC]) -m4trace:configure.ac:27: -1- AM_SET_DEPDIR -m4trace:configure.ac:27: -1- m4_pattern_allow([^DEPDIR$]) -m4trace:configure.ac:27: -1- AM_OUTPUT_DEPENDENCY_COMMANDS -m4trace:configure.ac:27: -1- AM_MAKE_INCLUDE -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__include$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__quote$]) -m4trace:configure.ac:27: -1- AM_DEP_TRACK -m4trace:configure.ac:27: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^AMDEP_TRUE$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^AMDEP_FALSE$]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__nodep$]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([am__nodep]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CCDEPMODE$]) -m4trace:configure.ac:27: -1- AM_CONDITIONAL([am__fastdepCC], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CXX$]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CXXFLAGS$]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^LDFLAGS$]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CXX$]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^ac_ct_CXX$]) -m4trace:configure.ac:28: -1- _AM_DEPENDENCIES([CXX]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CXXDEPMODE$]) -m4trace:configure.ac:28: -1- AM_CONDITIONAL([am__fastdepCXX], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) -m4trace:configure.ac:28: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) -m4trace:configure.ac:28: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) -m4trace:configure.ac:30: -1- AC_PROG_LIBTOOL -m4trace:configure.ac:30: -1- _m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. -You should run autoupdate.], [/usr/local/share/aclocal/libtool.m4:107: AC_PROG_LIBTOOL is expanded from... -configure.ac:30: the top level]) -m4trace:configure.ac:30: -1- LT_INIT -m4trace:configure.ac:30: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$]) -m4trace:configure.ac:30: -1- LTOPTIONS_VERSION -m4trace:configure.ac:30: -1- LTSUGAR_VERSION -m4trace:configure.ac:30: -1- LTVERSION_VERSION -m4trace:configure.ac:30: -1- LTOBSOLETE_VERSION -m4trace:configure.ac:30: -1- _LT_PROG_LTMAIN -m4trace:configure.ac:30: -1- m4_pattern_allow([^LIBTOOL$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^build$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^build_cpu$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^build_vendor$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^build_os$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^host$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^host_cpu$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^host_vendor$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^host_os$]) -m4trace:configure.ac:30: -1- _LT_PREPARE_SED_QUOTE_VARS -m4trace:configure.ac:30: -1- _LT_PROG_ECHO_BACKSLASH -m4trace:configure.ac:30: -1- LT_PATH_LD -m4trace:configure.ac:30: -1- m4_pattern_allow([^SED$]) -m4trace:configure.ac:30: -1- AC_PROG_EGREP -m4trace:configure.ac:30: -1- m4_pattern_allow([^GREP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^EGREP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^FGREP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^GREP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^LD$]) -m4trace:configure.ac:30: -1- LT_PATH_NM -m4trace:configure.ac:30: -1- m4_pattern_allow([^DUMPBIN$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^DUMPBIN$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^NM$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^LN_S$]) -m4trace:configure.ac:30: -1- LT_CMD_MAX_LEN -m4trace:configure.ac:30: -1- m4_pattern_allow([^OBJDUMP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^OBJDUMP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^DLLTOOL$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^DLLTOOL$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^AR$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^ac_ct_AR$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^STRIP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^RANLIB$]) -m4trace:configure.ac:30: -1- _LT_WITH_SYSROOT -m4trace:configure.ac:30: -1- m4_pattern_allow([LT_OBJDIR]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^LT_OBJDIR$]) -m4trace:configure.ac:30: -1- _LT_CC_BASENAME([$compiler]) -m4trace:configure.ac:30: -1- _LT_PATH_TOOL_PREFIX([${ac_tool_prefix}file], [/usr/bin$PATH_SEPARATOR$PATH]) -m4trace:configure.ac:30: -1- _LT_PATH_TOOL_PREFIX([file], [/usr/bin$PATH_SEPARATOR$PATH]) -m4trace:configure.ac:30: -1- LT_SUPPORTED_TAG([CC]) -m4trace:configure.ac:30: -1- _LT_COMPILER_BOILERPLATE -m4trace:configure.ac:30: -1- _LT_LINKER_BOILERPLATE -m4trace:configure.ac:30: -1- _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], [lt_cv_prog_compiler_rtti_exceptions], [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, )="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, ) -fno-rtti -fno-exceptions"]) -m4trace:configure.ac:30: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, ) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, )], [$_LT_TAGVAR(lt_prog_compiler_pic, )@&t@m4_if([],[],[ -DPIC],[m4_if([],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, ) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, )=" $_LT_TAGVAR(lt_prog_compiler_pic, )" ;; - esac], [_LT_TAGVAR(lt_prog_compiler_pic, )= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, )=no]) -m4trace:configure.ac:30: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, )=]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^MANIFEST_TOOL$]) -m4trace:configure.ac:30: -1- _LT_REQUIRED_DARWIN_CHECKS -m4trace:configure.ac:30: -1- m4_pattern_allow([^DSYMUTIL$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^NMEDIT$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^LIPO$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^OTOOL$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^OTOOL64$]) -m4trace:configure.ac:30: -1- _LT_LINKER_OPTION([if $CC understands -b], [lt_cv_prog_compiler__b], [-b], [_LT_TAGVAR(archive_cmds, )='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, )='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags']) -m4trace:configure.ac:30: -1- LT_SYS_DLOPEN_SELF -m4trace:configure.ac:30: -1- m4_pattern_allow([^CPP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CPP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^STDC_HEADERS$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) -m4trace:configure.ac:30: -1- LT_LANG([CXX]) -m4trace:configure.ac:30: -1- LT_SUPPORTED_TAG([CXX]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CXXCPP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CXXCPP$]) -m4trace:configure.ac:30: -1- _LT_COMPILER_BOILERPLATE -m4trace:configure.ac:30: -1- _LT_LINKER_BOILERPLATE -m4trace:configure.ac:30: -1- _LT_CC_BASENAME([$compiler]) -m4trace:configure.ac:30: -1- LT_PATH_LD -m4trace:configure.ac:30: -1- m4_pattern_allow([^LD$]) -m4trace:configure.ac:30: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, CXX) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, CXX)], [$_LT_TAGVAR(lt_prog_compiler_pic, CXX)@&t@m4_if([CXX],[],[ -DPIC],[m4_if([CXX],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, CXX) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, CXX)=" $_LT_TAGVAR(lt_prog_compiler_pic, CXX)" ;; - esac], [_LT_TAGVAR(lt_prog_compiler_pic, CXX)= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, CXX)=no]) -m4trace:configure.ac:30: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works_CXX], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, CXX)=]) -m4trace:configure.ac:38: -1- m4_pattern_allow([^PYTHON$]) -m4trace:configure.ac:40: -1- AM_PYTHON_CHECK_VERSION([$PYTHON], [2.3], [:], [PYTHON=":"]) -m4trace:configure.ac:40: -1- AM_RUN_LOG([$PYTHON -c "$prog"]) -m4trace:configure.ac:41: -1- AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != ":"]) -m4trace:configure.ac:41: -1- m4_pattern_allow([^HAVE_PYTHON_TRUE$]) -m4trace:configure.ac:41: -1- m4_pattern_allow([^HAVE_PYTHON_FALSE$]) -m4trace:configure.ac:41: -1- _AM_SUBST_NOTMAKE([HAVE_PYTHON_TRUE]) -m4trace:configure.ac:41: -1- _AM_SUBST_NOTMAKE([HAVE_PYTHON_FALSE]) -m4trace:configure.ac:57: -1- ACX_PTHREAD([], [AS_IF([test "x$with_pthreads" != "xcheck"], - [AC_MSG_FAILURE( - [--with-pthreads was specified, but unable to be used])])]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_LANG_SAVE' is obsolete. -You should run autoupdate.], [../../lib/autoconf/lang.m4:128: AC_LANG_SAVE is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_LANG_C' is obsolete. -You should run autoupdate.], [../../lib/autoconf/c.m4:72: AC_LANG_C is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^acx_pthread_config$]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_CREATE_JOINABLE$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_CC$]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_LIBS$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_CFLAGS$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_CC$]) -m4trace:configure.ac:57: -2- m4_pattern_allow([^HAVE_PTHREAD$]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_LANG_RESTORE' is obsolete. -You should run autoupdate.], [../../lib/autoconf/lang.m4:134: AC_LANG_RESTORE is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:58: -1- AM_CONDITIONAL([HAVE_PTHREADS], [test "x$have_pthreads" == "xyes"]) -m4trace:configure.ac:58: -1- m4_pattern_allow([^HAVE_PTHREADS_TRUE$]) -m4trace:configure.ac:58: -1- m4_pattern_allow([^HAVE_PTHREADS_FALSE$]) -m4trace:configure.ac:58: -1- _AM_SUBST_NOTMAKE([HAVE_PTHREADS_TRUE]) -m4trace:configure.ac:58: -1- _AM_SUBST_NOTMAKE([HAVE_PTHREADS_FALSE]) -m4trace:configure.ac:59: -1- m4_pattern_allow([^PTHREAD_CFLAGS$]) -m4trace:configure.ac:60: -1- m4_pattern_allow([^PTHREAD_LIBS$]) -m4trace:configure.ac:68: -1- m4_pattern_allow([^LIB@&t@OBJS$]) -m4trace:configure.ac:68: -1- m4_pattern_allow([^LTLIBOBJS$]) -m4trace:configure.ac:68: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) -m4trace:configure.ac:68: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) -m4trace:configure.ac:68: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) -m4trace:configure.ac:68: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) -m4trace:configure.ac:68: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) -m4trace:configure.ac:68: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) -m4trace:configure.ac:68: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS -m4trace:configure.ac:68: -1- _LT_PROG_LTMAIN diff --git a/vendor/gtest-1.6.0/autom4te.cache/traces.1 b/vendor/gtest-1.6.0/autom4te.cache/traces.1 deleted file mode 100644 index e48cfda5..00000000 --- a/vendor/gtest-1.6.0/autom4te.cache/traces.1 +++ /dev/null @@ -1,662 +0,0 @@ -m4trace:aclocal.m4:1385: -1- m4_include([m4/libtool.m4]) -m4trace:aclocal.m4:1386: -1- m4_include([m4/ltoptions.m4]) -m4trace:aclocal.m4:1387: -1- m4_include([m4/ltsugar.m4]) -m4trace:aclocal.m4:1388: -1- m4_include([m4/ltversion.m4]) -m4trace:aclocal.m4:1389: -1- m4_include([m4/lt~obsolete.m4]) -m4trace:configure.ac:1: -1- m4_include([m4/acx_pthread.m4]) -m4trace:configure.ac:10: -1- AC_INIT([Google C++ Testing Framework], [1.6.0], [googletestframework@googlegroups.com], [gtest]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^_?A[CHUM]_]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([_AC_]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) -m4trace:configure.ac:10: -1- m4_pattern_allow([^AS_FLAGS$]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^_?m4_]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^dnl$]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^_?AS_]) -m4trace:configure.ac:10: -1- AC_SUBST([SHELL]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([SHELL]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^SHELL$]) -m4trace:configure.ac:10: -1- AC_SUBST([PATH_SEPARATOR]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PATH_SEPARATOR$]) -m4trace:configure.ac:10: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([PACKAGE_NAME]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_NAME$]) -m4trace:configure.ac:10: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) -m4trace:configure.ac:10: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_VERSION$]) -m4trace:configure.ac:10: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([PACKAGE_STRING]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_STRING$]) -m4trace:configure.ac:10: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) -m4trace:configure.ac:10: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([PACKAGE_URL]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_URL$]) -m4trace:configure.ac:10: -1- AC_SUBST([exec_prefix], [NONE]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([exec_prefix]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^exec_prefix$]) -m4trace:configure.ac:10: -1- AC_SUBST([prefix], [NONE]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([prefix]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^prefix$]) -m4trace:configure.ac:10: -1- AC_SUBST([program_transform_name], [s,x,x,]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([program_transform_name]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^program_transform_name$]) -m4trace:configure.ac:10: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([bindir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^bindir$]) -m4trace:configure.ac:10: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([sbindir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^sbindir$]) -m4trace:configure.ac:10: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([libexecdir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^libexecdir$]) -m4trace:configure.ac:10: -1- AC_SUBST([datarootdir], ['${prefix}/share']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([datarootdir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^datarootdir$]) -m4trace:configure.ac:10: -1- AC_SUBST([datadir], ['${datarootdir}']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([datadir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^datadir$]) -m4trace:configure.ac:10: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([sysconfdir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^sysconfdir$]) -m4trace:configure.ac:10: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([sharedstatedir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^sharedstatedir$]) -m4trace:configure.ac:10: -1- AC_SUBST([localstatedir], ['${prefix}/var']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([localstatedir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^localstatedir$]) -m4trace:configure.ac:10: -1- AC_SUBST([includedir], ['${prefix}/include']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([includedir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^includedir$]) -m4trace:configure.ac:10: -1- AC_SUBST([oldincludedir], ['/usr/include']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([oldincludedir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^oldincludedir$]) -m4trace:configure.ac:10: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], - ['${datarootdir}/doc/${PACKAGE_TARNAME}'], - ['${datarootdir}/doc/${PACKAGE}'])]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([docdir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^docdir$]) -m4trace:configure.ac:10: -1- AC_SUBST([infodir], ['${datarootdir}/info']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([infodir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^infodir$]) -m4trace:configure.ac:10: -1- AC_SUBST([htmldir], ['${docdir}']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([htmldir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^htmldir$]) -m4trace:configure.ac:10: -1- AC_SUBST([dvidir], ['${docdir}']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([dvidir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^dvidir$]) -m4trace:configure.ac:10: -1- AC_SUBST([pdfdir], ['${docdir}']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([pdfdir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^pdfdir$]) -m4trace:configure.ac:10: -1- AC_SUBST([psdir], ['${docdir}']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([psdir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^psdir$]) -m4trace:configure.ac:10: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([libdir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^libdir$]) -m4trace:configure.ac:10: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([localedir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^localedir$]) -m4trace:configure.ac:10: -1- AC_SUBST([mandir], ['${datarootdir}/man']) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([mandir]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^mandir$]) -m4trace:configure.ac:10: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_NAME$]) -m4trace:configure.ac:10: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ -@%:@undef PACKAGE_NAME]) -m4trace:configure.ac:10: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) -m4trace:configure.ac:10: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ -@%:@undef PACKAGE_TARNAME]) -m4trace:configure.ac:10: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_VERSION$]) -m4trace:configure.ac:10: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ -@%:@undef PACKAGE_VERSION]) -m4trace:configure.ac:10: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_STRING$]) -m4trace:configure.ac:10: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ -@%:@undef PACKAGE_STRING]) -m4trace:configure.ac:10: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) -m4trace:configure.ac:10: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ -@%:@undef PACKAGE_BUGREPORT]) -m4trace:configure.ac:10: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_URL$]) -m4trace:configure.ac:10: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ -@%:@undef PACKAGE_URL]) -m4trace:configure.ac:10: -1- AC_SUBST([DEFS]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([DEFS]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^DEFS$]) -m4trace:configure.ac:10: -1- AC_SUBST([ECHO_C]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([ECHO_C]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^ECHO_C$]) -m4trace:configure.ac:10: -1- AC_SUBST([ECHO_N]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([ECHO_N]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^ECHO_N$]) -m4trace:configure.ac:10: -1- AC_SUBST([ECHO_T]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([ECHO_T]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^ECHO_T$]) -m4trace:configure.ac:10: -1- AC_SUBST([LIBS]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([LIBS]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:10: -1- AC_SUBST([build_alias]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([build_alias]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^build_alias$]) -m4trace:configure.ac:10: -1- AC_SUBST([host_alias]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([host_alias]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^host_alias$]) -m4trace:configure.ac:10: -1- AC_SUBST([target_alias]) -m4trace:configure.ac:10: -1- AC_SUBST_TRACE([target_alias]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^target_alias$]) -m4trace:configure.ac:16: -1- AC_CONFIG_AUX_DIR([build-aux]) -m4trace:configure.ac:17: -1- AC_CONFIG_HEADERS([build-aux/config.h]) -m4trace:configure.ac:18: -1- AC_CONFIG_FILES([Makefile]) -m4trace:configure.ac:19: -1- AC_CONFIG_FILES([scripts/gtest-config], [chmod +x scripts/gtest-config]) -m4trace:configure.ac:24: -1- AM_INIT_AUTOMAKE([1.9 dist-bzip2 dist-zip foreign subdir-objects]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) -m4trace:configure.ac:24: -1- AM_AUTOMAKE_VERSION([1.14.1]) -m4trace:configure.ac:24: -1- AC_REQUIRE_AUX_FILE([install-sh]) -m4trace:configure.ac:24: -1- AC_SUBST([INSTALL_PROGRAM]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) -m4trace:configure.ac:24: -1- AC_SUBST([INSTALL_SCRIPT]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) -m4trace:configure.ac:24: -1- AC_SUBST([INSTALL_DATA]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([INSTALL_DATA]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^INSTALL_DATA$]) -m4trace:configure.ac:24: -1- AC_SUBST([am__isrc], [' -I$(srcdir)']) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([am__isrc]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^am__isrc$]) -m4trace:configure.ac:24: -1- _AM_SUBST_NOTMAKE([am__isrc]) -m4trace:configure.ac:24: -1- AC_SUBST([CYGPATH_W]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([CYGPATH_W]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^CYGPATH_W$]) -m4trace:configure.ac:24: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([PACKAGE]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^PACKAGE$]) -m4trace:configure.ac:24: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([VERSION]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^VERSION$]) -m4trace:configure.ac:24: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^PACKAGE$]) -m4trace:configure.ac:24: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ -@%:@undef PACKAGE]) -m4trace:configure.ac:24: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^VERSION$]) -m4trace:configure.ac:24: -1- AH_OUTPUT([VERSION], [/* Version number of package */ -@%:@undef VERSION]) -m4trace:configure.ac:24: -1- AC_REQUIRE_AUX_FILE([missing]) -m4trace:configure.ac:24: -1- AC_SUBST([ACLOCAL]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([ACLOCAL]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^ACLOCAL$]) -m4trace:configure.ac:24: -1- AC_SUBST([AUTOCONF]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([AUTOCONF]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AUTOCONF$]) -m4trace:configure.ac:24: -1- AC_SUBST([AUTOMAKE]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([AUTOMAKE]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AUTOMAKE$]) -m4trace:configure.ac:24: -1- AC_SUBST([AUTOHEADER]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([AUTOHEADER]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AUTOHEADER$]) -m4trace:configure.ac:24: -1- AC_SUBST([MAKEINFO]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([MAKEINFO]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^MAKEINFO$]) -m4trace:configure.ac:24: -1- AC_SUBST([install_sh]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([install_sh]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^install_sh$]) -m4trace:configure.ac:24: -1- AC_SUBST([STRIP]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([STRIP]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^STRIP$]) -m4trace:configure.ac:24: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) -m4trace:configure.ac:24: -1- AC_REQUIRE_AUX_FILE([install-sh]) -m4trace:configure.ac:24: -1- AC_SUBST([MKDIR_P]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([MKDIR_P]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^MKDIR_P$]) -m4trace:configure.ac:24: -1- AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([mkdir_p]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^mkdir_p$]) -m4trace:configure.ac:24: -1- AC_SUBST([AWK]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([AWK]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AWK$]) -m4trace:configure.ac:24: -1- AC_SUBST([SET_MAKE]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([SET_MAKE]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^SET_MAKE$]) -m4trace:configure.ac:24: -1- AC_SUBST([am__leading_dot]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([am__leading_dot]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^am__leading_dot$]) -m4trace:configure.ac:24: -1- AC_SUBST([AMTAR], ['$${TAR-tar}']) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([AMTAR]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AMTAR$]) -m4trace:configure.ac:24: -1- AC_SUBST([am__tar]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([am__tar]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^am__tar$]) -m4trace:configure.ac:24: -1- AC_SUBST([am__untar]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([am__untar]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^am__untar$]) -m4trace:configure.ac:24: -1- AM_SILENT_RULES -m4trace:configure.ac:24: -1- AC_SUBST([AM_V]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([AM_V]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_V$]) -m4trace:configure.ac:24: -1- _AM_SUBST_NOTMAKE([AM_V]) -m4trace:configure.ac:24: -1- AC_SUBST([AM_DEFAULT_V]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([AM_DEFAULT_V]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_DEFAULT_V$]) -m4trace:configure.ac:24: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) -m4trace:configure.ac:24: -1- AC_SUBST([AM_DEFAULT_VERBOSITY]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([AM_DEFAULT_VERBOSITY]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) -m4trace:configure.ac:24: -1- AC_SUBST([AM_BACKSLASH]) -m4trace:configure.ac:24: -1- AC_SUBST_TRACE([AM_BACKSLASH]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_BACKSLASH$]) -m4trace:configure.ac:24: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) -m4trace:configure.ac:27: -1- AC_SUBST([CC]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([CC]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- AC_SUBST([CFLAGS]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([CFLAGS]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CFLAGS$]) -m4trace:configure.ac:27: -1- AC_SUBST([LDFLAGS]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([LDFLAGS]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^LDFLAGS$]) -m4trace:configure.ac:27: -1- AC_SUBST([LIBS]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([LIBS]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:27: -1- AC_SUBST([CPPFLAGS]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([CPPFLAGS]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:27: -1- AC_SUBST([CC]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([CC]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- AC_SUBST([CC]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([CC]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- AC_SUBST([CC]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([CC]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- AC_SUBST([CC]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([CC]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- AC_SUBST([ac_ct_CC]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([ac_ct_CC]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^ac_ct_CC$]) -m4trace:configure.ac:27: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([EXEEXT]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^EXEEXT$]) -m4trace:configure.ac:27: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([OBJEXT]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^OBJEXT$]) -m4trace:configure.ac:27: -1- AC_REQUIRE_AUX_FILE([compile]) -m4trace:configure.ac:27: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([DEPDIR]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^DEPDIR$]) -m4trace:configure.ac:27: -1- AC_SUBST([am__include]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([am__include]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__include$]) -m4trace:configure.ac:27: -1- AC_SUBST([am__quote]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([am__quote]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__quote$]) -m4trace:configure.ac:27: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -m4trace:configure.ac:27: -1- AC_SUBST([AMDEP_TRUE]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([AMDEP_TRUE]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^AMDEP_TRUE$]) -m4trace:configure.ac:27: -1- AC_SUBST([AMDEP_FALSE]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([AMDEP_FALSE]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^AMDEP_FALSE$]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) -m4trace:configure.ac:27: -1- AC_SUBST([AMDEPBACKSLASH]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) -m4trace:configure.ac:27: -1- AC_SUBST([am__nodep]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([am__nodep]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__nodep$]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([am__nodep]) -m4trace:configure.ac:27: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([CCDEPMODE]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CCDEPMODE$]) -m4trace:configure.ac:27: -1- AM_CONDITIONAL([am__fastdepCC], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) -m4trace:configure.ac:27: -1- AC_SUBST([am__fastdepCC_TRUE]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) -m4trace:configure.ac:27: -1- AC_SUBST([am__fastdepCC_FALSE]) -m4trace:configure.ac:27: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) -m4trace:configure.ac:28: -1- AC_SUBST([CXX]) -m4trace:configure.ac:28: -1- AC_SUBST_TRACE([CXX]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CXX$]) -m4trace:configure.ac:28: -1- AC_SUBST([CXXFLAGS]) -m4trace:configure.ac:28: -1- AC_SUBST_TRACE([CXXFLAGS]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CXXFLAGS$]) -m4trace:configure.ac:28: -1- AC_SUBST([LDFLAGS]) -m4trace:configure.ac:28: -1- AC_SUBST_TRACE([LDFLAGS]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^LDFLAGS$]) -m4trace:configure.ac:28: -1- AC_SUBST([LIBS]) -m4trace:configure.ac:28: -1- AC_SUBST_TRACE([LIBS]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:28: -1- AC_SUBST([CPPFLAGS]) -m4trace:configure.ac:28: -1- AC_SUBST_TRACE([CPPFLAGS]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:28: -1- AC_SUBST([CXX]) -m4trace:configure.ac:28: -1- AC_SUBST_TRACE([CXX]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CXX$]) -m4trace:configure.ac:28: -1- AC_SUBST([ac_ct_CXX]) -m4trace:configure.ac:28: -1- AC_SUBST_TRACE([ac_ct_CXX]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^ac_ct_CXX$]) -m4trace:configure.ac:28: -1- AC_SUBST([CXXDEPMODE], [depmode=$am_cv_CXX_dependencies_compiler_type]) -m4trace:configure.ac:28: -1- AC_SUBST_TRACE([CXXDEPMODE]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CXXDEPMODE$]) -m4trace:configure.ac:28: -1- AM_CONDITIONAL([am__fastdepCXX], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) -m4trace:configure.ac:28: -1- AC_SUBST([am__fastdepCXX_TRUE]) -m4trace:configure.ac:28: -1- AC_SUBST_TRACE([am__fastdepCXX_TRUE]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) -m4trace:configure.ac:28: -1- AC_SUBST([am__fastdepCXX_FALSE]) -m4trace:configure.ac:28: -1- AC_SUBST_TRACE([am__fastdepCXX_FALSE]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) -m4trace:configure.ac:28: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) -m4trace:configure.ac:28: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) -m4trace:configure.ac:30: -1- AC_PROG_LIBTOOL -m4trace:configure.ac:30: -1- _m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. -You should run autoupdate.], [m4/libtool.m4:107: AC_PROG_LIBTOOL is expanded from... -configure.ac:30: the top level]) -m4trace:configure.ac:30: -1- LT_INIT -m4trace:configure.ac:30: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$]) -m4trace:configure.ac:30: -1- AC_REQUIRE_AUX_FILE([ltmain.sh]) -m4trace:configure.ac:30: -1- AC_SUBST([LIBTOOL]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([LIBTOOL]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^LIBTOOL$]) -m4trace:configure.ac:30: -1- AC_CANONICAL_HOST -m4trace:configure.ac:30: -1- AC_CANONICAL_BUILD -m4trace:configure.ac:30: -1- AC_REQUIRE_AUX_FILE([config.sub]) -m4trace:configure.ac:30: -1- AC_REQUIRE_AUX_FILE([config.guess]) -m4trace:configure.ac:30: -1- AC_SUBST([build], [$ac_cv_build]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([build]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^build$]) -m4trace:configure.ac:30: -1- AC_SUBST([build_cpu], [$[1]]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([build_cpu]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^build_cpu$]) -m4trace:configure.ac:30: -1- AC_SUBST([build_vendor], [$[2]]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([build_vendor]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^build_vendor$]) -m4trace:configure.ac:30: -1- AC_SUBST([build_os]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([build_os]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^build_os$]) -m4trace:configure.ac:30: -1- AC_SUBST([host], [$ac_cv_host]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([host]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^host$]) -m4trace:configure.ac:30: -1- AC_SUBST([host_cpu], [$[1]]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([host_cpu]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^host_cpu$]) -m4trace:configure.ac:30: -1- AC_SUBST([host_vendor], [$[2]]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([host_vendor]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^host_vendor$]) -m4trace:configure.ac:30: -1- AC_SUBST([host_os]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([host_os]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^host_os$]) -m4trace:configure.ac:30: -1- AC_SUBST([SED]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([SED]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^SED$]) -m4trace:configure.ac:30: -1- AC_SUBST([GREP]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([GREP]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^GREP$]) -m4trace:configure.ac:30: -1- AC_SUBST([EGREP]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([EGREP]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^EGREP$]) -m4trace:configure.ac:30: -1- AC_SUBST([FGREP]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([FGREP]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^FGREP$]) -m4trace:configure.ac:30: -1- AC_SUBST([GREP]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([GREP]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^GREP$]) -m4trace:configure.ac:30: -1- AC_SUBST([LD]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([LD]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^LD$]) -m4trace:configure.ac:30: -1- AC_SUBST([DUMPBIN]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([DUMPBIN]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^DUMPBIN$]) -m4trace:configure.ac:30: -1- AC_SUBST([ac_ct_DUMPBIN]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([ac_ct_DUMPBIN]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) -m4trace:configure.ac:30: -1- AC_SUBST([DUMPBIN]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([DUMPBIN]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^DUMPBIN$]) -m4trace:configure.ac:30: -1- AC_SUBST([NM]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([NM]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^NM$]) -m4trace:configure.ac:30: -1- AC_SUBST([LN_S], [$as_ln_s]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([LN_S]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^LN_S$]) -m4trace:configure.ac:30: -1- AC_SUBST([OBJDUMP]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([OBJDUMP]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^OBJDUMP$]) -m4trace:configure.ac:30: -1- AC_SUBST([OBJDUMP]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([OBJDUMP]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^OBJDUMP$]) -m4trace:configure.ac:30: -1- AC_SUBST([DLLTOOL]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([DLLTOOL]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^DLLTOOL$]) -m4trace:configure.ac:30: -1- AC_SUBST([DLLTOOL]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([DLLTOOL]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^DLLTOOL$]) -m4trace:configure.ac:30: -1- AC_SUBST([AR]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([AR]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^AR$]) -m4trace:configure.ac:30: -1- AC_SUBST([ac_ct_AR]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([ac_ct_AR]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^ac_ct_AR$]) -m4trace:configure.ac:30: -1- AC_SUBST([STRIP]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([STRIP]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^STRIP$]) -m4trace:configure.ac:30: -1- AC_SUBST([RANLIB]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([RANLIB]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^RANLIB$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([LT_OBJDIR]) -m4trace:configure.ac:30: -1- AC_DEFINE_TRACE_LITERAL([LT_OBJDIR]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^LT_OBJDIR$]) -m4trace:configure.ac:30: -1- AH_OUTPUT([LT_OBJDIR], [/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -@%:@undef LT_OBJDIR]) -m4trace:configure.ac:30: -1- LT_SUPPORTED_TAG([CC]) -m4trace:configure.ac:30: -1- AC_SUBST([MANIFEST_TOOL]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([MANIFEST_TOOL]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^MANIFEST_TOOL$]) -m4trace:configure.ac:30: -1- AC_SUBST([DSYMUTIL]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([DSYMUTIL]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^DSYMUTIL$]) -m4trace:configure.ac:30: -1- AC_SUBST([NMEDIT]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([NMEDIT]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^NMEDIT$]) -m4trace:configure.ac:30: -1- AC_SUBST([LIPO]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([LIPO]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^LIPO$]) -m4trace:configure.ac:30: -1- AC_SUBST([OTOOL]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([OTOOL]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^OTOOL$]) -m4trace:configure.ac:30: -1- AC_SUBST([OTOOL64]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([OTOOL64]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^OTOOL64$]) -m4trace:configure.ac:30: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_DLFCN_H]) -m4trace:configure.ac:30: -1- AC_SUBST([CPP]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([CPP]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CPP$]) -m4trace:configure.ac:30: -1- AC_SUBST([CPPFLAGS]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([CPPFLAGS]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:30: -1- AC_SUBST([CPP]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([CPP]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CPP$]) -m4trace:configure.ac:30: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^STDC_HEADERS$]) -m4trace:configure.ac:30: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ -@%:@undef STDC_HEADERS]) -m4trace:configure.ac:30: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_SYS_TYPES_H]) -m4trace:configure.ac:30: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_SYS_STAT_H]) -m4trace:configure.ac:30: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_STDLIB_H]) -m4trace:configure.ac:30: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_STRING_H]) -m4trace:configure.ac:30: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_MEMORY_H]) -m4trace:configure.ac:30: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_STRINGS_H]) -m4trace:configure.ac:30: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_INTTYPES_H]) -m4trace:configure.ac:30: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_STDINT_H]) -m4trace:configure.ac:30: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_UNISTD_H]) -m4trace:configure.ac:30: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DLFCN_H]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) -m4trace:configure.ac:30: -1- LT_SUPPORTED_TAG([CXX]) -m4trace:configure.ac:30: -1- AC_SUBST([CXXCPP]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([CXXCPP]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CXXCPP$]) -m4trace:configure.ac:30: -1- AC_SUBST([CPPFLAGS]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([CPPFLAGS]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:30: -1- AC_SUBST([CXXCPP]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([CXXCPP]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CXXCPP$]) -m4trace:configure.ac:30: -1- AC_SUBST([LD]) -m4trace:configure.ac:30: -1- AC_SUBST_TRACE([LD]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^LD$]) -m4trace:configure.ac:38: -1- AC_SUBST([PYTHON]) -m4trace:configure.ac:38: -1- AC_SUBST_TRACE([PYTHON]) -m4trace:configure.ac:38: -1- m4_pattern_allow([^PYTHON$]) -m4trace:configure.ac:41: -1- AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != ":"]) -m4trace:configure.ac:41: -1- AC_SUBST([HAVE_PYTHON_TRUE]) -m4trace:configure.ac:41: -1- AC_SUBST_TRACE([HAVE_PYTHON_TRUE]) -m4trace:configure.ac:41: -1- m4_pattern_allow([^HAVE_PYTHON_TRUE$]) -m4trace:configure.ac:41: -1- AC_SUBST([HAVE_PYTHON_FALSE]) -m4trace:configure.ac:41: -1- AC_SUBST_TRACE([HAVE_PYTHON_FALSE]) -m4trace:configure.ac:41: -1- m4_pattern_allow([^HAVE_PYTHON_FALSE$]) -m4trace:configure.ac:41: -1- _AM_SUBST_NOTMAKE([HAVE_PYTHON_TRUE]) -m4trace:configure.ac:41: -1- _AM_SUBST_NOTMAKE([HAVE_PYTHON_FALSE]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_LANG_SAVE' is obsolete. -You should run autoupdate.], [../../lib/autoconf/lang.m4:128: AC_LANG_SAVE is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_LANG_C' is obsolete. -You should run autoupdate.], [../../lib/autoconf/c.m4:72: AC_LANG_C is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- AC_SUBST([acx_pthread_config]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([acx_pthread_config]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^acx_pthread_config$]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- AC_DEFINE_TRACE_LITERAL([PTHREAD_CREATE_JOINABLE]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_CREATE_JOINABLE$]) -m4trace:configure.ac:57: -1- AH_OUTPUT([PTHREAD_CREATE_JOINABLE], [/* Define to necessary symbol if this constant uses a non-standard name on - your system. */ -@%:@undef PTHREAD_CREATE_JOINABLE]) -m4trace:configure.ac:57: -1- AC_SUBST([PTHREAD_CC]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([PTHREAD_CC]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_CC$]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- AC_SUBST([PTHREAD_LIBS]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([PTHREAD_LIBS]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_LIBS$]) -m4trace:configure.ac:57: -1- AC_SUBST([PTHREAD_CFLAGS]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([PTHREAD_CFLAGS]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_CFLAGS$]) -m4trace:configure.ac:57: -1- AC_SUBST([PTHREAD_CC]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([PTHREAD_CC]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_CC$]) -m4trace:configure.ac:57: -2- AC_DEFINE_TRACE_LITERAL([HAVE_PTHREAD]) -m4trace:configure.ac:57: -2- m4_pattern_allow([^HAVE_PTHREAD$]) -m4trace:configure.ac:57: -2- AH_OUTPUT([HAVE_PTHREAD], [/* Define if you have POSIX threads libraries and header files. */ -@%:@undef HAVE_PTHREAD]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_LANG_RESTORE' is obsolete. -You should run autoupdate.], [../../lib/autoconf/lang.m4:134: AC_LANG_RESTORE is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:58: -1- AM_CONDITIONAL([HAVE_PTHREADS], [test "x$have_pthreads" == "xyes"]) -m4trace:configure.ac:58: -1- AC_SUBST([HAVE_PTHREADS_TRUE]) -m4trace:configure.ac:58: -1- AC_SUBST_TRACE([HAVE_PTHREADS_TRUE]) -m4trace:configure.ac:58: -1- m4_pattern_allow([^HAVE_PTHREADS_TRUE$]) -m4trace:configure.ac:58: -1- AC_SUBST([HAVE_PTHREADS_FALSE]) -m4trace:configure.ac:58: -1- AC_SUBST_TRACE([HAVE_PTHREADS_FALSE]) -m4trace:configure.ac:58: -1- m4_pattern_allow([^HAVE_PTHREADS_FALSE$]) -m4trace:configure.ac:58: -1- _AM_SUBST_NOTMAKE([HAVE_PTHREADS_TRUE]) -m4trace:configure.ac:58: -1- _AM_SUBST_NOTMAKE([HAVE_PTHREADS_FALSE]) -m4trace:configure.ac:59: -1- AC_SUBST([PTHREAD_CFLAGS]) -m4trace:configure.ac:59: -1- AC_SUBST_TRACE([PTHREAD_CFLAGS]) -m4trace:configure.ac:59: -1- m4_pattern_allow([^PTHREAD_CFLAGS$]) -m4trace:configure.ac:60: -1- AC_SUBST([PTHREAD_LIBS]) -m4trace:configure.ac:60: -1- AC_SUBST_TRACE([PTHREAD_LIBS]) -m4trace:configure.ac:60: -1- m4_pattern_allow([^PTHREAD_LIBS$]) -m4trace:configure.ac:68: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) -m4trace:configure.ac:68: -1- m4_pattern_allow([^LIB@&t@OBJS$]) -m4trace:configure.ac:68: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([LTLIBOBJS]) -m4trace:configure.ac:68: -1- m4_pattern_allow([^LTLIBOBJS$]) -m4trace:configure.ac:68: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) -m4trace:configure.ac:68: -1- AC_SUBST([am__EXEEXT_TRUE]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE]) -m4trace:configure.ac:68: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) -m4trace:configure.ac:68: -1- AC_SUBST([am__EXEEXT_FALSE]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE]) -m4trace:configure.ac:68: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) -m4trace:configure.ac:68: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) -m4trace:configure.ac:68: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([top_builddir]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([top_build_prefix]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([srcdir]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([abs_srcdir]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([top_srcdir]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([abs_top_srcdir]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([builddir]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([abs_builddir]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([abs_top_builddir]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([INSTALL]) -m4trace:configure.ac:68: -1- AC_SUBST_TRACE([MKDIR_P]) -m4trace:configure.ac:68: -1- AC_REQUIRE_AUX_FILE([ltmain.sh]) diff --git a/vendor/gtest-1.6.0/autom4te.cache/traces.2 b/vendor/gtest-1.6.0/autom4te.cache/traces.2 deleted file mode 100644 index 64ae1388..00000000 --- a/vendor/gtest-1.6.0/autom4te.cache/traces.2 +++ /dev/null @@ -1,3187 +0,0 @@ -m4trace:/usr/local/share/aclocal/argz.m4:76: -1- AC_DEFUN([gl_FUNC_ARGZ], [gl_PREREQ_ARGZ - -AC_CHECK_HEADERS([argz.h], [], [], [AC_INCLUDES_DEFAULT]) - -AC_CHECK_TYPES([error_t], - [], - [AC_DEFINE([error_t], [int], - [Define to a type to use for `error_t' if it is not otherwise available.]) - AC_DEFINE([__error_t_defined], [1], [Define so that glibc/gnulib argp.h - does not typedef error_t.])], - [#if defined(HAVE_ARGZ_H) -# include -#endif]) - -ARGZ_H= -AC_CHECK_FUNCS([argz_add argz_append argz_count argz_create_sep argz_insert \ - argz_next argz_stringify], [], [ARGZ_H=argz.h; AC_LIBOBJ([argz])]) - -dnl if have system argz functions, allow forced use of -dnl libltdl-supplied implementation (and default to do so -dnl on "known bad" systems). Could use a runtime check, but -dnl (a) detecting malloc issues is notoriously unreliable -dnl (b) only known system that declares argz functions, -dnl provides them, yet they are broken, is cygwin -dnl releases prior to 16-Mar-2007 (1.5.24 and earlier) -dnl So, it's more straightforward simply to special case -dnl this for known bad systems. -AS_IF([test -z "$ARGZ_H"], - [AC_CACHE_CHECK( - [if argz actually works], - [lt_cv_sys_argz_works], - [[case $host_os in #( - *cygwin*) - lt_cv_sys_argz_works=no - if test "$cross_compiling" != no; then - lt_cv_sys_argz_works="guessing no" - else - lt_sed_extract_leading_digits='s/^\([0-9\.]*\).*/\1/' - save_IFS=$IFS - IFS=-. - set x `uname -r | sed -e "$lt_sed_extract_leading_digits"` - IFS=$save_IFS - lt_os_major=${2-0} - lt_os_minor=${3-0} - lt_os_micro=${4-0} - if test "$lt_os_major" -gt 1 \ - || { test "$lt_os_major" -eq 1 \ - && { test "$lt_os_minor" -gt 5 \ - || { test "$lt_os_minor" -eq 5 \ - && test "$lt_os_micro" -gt 24; }; }; }; then - lt_cv_sys_argz_works=yes - fi - fi - ;; #( - *) lt_cv_sys_argz_works=yes ;; - esac]]) - AS_IF([test "$lt_cv_sys_argz_works" = yes], - [AC_DEFINE([HAVE_WORKING_ARGZ], 1, - [This value is set to 1 to indicate that the system argz facility works])], - [ARGZ_H=argz.h - AC_LIBOBJ([argz])])]) - -AC_SUBST([ARGZ_H]) -]) -m4trace:/usr/local/share/aclocal/argz.m4:79: -1- AC_DEFUN([gl_PREREQ_ARGZ], [:]) -m4trace:/usr/local/share/aclocal/ltdl.m4:19: -1- AC_DEFUN([LT_CONFIG_LTDL_DIR], [AC_BEFORE([$0], [LTDL_INIT]) -_$0($*) -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:77: -1- AC_DEFUN([LTDL_CONVENIENCE], [AC_BEFORE([$0], [LTDL_INIT])dnl -dnl Although the argument is deprecated and no longer documented, -dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one -dnl here make sure it is the same as any other declaration of libltdl's -dnl location! This also ensures lt_ltdl_dir is set when configure.ac is -dnl not yet using an explicit LT_CONFIG_LTDL_DIR. -m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl -_$0() -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:83: -1- AU_DEFUN([AC_LIBLTDL_CONVENIENCE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_CONVENIENCE]) -m4trace:/usr/local/share/aclocal/ltdl.m4:83: -1- AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBLTDL_CONVENIENCE' is obsolete. -You should run autoupdate.])dnl -_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_CONVENIENCE]) -m4trace:/usr/local/share/aclocal/ltdl.m4:133: -1- AC_DEFUN([LTDL_INSTALLABLE], [AC_BEFORE([$0], [LTDL_INIT])dnl -dnl Although the argument is deprecated and no longer documented, -dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one -dnl here make sure it is the same as any other declaration of libltdl's -dnl location! This also ensures lt_ltdl_dir is set when configure.ac is -dnl not yet using an explicit LT_CONFIG_LTDL_DIR. -m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl -_$0() -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:139: -1- AU_DEFUN([AC_LIBLTDL_INSTALLABLE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_INSTALLABLE]) -m4trace:/usr/local/share/aclocal/ltdl.m4:139: -1- AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBLTDL_INSTALLABLE' is obsolete. -You should run autoupdate.])dnl -_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_INSTALLABLE]) -m4trace:/usr/local/share/aclocal/ltdl.m4:216: -1- AC_DEFUN([_LT_LIBOBJ], [ - m4_pattern_allow([^_LT_LIBOBJS$]) - _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:349: -1- AC_DEFUN([LTDL_INIT], [dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -dnl We need to keep our own list of libobjs separate from our parent project, -dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while -dnl we look for our own LIBOBJs. -m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) -m4_pushdef([AC_LIBSOURCES]) - -dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: -m4_if(_LTDL_MODE, [], - [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) - m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])], - [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])]) - -AC_ARG_WITH([included_ltdl], - [AS_HELP_STRING([--with-included-ltdl], - [use the GNU ltdl sources included here])]) - -if test "x$with_included_ltdl" != xyes; then - # We are not being forced to use the included libltdl sources, so - # decide whether there is a useful installed version we can use. - AC_CHECK_HEADER([ltdl.h], - [AC_CHECK_DECL([lt_dlinterface_register], - [AC_CHECK_LIB([ltdl], [lt_dladvise_preload], - [with_included_ltdl=no], - [with_included_ltdl=yes])], - [with_included_ltdl=yes], - [AC_INCLUDES_DEFAULT - #include ])], - [with_included_ltdl=yes], - [AC_INCLUDES_DEFAULT] - ) -fi - -dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE -dnl was called yet, then for old times' sake, we assume libltdl is in an -dnl eponymous directory: -AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])]) - -AC_ARG_WITH([ltdl_include], - [AS_HELP_STRING([--with-ltdl-include=DIR], - [use the ltdl headers installed in DIR])]) - -if test -n "$with_ltdl_include"; then - if test -f "$with_ltdl_include/ltdl.h"; then : - else - AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include']) - fi -else - with_ltdl_include=no -fi - -AC_ARG_WITH([ltdl_lib], - [AS_HELP_STRING([--with-ltdl-lib=DIR], - [use the libltdl.la installed in DIR])]) - -if test -n "$with_ltdl_lib"; then - if test -f "$with_ltdl_lib/libltdl.la"; then : - else - AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib']) - fi -else - with_ltdl_lib=no -fi - -case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in - ,yes,no,no,) - m4_case(m4_default(_LTDL_TYPE, [convenience]), - [convenience], [_LTDL_CONVENIENCE], - [installable], [_LTDL_INSTALLABLE], - [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)]) - ;; - ,no,no,no,) - # If the included ltdl is not to be used, then use the - # preinstalled libltdl we found. - AC_DEFINE([HAVE_LTDL], [1], - [Define this if a modern libltdl is already installed]) - LIBLTDL=-lltdl - LTDLDEPS= - LTDLINCL= - ;; - ,no*,no,*) - AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together]) - ;; - *) with_included_ltdl=no - LIBLTDL="-L$with_ltdl_lib -lltdl" - LTDLDEPS= - LTDLINCL="-I$with_ltdl_include" - ;; -esac -INCLTDL="$LTDLINCL" - -# Report our decision... -AC_MSG_CHECKING([where to find libltdl headers]) -AC_MSG_RESULT([$LTDLINCL]) -AC_MSG_CHECKING([where to find libltdl library]) -AC_MSG_RESULT([$LIBLTDL]) - -_LTDL_SETUP - -dnl restore autoconf definition. -m4_popdef([AC_LIBOBJ]) -m4_popdef([AC_LIBSOURCES]) - -AC_CONFIG_COMMANDS_PRE([ - _ltdl_libobjs= - _ltdl_ltlibobjs= - if test -n "$_LT_LIBOBJS"; then - # Remove the extension. - _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' - for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do - _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" - _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" - done - fi - AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) - AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) -]) - -# Only expand once: -m4_define([LTDL_INIT]) -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:352: -1- AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)]) -m4trace:/usr/local/share/aclocal/ltdl.m4:352: -1- AC_DEFUN([AC_LIB_LTDL], [AC_DIAGNOSE([obsolete], [The macro `AC_LIB_LTDL' is obsolete. -You should run autoupdate.])dnl -LTDL_INIT($@)]) -m4trace:/usr/local/share/aclocal/ltdl.m4:353: -1- AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)]) -m4trace:/usr/local/share/aclocal/ltdl.m4:353: -1- AC_DEFUN([AC_WITH_LTDL], [AC_DIAGNOSE([obsolete], [The macro `AC_WITH_LTDL' is obsolete. -You should run autoupdate.])dnl -LTDL_INIT($@)]) -m4trace:/usr/local/share/aclocal/ltdl.m4:354: -1- AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)]) -m4trace:/usr/local/share/aclocal/ltdl.m4:354: -1- AC_DEFUN([LT_WITH_LTDL], [AC_DIAGNOSE([obsolete], [The macro `LT_WITH_LTDL' is obsolete. -You should run autoupdate.])dnl -LTDL_INIT($@)]) -m4trace:/usr/local/share/aclocal/ltdl.m4:421: -1- AC_DEFUN([_LTDL_SETUP], [AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_SYS_MODULE_EXT])dnl -AC_REQUIRE([LT_SYS_MODULE_PATH])dnl -AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl -AC_REQUIRE([LT_LIB_DLLOAD])dnl -AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl -AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl -AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl -AC_REQUIRE([gl_FUNC_ARGZ])dnl - -m4_require([_LT_CHECK_OBJDIR])dnl -m4_require([_LT_HEADER_DLFCN])dnl -m4_require([_LT_CHECK_DLPREOPEN])dnl -m4_require([_LT_DECL_SED])dnl - -dnl Don't require this, or it will be expanded earlier than the code -dnl that sets the variables it relies on: -_LT_ENABLE_INSTALL - -dnl _LTDL_MODE specific code must be called at least once: -_LTDL_MODE_DISPATCH - -# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS -# the user used. This is so that ltdl.h can pick up the parent projects -# config.h file, The first file in AC_CONFIG_HEADERS must contain the -# definitions required by ltdl.c. -# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). -AC_CONFIG_COMMANDS_PRE([dnl -m4_pattern_allow([^LT_CONFIG_H$])dnl -m4_ifset([AH_HEADER], - [LT_CONFIG_H=AH_HEADER], - [m4_ifset([AC_LIST_HEADERS], - [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[ ]]*,,;s,[[ :]].*$,,'`], - [])])]) -AC_SUBST([LT_CONFIG_H]) - -AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], - [], [], [AC_INCLUDES_DEFAULT]) - -AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) -AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) - -m4_pattern_allow([LT_LIBEXT])dnl -AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) - -name= -eval "lt_libprefix=\"$libname_spec\"" -m4_pattern_allow([LT_LIBPREFIX])dnl -AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix]) - -name=ltdl -eval "LTDLOPEN=\"$libname_spec\"" -AC_SUBST([LTDLOPEN]) -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:539: -1- AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_CACHE_CHECK([whether deplibs are loaded by dlopen], - [lt_cv_sys_dlopen_deplibs], - [# PORTME does your system automatically load deplibs for dlopen? - # or its logical equivalent (e.g. shl_load for HP-UX < 11) - # For now, we just catch OSes we know something about -- in the - # future, we'll try test this programmatically. - lt_cv_sys_dlopen_deplibs=unknown - case $host_os in - aix3*|aix4.1.*|aix4.2.*) - # Unknown whether this is true for these versions of AIX, but - # we want this `case' here to explicitly catch those versions. - lt_cv_sys_dlopen_deplibs=unknown - ;; - aix[[4-9]]*) - lt_cv_sys_dlopen_deplibs=yes - ;; - amigaos*) - case $host_cpu in - powerpc) - lt_cv_sys_dlopen_deplibs=no - ;; - esac - ;; - darwin*) - # Assuming the user has installed a libdl from somewhere, this is true - # If you are looking for one http://www.opendarwin.org/projects/dlcompat - lt_cv_sys_dlopen_deplibs=yes - ;; - freebsd* | dragonfly*) - lt_cv_sys_dlopen_deplibs=yes - ;; - gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) - # GNU and its variants, using gnu ld.so (Glibc) - lt_cv_sys_dlopen_deplibs=yes - ;; - hpux10*|hpux11*) - lt_cv_sys_dlopen_deplibs=yes - ;; - interix*) - lt_cv_sys_dlopen_deplibs=yes - ;; - irix[[12345]]*|irix6.[[01]]*) - # Catch all versions of IRIX before 6.2, and indicate that we don't - # know how it worked for any of those versions. - lt_cv_sys_dlopen_deplibs=unknown - ;; - irix*) - # The case above catches anything before 6.2, and it's known that - # at 6.2 and later dlopen does load deplibs. - lt_cv_sys_dlopen_deplibs=yes - ;; - netbsd*) - lt_cv_sys_dlopen_deplibs=yes - ;; - openbsd*) - lt_cv_sys_dlopen_deplibs=yes - ;; - osf[[1234]]*) - # dlopen did load deplibs (at least at 4.x), but until the 5.x series, - # it did *not* use an RPATH in a shared library to find objects the - # library depends on, so we explicitly say `no'. - lt_cv_sys_dlopen_deplibs=no - ;; - osf5.0|osf5.0a|osf5.1) - # dlopen *does* load deplibs and with the right loader patch applied - # it even uses RPATH in a shared library to search for shared objects - # that the library depends on, but there's no easy way to know if that - # patch is installed. Since this is the case, all we can really - # say is unknown -- it depends on the patch being installed. If - # it is, this changes to `yes'. Without it, it would be `no'. - lt_cv_sys_dlopen_deplibs=unknown - ;; - osf*) - # the two cases above should catch all versions of osf <= 5.1. Read - # the comments above for what we know about them. - # At > 5.1, deplibs are loaded *and* any RPATH in a shared library - # is used to find them so we can finally say `yes'. - lt_cv_sys_dlopen_deplibs=yes - ;; - qnx*) - lt_cv_sys_dlopen_deplibs=yes - ;; - solaris*) - lt_cv_sys_dlopen_deplibs=yes - ;; - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - libltdl_cv_sys_dlopen_deplibs=yes - ;; - esac - ]) -if test "$lt_cv_sys_dlopen_deplibs" != yes; then - AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], - [Define if the OS needs help to load dependent libraries for dlopen().]) -fi -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:542: -1- AU_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:542: -1- AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYS_DLOPEN_DEPLIBS' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:569: -1- AC_DEFUN([LT_SYS_MODULE_EXT], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([which extension is used for runtime loadable modules], - [libltdl_cv_shlibext], -[ -module=yes -eval libltdl_cv_shlibext=$shrext_cmds -module=no -eval libltdl_cv_shrext=$shrext_cmds - ]) -if test -n "$libltdl_cv_shlibext"; then - m4_pattern_allow([LT_MODULE_EXT])dnl - AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], - [Define to the extension used for runtime loadable modules, say, ".so".]) -fi -if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then - m4_pattern_allow([LT_SHARED_EXT])dnl - AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], - [Define to the shared library suffix, say, ".dylib".]) -fi -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:572: -1- AU_DEFUN([AC_LTDL_SHLIBEXT], [m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:572: -1- AC_DEFUN([AC_LTDL_SHLIBEXT], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SHLIBEXT' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:588: -1- AC_DEFUN([LT_SYS_MODULE_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([which variable specifies run-time module search path], - [lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"]) -if test -n "$lt_cv_module_path_var"; then - m4_pattern_allow([LT_MODULE_PATH_VAR])dnl - AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"], - [Define to the name of the environment variable that determines the run-time module search path.]) -fi -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:591: -1- AU_DEFUN([AC_LTDL_SHLIBPATH], [m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:591: -1- AC_DEFUN([AC_LTDL_SHLIBPATH], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SHLIBPATH' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:616: -1- AC_DEFUN([LT_SYS_DLSEARCH_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([for the default library search path], - [lt_cv_sys_dlsearch_path], - [lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"]) -if test -n "$lt_cv_sys_dlsearch_path"; then - sys_dlsearch_path= - for dir in $lt_cv_sys_dlsearch_path; do - if test -z "$sys_dlsearch_path"; then - sys_dlsearch_path="$dir" - else - sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir" - fi - done - m4_pattern_allow([LT_DLSEARCH_PATH])dnl - AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"], - [Define to the system default library search path.]) -fi -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:619: -1- AU_DEFUN([AC_LTDL_SYSSEARCHPATH], [m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:619: -1- AC_DEFUN([AC_LTDL_SYSSEARCHPATH], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYSSEARCHPATH' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:735: -1- AC_DEFUN([LT_LIB_DLLOAD], [m4_pattern_allow([^LT_DLLOADERS$]) -LT_DLLOADERS= -AC_SUBST([LT_DLLOADERS]) - -AC_LANG_PUSH([C]) - -LIBADD_DLOPEN= -AC_SEARCH_LIBS([dlopen], [dl], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - if test "$ac_cv_search_dlopen" != "none required" ; then - LIBADD_DLOPEN="-ldl" - fi - libltdl_cv_lib_dl_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], - [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H -# include -#endif - ]], [[dlopen(0, 0);]])], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - libltdl_cv_func_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], - [AC_CHECK_LIB([svld], [dlopen], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])]) -if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes -then - lt_save_LIBS="$LIBS" - LIBS="$LIBS $LIBADD_DLOPEN" - AC_CHECK_FUNCS([dlerror]) - LIBS="$lt_save_LIBS" -fi -AC_SUBST([LIBADD_DLOPEN]) - -LIBADD_SHL_LOAD= -AC_CHECK_FUNC([shl_load], - [AC_DEFINE([HAVE_SHL_LOAD], [1], - [Define if you have the shl_load function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"], - [AC_CHECK_LIB([dld], [shl_load], - [AC_DEFINE([HAVE_SHL_LOAD], [1], - [Define if you have the shl_load function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" - LIBADD_SHL_LOAD="-ldld"])]) -AC_SUBST([LIBADD_SHL_LOAD]) - -case $host_os in -darwin[[1567]].*) -# We only want this for pre-Mac OS X 10.4. - AC_CHECK_FUNC([_dyld_func_lookup], - [AC_DEFINE([HAVE_DYLD], [1], - [Define if you have the _dyld_func_lookup function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"]) - ;; -beos*) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" - ;; -cygwin* | mingw* | os2* | pw32*) - AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include ]]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" - ;; -esac - -AC_CHECK_LIB([dld], [dld_link], - [AC_DEFINE([HAVE_DLD], [1], - [Define if you have the GNU dld library.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"]) -AC_SUBST([LIBADD_DLD_LINK]) - -m4_pattern_allow([^LT_DLPREOPEN$]) -LT_DLPREOPEN= -if test -n "$LT_DLLOADERS" -then - for lt_loader in $LT_DLLOADERS; do - LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " - done - AC_DEFINE([HAVE_LIBDLLOADER], [1], - [Define if libdlloader will be built on this platform]) -fi -AC_SUBST([LT_DLPREOPEN]) - -dnl This isn't used anymore, but set it for backwards compatibility -LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" -AC_SUBST([LIBADD_DL]) - -AC_LANG_POP -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:738: -1- AU_DEFUN([AC_LTDL_DLLIB], [m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:738: -1- AC_DEFUN([AC_LTDL_DLLIB], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_DLLIB' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:780: -1- AC_DEFUN([LT_SYS_SYMBOL_USCORE], [m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -AC_CACHE_CHECK([for _ prefix in compiled symbols], - [lt_cv_sys_symbol_underscore], - [lt_cv_sys_symbol_underscore=no - cat > conftest.$ac_ext <<_LT_EOF -void nm_test_func(){} -int main(){nm_test_func;return 0;} -_LT_EOF - if AC_TRY_EVAL(ac_compile); then - # Now try to grab the symbols. - ac_nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then - # See whether the symbols have a leading underscore. - if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then - lt_cv_sys_symbol_underscore=yes - else - if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then - : - else - echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD - fi - fi - else - echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD - fi - else - echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD - cat conftest.c >&AS_MESSAGE_LOG_FD - fi - rm -rf conftest* - ]) - sys_symbol_underscore=$lt_cv_sys_symbol_underscore - AC_SUBST([sys_symbol_underscore]) -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:783: -1- AU_DEFUN([AC_LTDL_SYMBOL_USCORE], [m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:783: -1- AC_DEFUN([AC_LTDL_SYMBOL_USCORE], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYMBOL_USCORE' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:812: -1- AC_DEFUN([LT_FUNC_DLSYM_USCORE], [AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl -if test x"$lt_cv_sys_symbol_underscore" = xyes; then - if test x"$libltdl_cv_func_dlopen" = xyes || - test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then - AC_CACHE_CHECK([whether we have to add an underscore for dlsym], - [libltdl_cv_need_uscore], - [libltdl_cv_need_uscore=unknown - save_LIBS="$LIBS" - LIBS="$LIBS $LIBADD_DLOPEN" - _LT_TRY_DLOPEN_SELF( - [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes], - [], [libltdl_cv_need_uscore=cross]) - LIBS="$save_LIBS" - ]) - fi -fi - -if test x"$libltdl_cv_need_uscore" = xyes; then - AC_DEFINE([NEED_USCORE], [1], - [Define if dlsym() requires a leading underscore in symbol names.]) -fi -]) -m4trace:/usr/local/share/aclocal/ltdl.m4:815: -1- AU_DEFUN([AC_LTDL_DLSYM_USCORE], [m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) -m4trace:/usr/local/share/aclocal/ltdl.m4:815: -1- AC_DEFUN([AC_LTDL_DLSYM_USCORE], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_DLSYM_USCORE' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/amversion.m4:20: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' -dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to -dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.14.1], [], - [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/amversion.m4:37: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14.1])dnl -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/auxdir.m4:52: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/cond.m4:32: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl - m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE])dnl -AC_SUBST([$1_FALSE])dnl -_AM_SUBST_NOTMAKE([$1_TRUE])dnl -_AM_SUBST_NOTMAKE([$1_FALSE])dnl -m4_define([_AM_COND_VALUE_$1], [$2])dnl -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/depend.m4:156: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], - [$1], [CXX], [depcc="$CXX" am_compiler_list=], - [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], - [$1], [UPC], [depcc="$UPC" am_compiler_list=], - [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - am__universal=false - m4_case([$1], [CC], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac], - [CXX], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac]) - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/depend.m4:166: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/depend.m4:189: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl -AS_HELP_STRING( - [--enable-dependency-tracking], - [do not reject slow dependency extractors]) -AS_HELP_STRING( - [--disable-dependency-tracking], - [speeds up one-time build])]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH])dnl -_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -AC_SUBST([am__nodep])dnl -_AM_SUBST_NOTMAKE([am__nodep])dnl -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/depout.m4:61: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Older Autoconf quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/init.m4:167: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[AC_DIAGNOSE([obsolete], - [$0: two- and three-arguments forms are deprecated.]) -m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl -dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if( - m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), - [ok:ok],, - [m4_fatal([AC_INIT should be called with package and version arguments])])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) - AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) -AM_MISSING_PROG([AUTOCONF], [autoconf]) -AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) -AM_MISSING_PROG([AUTOHEADER], [autoheader]) -AM_MISSING_PROG([MAKEINFO], [makeinfo]) -AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES([CC])], - [m4_define([AC_PROG_CC], - m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES([CXX])], - [m4_define([AC_PROG_CXX], - m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES([OBJC])], - [m4_define([AC_PROG_OBJC], - m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], - [_AM_DEPENDENCIES([OBJCXX])], - [m4_define([AC_PROG_OBJCXX], - m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl -]) -AC_REQUIRE([AM_SILENT_RULES])dnl -dnl The testsuite driver may need to know about EXEEXT, so add the -dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This -dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. -AC_CONFIG_COMMANDS_PRE(dnl -[m4_provide_if([_AM_COMPILER_EXEEXT], - [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl - -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. - -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . - -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. - -END - AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) - fi -fi]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/init.m4:194: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. -_am_arg=$1 -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/install-sh.m4:21: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi -AC_SUBST([install_sh])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/lead-dot.m4:19: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/make.m4:49: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/missing.m4:38: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([missing])dnl -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " -else - am_missing_run= - AC_MSG_WARN(['missing' script is too old or missing]) -fi -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/options.m4:12: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/options.m4:18: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/options.m4:24: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/options.m4:30: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/prog-cc-c-o.m4:44: -1- AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -AC_LANG_PUSH([C])dnl -AC_CACHE_CHECK( - [whether $CC understands -c and -o together], - [am_cv_prog_cc_c_o], - [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i]) -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -AC_LANG_POP([C])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/prog-cc-c-o.m4:47: -1- AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/python.m4:219: -1- AC_DEFUN([AM_PATH_PYTHON], [ - dnl Find a Python interpreter. Python versions prior to 2.0 are not - dnl supported. (2.0 was released on October 16, 2000). - m4_define_default([_AM_PYTHON_INTERPRETER_LIST], -[python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 dnl - python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0]) - - AC_ARG_VAR([PYTHON], [the Python interpreter]) - - m4_if([$1],[],[ - dnl No version check is needed. - # Find any Python interpreter. - if test -z "$PYTHON"; then - AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) - fi - am_display_PYTHON=python - ], [ - dnl A version check is needed. - if test -n "$PYTHON"; then - # If the user set $PYTHON, use it and don't search something else. - AC_MSG_CHECKING([whether $PYTHON version is >= $1]) - AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], - [AC_MSG_RESULT([yes])], - [AC_MSG_RESULT([no]) - AC_MSG_ERROR([Python interpreter is too old])]) - am_display_PYTHON=$PYTHON - else - # Otherwise, try each interpreter until we find one that satisfies - # VERSION. - AC_CACHE_CHECK([for a Python interpreter with version >= $1], - [am_cv_pathless_PYTHON],[ - for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do - test "$am_cv_pathless_PYTHON" = none && break - AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) - done]) - # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. - if test "$am_cv_pathless_PYTHON" = none; then - PYTHON=: - else - AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) - fi - am_display_PYTHON=$am_cv_pathless_PYTHON - fi - ]) - - if test "$PYTHON" = :; then - dnl Run any user-specified action, or abort. - m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) - else - - dnl Query Python for its version number. Getting [:3] seems to be - dnl the best way to do this; it's what "site.py" does in the standard - dnl library. - - AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], - [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`]) - AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) - - dnl Use the values of $prefix and $exec_prefix for the corresponding - dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made - dnl distinct variables so they can be overridden if need be. However, - dnl general consensus is that you shouldn't need this ability. - - AC_SUBST([PYTHON_PREFIX], ['${prefix}']) - AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) - - dnl At times (like when building shared libraries) you may want - dnl to know which OS platform Python thinks this is. - - AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], - [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) - AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) - - # Just factor out some code duplication. - am_python_setup_sysconfig="\ -import sys -# Prefer sysconfig over distutils.sysconfig, for better compatibility -# with python 3.x. See automake bug#10227. -try: - import sysconfig -except ImportError: - can_use_sysconfig = 0 -else: - can_use_sysconfig = 1 -# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: -# -try: - from platform import python_implementation - if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7': - can_use_sysconfig = 0 -except ImportError: - pass" - - dnl Set up 4 directories: - - dnl pythondir -- where to install python scripts. This is the - dnl site-packages directory, not the python standard library - dnl directory like in previous automake betas. This behavior - dnl is more consistent with lispdir.m4 for example. - dnl Query distutils for this directory. - AC_CACHE_CHECK([for $am_display_PYTHON script directory], - [am_cv_python_pythondir], - [if test "x$prefix" = xNONE - then - am_py_prefix=$ac_default_prefix - else - am_py_prefix=$prefix - fi - am_cv_python_pythondir=`$PYTHON -c " -$am_python_setup_sysconfig -if can_use_sysconfig: - sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) -else: - from distutils import sysconfig - sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') -sys.stdout.write(sitedir)"` - case $am_cv_python_pythondir in - $am_py_prefix*) - am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` - am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` - ;; - *) - case $am_py_prefix in - /usr|/System*) ;; - *) - am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages - ;; - esac - ;; - esac - ]) - AC_SUBST([pythondir], [$am_cv_python_pythondir]) - - dnl pkgpythondir -- $PACKAGE directory under pythondir. Was - dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is - dnl more consistent with the rest of automake. - - AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) - - dnl pyexecdir -- directory for installing python extension modules - dnl (shared libraries) - dnl Query distutils for this directory. - AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], - [am_cv_python_pyexecdir], - [if test "x$exec_prefix" = xNONE - then - am_py_exec_prefix=$am_py_prefix - else - am_py_exec_prefix=$exec_prefix - fi - am_cv_python_pyexecdir=`$PYTHON -c " -$am_python_setup_sysconfig -if can_use_sysconfig: - sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) -else: - from distutils import sysconfig - sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') -sys.stdout.write(sitedir)"` - case $am_cv_python_pyexecdir in - $am_py_exec_prefix*) - am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` - am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` - ;; - *) - case $am_py_exec_prefix in - /usr|/System*) ;; - *) - am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages - ;; - esac - ;; - esac - ]) - AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) - - dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) - - AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) - - dnl Run any user-specified action. - $2 - fi - -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/python.m4:239: -1- AC_DEFUN([AM_PYTHON_CHECK_VERSION], [prog="import sys -# split strings by '.' and convert to numeric. Append some zeros -# because we need at least 4 digits for the hex conversion. -# map returns an iterator in Python 3.0 and a list in 2.x -minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] -minverhex = 0 -# xrange is not present in Python 3.0 and range returns an iterator -for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] -sys.exit(sys.hexversion < minverhex)" - AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/runlog.m4:17: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD - ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - (exit $ac_status); }]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/sanity.m4:82: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[[\\\"\#\$\&\'\`$am_lf]]*) - AC_MSG_ERROR([unsafe absolute working directory name]);; -esac -case $srcdir in - *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; -esac - -# Do 'set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken - alias in your environment]) - fi - if test "$[2]" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT([yes]) -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi -AC_CONFIG_COMMANDS_PRE( - [AC_MSG_CHECKING([that generated files are newer than configure]) - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - AC_MSG_RESULT([done])]) -rm -f conftest.file -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/silent.m4:60: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl -AS_HELP_STRING( - [--enable-silent-rules], - [less verbose build output (undo: "make V=1")]) -AS_HELP_STRING( - [--disable-silent-rules], - [verbose build output (undo: "make V=0")])dnl -]) -case $enable_silent_rules in @%:@ ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; -esac -dnl -dnl A few 'make' implementations (e.g., NonStop OS and NextStep) -dnl do not support nested variable expansions. -dnl See automake bug#9928 and bug#10237. -am_make=${MAKE-make} -AC_CACHE_CHECK([whether $am_make supports nested variables], - [am_cv_make_support_nested_variables], - [if AS_ECHO([['TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi]) -if test $am_cv_make_support_nested_variables = yes; then - dnl Using '$V' instead of '$(V)' breaks IRIX make. - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AC_SUBST([AM_V])dnl -AM_SUBST_NOTMAKE([AM_V])dnl -AC_SUBST([AM_DEFAULT_V])dnl -AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl -AC_SUBST([AM_DEFAULT_VERBOSITY])dnl -AM_BACKSLASH='\' -AC_SUBST([AM_BACKSLASH])dnl -_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl -]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/strip.m4:28: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/substnot.m4:12: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/substnot.m4:17: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) -m4trace:/usr/local/Cellar/automake/1.14.1/share/aclocal-1.14/tar.m4:132: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AC_SUBST([AMTAR], ['$${TAR-tar}']) - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' - -m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - - [m4_case([$1], - [ustar], - [# The POSIX 1988 'ustar' format is defined with fixed-size fields. - # There is notably a 21 bits limit for the UID and the GID. In fact, - # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 - # and bug#13588). - am_max_uid=2097151 # 2^21 - 1 - am_max_gid=$am_max_uid - # The $UID and $GID variables are not portable, so we need to resort - # to the POSIX-mandated id(1) utility. Errors in the 'id' calls - # below are definitely unexpected, so allow the users to see them - # (that is, avoid stderr redirection). - am_uid=`id -u || echo unknown` - am_gid=`id -g || echo unknown` - AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) - if test $am_uid -le $am_max_uid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi - AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) - if test $am_gid -le $am_max_gid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi], - - [pax], - [], - - [m4_fatal([Unknown tar format])]) - - AC_MSG_CHECKING([how to create a $1 tar archive]) - - # Go ahead even if we have the value already cached. We do so because we - # need to set the values for the 'am__tar' and 'am__untar' variables. - _am_tools=${am_cv_prog_tar_$1-$_am_tools} - - for _am_tool in $_am_tools; do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works. - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi - done - rm -rf conftest.dir - - AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) - AC_MSG_RESULT([$am_cv_prog_tar_$1])]) - -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) -m4trace:m4/libtool.m4:104: -1- AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT -AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl -AC_BEFORE([$0], [LT_LANG])dnl -AC_BEFORE([$0], [LT_OUTPUT])dnl -AC_BEFORE([$0], [LTDL_INIT])dnl -m4_require([_LT_CHECK_BUILDDIR])dnl - -dnl Autoconf doesn't catch unexpanded LT_ macros by default: -m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl -m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl -dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 -dnl unless we require an AC_DEFUNed macro: -AC_REQUIRE([LTOPTIONS_VERSION])dnl -AC_REQUIRE([LTSUGAR_VERSION])dnl -AC_REQUIRE([LTVERSION_VERSION])dnl -AC_REQUIRE([LTOBSOLETE_VERSION])dnl -m4_require([_LT_PROG_LTMAIN])dnl - -_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) - -dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -_LT_SETUP - -# Only expand once: -m4_define([LT_INIT]) -]) -m4trace:m4/libtool.m4:107: -1- AU_DEFUN([AC_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:m4/libtool.m4:107: -1- AC_DEFUN([AC_PROG_LIBTOOL], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:m4/libtool.m4:108: -1- AU_DEFUN([AM_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:m4/libtool.m4:108: -1- AC_DEFUN([AM_PROG_LIBTOOL], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_LIBTOOL' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:m4/libtool.m4:694: -1- AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} -AC_MSG_NOTICE([creating $CONFIG_LT]) -_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], -[# Run this file to recreate a libtool stub with the current configuration.]) - -cat >>"$CONFIG_LT" <<\_LTEOF -lt_cl_silent=false -exec AS_MESSAGE_LOG_FD>>config.log -{ - echo - AS_BOX([Running $as_me.]) -} >&AS_MESSAGE_LOG_FD - -lt_cl_help="\ -\`$as_me' creates a local libtool stub from the current configuration, -for use in further configure time tests before the real libtool is -generated. - -Usage: $[0] [[OPTIONS]] - - -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - -Report bugs to ." - -lt_cl_version="\ -m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl -m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) -configured by $[0], generated by m4_PACKAGE_STRING. - -Copyright (C) 2011 Free Software Foundation, Inc. -This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." - -while test $[#] != 0 -do - case $[1] in - --version | --v* | -V ) - echo "$lt_cl_version"; exit 0 ;; - --help | --h* | -h ) - echo "$lt_cl_help"; exit 0 ;; - --debug | --d* | -d ) - debug=: ;; - --quiet | --q* | --silent | --s* | -q ) - lt_cl_silent=: ;; - - -*) AC_MSG_ERROR([unrecognized option: $[1] -Try \`$[0] --help' for more information.]) ;; - - *) AC_MSG_ERROR([unrecognized argument: $[1] -Try \`$[0] --help' for more information.]) ;; - esac - shift -done - -if $lt_cl_silent; then - exec AS_MESSAGE_FD>/dev/null -fi -_LTEOF - -cat >>"$CONFIG_LT" <<_LTEOF -_LT_OUTPUT_LIBTOOL_COMMANDS_INIT -_LTEOF - -cat >>"$CONFIG_LT" <<\_LTEOF -AC_MSG_NOTICE([creating $ofile]) -_LT_OUTPUT_LIBTOOL_COMMANDS -AS_EXIT(0) -_LTEOF -chmod +x "$CONFIG_LT" - -# configure is writing to config.log, but config.lt does its own redirection, -# appending to config.log, which fails on DOS, as config.log is still kept -# open by configure. Here we exec the FD to /dev/null, effectively closing -# config.log, so it can be properly (re)opened and appended to by config.lt. -lt_cl_success=: -test "$silent" = yes && - lt_config_lt_args="$lt_config_lt_args --quiet" -exec AS_MESSAGE_LOG_FD>/dev/null -$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false -exec AS_MESSAGE_LOG_FD>>config.log -$lt_cl_success || AS_EXIT(1) -]) -m4trace:m4/libtool.m4:790: -1- AC_DEFUN([LT_SUPPORTED_TAG], []) -m4trace:m4/libtool.m4:814: -1- AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl -m4_case([$1], - [C], [_LT_LANG(C)], - [C++], [_LT_LANG(CXX)], - [Go], [_LT_LANG(GO)], - [Java], [_LT_LANG(GCJ)], - [Fortran 77], [_LT_LANG(F77)], - [Fortran], [_LT_LANG(FC)], - [Windows Resource], [_LT_LANG(RC)], - [m4_ifdef([_LT_LANG_]$1[_CONFIG], - [_LT_LANG($1)], - [m4_fatal([$0: unsupported language: "$1"])])])dnl -]) -m4trace:m4/libtool.m4:893: -1- AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) -m4trace:m4/libtool.m4:893: -1- AC_DEFUN([AC_LIBTOOL_CXX], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_CXX' is obsolete. -You should run autoupdate.])dnl -LT_LANG(C++)]) -m4trace:m4/libtool.m4:894: -1- AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) -m4trace:m4/libtool.m4:894: -1- AC_DEFUN([AC_LIBTOOL_F77], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_F77' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Fortran 77)]) -m4trace:m4/libtool.m4:895: -1- AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) -m4trace:m4/libtool.m4:895: -1- AC_DEFUN([AC_LIBTOOL_FC], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_FC' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Fortran)]) -m4trace:m4/libtool.m4:896: -1- AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) -m4trace:m4/libtool.m4:896: -1- AC_DEFUN([AC_LIBTOOL_GCJ], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_GCJ' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Java)]) -m4trace:m4/libtool.m4:897: -1- AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) -m4trace:m4/libtool.m4:897: -1- AC_DEFUN([AC_LIBTOOL_RC], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_RC' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Windows Resource)]) -m4trace:m4/libtool.m4:1254: -1- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) -AC_ARG_WITH([sysroot], -[ --with-sysroot[=DIR] Search for dependent libraries within DIR - (or the compiler's sysroot if not specified).], -[], [with_sysroot=no]) - -dnl lt_sysroot will always be passed unquoted. We quote it here -dnl in case the user passed a directory name. -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - AC_MSG_RESULT([${with_sysroot}]) - AC_MSG_ERROR([The sysroot must be an absolute path.]) - ;; -esac - - AC_MSG_RESULT([${lt_sysroot:-no}]) -_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl -[dependent libraries, and in which our libraries should be installed.])]) -m4trace:m4/libtool.m4:1541: -1- AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - fi - $RM conftest* -]) - -if test x"[$]$2" = xyes; then - m4_if([$5], , :, [$5]) -else - m4_if([$6], , :, [$6]) -fi -]) -m4trace:m4/libtool.m4:1544: -1- AU_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) -m4trace:m4/libtool.m4:1544: -1- AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_COMPILER_OPTION' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) -m4trace:m4/libtool.m4:1585: -1- AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $3" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&AS_MESSAGE_LOG_FD - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - else - $2=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" -]) - -if test x"[$]$2" = xyes; then - m4_if([$4], , :, [$4]) -else - m4_if([$5], , :, [$5]) -fi -]) -m4trace:m4/libtool.m4:1588: -1- AU_DEFUN([AC_LIBTOOL_LINKER_OPTION], [m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) -m4trace:m4/libtool.m4:1588: -1- AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_LINKER_OPTION' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) -m4trace:m4/libtool.m4:1730: -1- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -# find the maximum length of command line arguments -AC_MSG_CHECKING([the maximum length of command line arguments]) -AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac -]) -if test -n $lt_cv_sys_max_cmd_len ; then - AC_MSG_RESULT($lt_cv_sys_max_cmd_len) -else - AC_MSG_RESULT(none) -fi -max_cmd_len=$lt_cv_sys_max_cmd_len -_LT_DECL([], [max_cmd_len], [0], - [What is the maximum length of a command?]) -]) -m4trace:m4/libtool.m4:1733: -1- AU_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) -m4trace:m4/libtool.m4:1733: -1- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_SYS_MAX_CMD_LEN' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) -m4trace:m4/libtool.m4:1958: -1- AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ]) - ;; - - *) - AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen="shl_load"], - [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], - [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen="dlopen"], - [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], - [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], - [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) - ]) - ]) - ]) - ]) - ]) - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - AC_CACHE_CHECK([whether a program can dlopen itself], - lt_cv_dlopen_self, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, - lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) - ]) - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, - lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) - ]) - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi -_LT_DECL([dlopen_support], [enable_dlopen], [0], - [Whether dlopen is supported]) -_LT_DECL([dlopen_self], [enable_dlopen_self], [0], - [Whether dlopen of programs is supported]) -_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], - [Whether dlopen of statically linked programs is supported]) -]) -m4trace:m4/libtool.m4:1961: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) -m4trace:m4/libtool.m4:1961: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN_SELF' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) -m4trace:m4/libtool.m4:2989: -1- AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl -AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, -[case $MAGIC_CMD in -[[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="m4_if([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - AC_MSG_RESULT($MAGIC_CMD) -else - AC_MSG_RESULT(no) -fi -_LT_DECL([], [MAGIC_CMD], [0], - [Used to examine libraries when file_magic_cmd begins with "file"])dnl -]) -m4trace:m4/libtool.m4:2992: -1- AU_DEFUN([AC_PATH_TOOL_PREFIX], [m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) -m4trace:m4/libtool.m4:2992: -1- AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_DIAGNOSE([obsolete], [The macro `AC_PATH_TOOL_PREFIX' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) -m4trace:m4/libtool.m4:3101: -1- AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PROG_ECHO_BACKSLASH])dnl - -AC_ARG_WITH([gnu-ld], - [AS_HELP_STRING([--with-gnu-ld], - [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], - [with_gnu_ld=no])dnl - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by $CC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]]* | ?:[[\\/]]*) - re_direlt='/[[^/]][[^/]]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(lt_cv_path_LD, -[if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi]) -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - AC_SUBST([DUMPBIN]) - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm -AC_SUBST([NM]) -_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl - -AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], - [lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) - cat conftest.out >&AS_MESSAGE_LOG_FD - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest*]) -]) -m4trace:m4/libtool.m4:3489: -1- AU_DEFUN([AM_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:m4/libtool.m4:3489: -1- AC_DEFUN([AM_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_NM' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:m4/libtool.m4:3490: -1- AU_DEFUN([AC_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:m4/libtool.m4:3490: -1- AC_DEFUN([AC_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_NM' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:m4/libtool.m4:3576: -1- AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) - # These system don't have libm, or don't need it - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, cos, LIBM="-lm") - ;; -esac -AC_SUBST([LIBM]) -]) -m4trace:m4/libtool.m4:3579: -1- AU_DEFUN([AC_CHECK_LIBM], [m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) -m4trace:m4/libtool.m4:3579: -1- AC_DEFUN([AC_CHECK_LIBM], [AC_DIAGNOSE([obsolete], [The macro `AC_CHECK_LIBM' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) -m4trace:m4/libtool.m4:7628: -1- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], - [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], - [AC_CHECK_TOOL(GCJ, gcj,) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS)])])[]dnl -]) -m4trace:m4/libtool.m4:7631: -1- AU_DEFUN([LT_AC_PROG_GCJ], [m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) -m4trace:m4/libtool.m4:7631: -1- AC_DEFUN([LT_AC_PROG_GCJ], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_GCJ' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) -m4trace:m4/libtool.m4:7640: -1- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) -]) -m4trace:m4/libtool.m4:7647: -1- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) -]) -m4trace:m4/libtool.m4:7650: -1- AU_DEFUN([LT_AC_PROG_RC], [m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) -m4trace:m4/libtool.m4:7650: -1- AC_DEFUN([LT_AC_PROG_RC], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_RC' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) -m4trace:m4/libtool.m4:7770: -1- AU_DEFUN([LT_AC_PROG_SED], [m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) -m4trace:m4/libtool.m4:7770: -1- AC_DEFUN([LT_AC_PROG_SED], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_SED' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) -m4trace:m4/ltoptions.m4:14: -1- AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) -m4trace:m4/ltoptions.m4:116: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:116: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:152: -1- AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:152: -1- AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete. -You should run autoupdate.])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:197: -1- AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) -]) -m4trace:m4/ltoptions.m4:201: -1- AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) -]) -m4trace:m4/ltoptions.m4:203: -1- AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -m4trace:m4/ltoptions.m4:203: -1- AC_DEFUN([AM_ENABLE_SHARED], [AC_DIAGNOSE([obsolete], [The macro `AM_ENABLE_SHARED' is obsolete. -You should run autoupdate.])dnl -AC_ENABLE_SHARED($@)]) -m4trace:m4/ltoptions.m4:204: -1- AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) -m4trace:m4/ltoptions.m4:204: -1- AC_DEFUN([AM_DISABLE_SHARED], [AC_DIAGNOSE([obsolete], [The macro `AM_DISABLE_SHARED' is obsolete. -You should run autoupdate.])dnl -AC_DISABLE_SHARED($@)]) -m4trace:m4/ltoptions.m4:251: -1- AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) -]) -m4trace:m4/ltoptions.m4:255: -1- AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) -]) -m4trace:m4/ltoptions.m4:257: -1- AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -m4trace:m4/ltoptions.m4:257: -1- AC_DEFUN([AM_ENABLE_STATIC], [AC_DIAGNOSE([obsolete], [The macro `AM_ENABLE_STATIC' is obsolete. -You should run autoupdate.])dnl -AC_ENABLE_STATIC($@)]) -m4trace:m4/ltoptions.m4:258: -1- AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) -m4trace:m4/ltoptions.m4:258: -1- AC_DEFUN([AM_DISABLE_STATIC], [AC_DIAGNOSE([obsolete], [The macro `AM_DISABLE_STATIC' is obsolete. -You should run autoupdate.])dnl -AC_DISABLE_STATIC($@)]) -m4trace:m4/ltoptions.m4:308: -1- AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:308: -1- AC_DEFUN([AC_ENABLE_FAST_INSTALL], [AC_DIAGNOSE([obsolete], [The macro `AC_ENABLE_FAST_INSTALL' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:315: -1- AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:315: -1- AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_DIAGNOSE([obsolete], [The macro `AC_DISABLE_FAST_INSTALL' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:363: -1- AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltoptions.m4:363: -1- AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_PICMODE' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) -m4trace:m4/ltsugar.m4:13: -1- AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) -m4trace:m4/ltversion.m4:23: -1- AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' -macro_revision='1.3337' -_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) -_LT_DECL(, macro_revision, 0) -]) -m4trace:m4/lt~obsolete.m4:36: -1- AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) -m4trace:m4/lt~obsolete.m4:40: -1- AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH]) -m4trace:m4/lt~obsolete.m4:41: -1- AC_DEFUN([_LT_AC_SHELL_INIT]) -m4trace:m4/lt~obsolete.m4:42: -1- AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX]) -m4trace:m4/lt~obsolete.m4:44: -1- AC_DEFUN([_LT_AC_TAGVAR]) -m4trace:m4/lt~obsolete.m4:45: -1- AC_DEFUN([AC_LTDL_ENABLE_INSTALL]) -m4trace:m4/lt~obsolete.m4:46: -1- AC_DEFUN([AC_LTDL_PREOPEN]) -m4trace:m4/lt~obsolete.m4:47: -1- AC_DEFUN([_LT_AC_SYS_COMPILER]) -m4trace:m4/lt~obsolete.m4:48: -1- AC_DEFUN([_LT_AC_LOCK]) -m4trace:m4/lt~obsolete.m4:49: -1- AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE]) -m4trace:m4/lt~obsolete.m4:50: -1- AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF]) -m4trace:m4/lt~obsolete.m4:51: -1- AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O]) -m4trace:m4/lt~obsolete.m4:52: -1- AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS]) -m4trace:m4/lt~obsolete.m4:53: -1- AC_DEFUN([AC_LIBTOOL_OBJDIR]) -m4trace:m4/lt~obsolete.m4:54: -1- AC_DEFUN([AC_LTDL_OBJDIR]) -m4trace:m4/lt~obsolete.m4:55: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH]) -m4trace:m4/lt~obsolete.m4:56: -1- AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP]) -m4trace:m4/lt~obsolete.m4:57: -1- AC_DEFUN([AC_PATH_MAGIC]) -m4trace:m4/lt~obsolete.m4:58: -1- AC_DEFUN([AC_PROG_LD_GNU]) -m4trace:m4/lt~obsolete.m4:59: -1- AC_DEFUN([AC_PROG_LD_RELOAD_FLAG]) -m4trace:m4/lt~obsolete.m4:60: -1- AC_DEFUN([AC_DEPLIBS_CHECK_METHOD]) -m4trace:m4/lt~obsolete.m4:61: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI]) -m4trace:m4/lt~obsolete.m4:62: -1- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE]) -m4trace:m4/lt~obsolete.m4:63: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC]) -m4trace:m4/lt~obsolete.m4:64: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS]) -m4trace:m4/lt~obsolete.m4:65: -1- AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP]) -m4trace:m4/lt~obsolete.m4:66: -1- AC_DEFUN([LT_AC_PROG_EGREP]) -m4trace:m4/lt~obsolete.m4:71: -1- AC_DEFUN([_AC_PROG_LIBTOOL]) -m4trace:m4/lt~obsolete.m4:72: -1- AC_DEFUN([AC_LIBTOOL_SETUP]) -m4trace:m4/lt~obsolete.m4:73: -1- AC_DEFUN([_LT_AC_CHECK_DLFCN]) -m4trace:m4/lt~obsolete.m4:74: -1- AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER]) -m4trace:m4/lt~obsolete.m4:75: -1- AC_DEFUN([_LT_AC_TAGCONFIG]) -m4trace:m4/lt~obsolete.m4:77: -1- AC_DEFUN([_LT_AC_LANG_CXX]) -m4trace:m4/lt~obsolete.m4:78: -1- AC_DEFUN([_LT_AC_LANG_F77]) -m4trace:m4/lt~obsolete.m4:79: -1- AC_DEFUN([_LT_AC_LANG_GCJ]) -m4trace:m4/lt~obsolete.m4:80: -1- AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG]) -m4trace:m4/lt~obsolete.m4:81: -1- AC_DEFUN([_LT_AC_LANG_C_CONFIG]) -m4trace:m4/lt~obsolete.m4:82: -1- AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG]) -m4trace:m4/lt~obsolete.m4:83: -1- AC_DEFUN([_LT_AC_LANG_CXX_CONFIG]) -m4trace:m4/lt~obsolete.m4:84: -1- AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG]) -m4trace:m4/lt~obsolete.m4:85: -1- AC_DEFUN([_LT_AC_LANG_F77_CONFIG]) -m4trace:m4/lt~obsolete.m4:86: -1- AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG]) -m4trace:m4/lt~obsolete.m4:87: -1- AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG]) -m4trace:m4/lt~obsolete.m4:88: -1- AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG]) -m4trace:m4/lt~obsolete.m4:89: -1- AC_DEFUN([_LT_AC_LANG_RC_CONFIG]) -m4trace:m4/lt~obsolete.m4:90: -1- AC_DEFUN([AC_LIBTOOL_CONFIG]) -m4trace:m4/lt~obsolete.m4:91: -1- AC_DEFUN([_LT_AC_FILE_LTDLL_C]) -m4trace:m4/lt~obsolete.m4:93: -1- AC_DEFUN([_LT_AC_PROG_CXXCPP]) -m4trace:m4/lt~obsolete.m4:96: -1- AC_DEFUN([_LT_PROG_F77]) -m4trace:m4/lt~obsolete.m4:97: -1- AC_DEFUN([_LT_PROG_FC]) -m4trace:m4/lt~obsolete.m4:98: -1- AC_DEFUN([_LT_PROG_CXX]) -m4trace:configure.ac:1: -1- m4_include([m4/acx_pthread.m4]) -m4trace:m4/acx_pthread.m4:363: -1- AC_DEFUN([ACX_PTHREAD], [ -AC_REQUIRE([AC_CANONICAL_HOST]) -AC_LANG_SAVE -AC_LANG_C -acx_pthread_ok=no - -# We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on True64 or Sequent). -# It gets checked for in the link test anyway. - -# First of all, check if the user has set any of the PTHREAD_LIBS, -# etcetera environment variables, and if threads linking works using -# them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) - AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) - AC_MSG_RESULT($acx_pthread_ok) - if test x"$acx_pthread_ok" = xno; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" - fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" -fi - -# We must check for the threads library under a number of different -# names; the ordering is very important because some systems -# (e.g. DEC) have both -lpthread and -lpthreads, where one of the -# libraries is broken (non-POSIX). - -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all, and "pthread-config" -# which is a program returning the flags for the Pth emulation library. - -acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" - -# The ordering *is* (sometimes) important. Some notes on the -# individual items follow: - -# pthreads: AIX (must check this before -lpthread) -# none: in case threads are in libc; should be tried before -Kthread and -# other compiler flags to prevent continual compiler warnings -# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc -# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# ... -mt is also the pthreads flag for HP/aCC -# pthread: Linux, etcetera -# --thread-safe: KAI C++ -# pthread-config: use pthread-config program (for GNU Pth library) - -case "${host_cpu}-${host_os}" in - *solaris*) - - # On Solaris (at least, for some versions), libc contains stubbed - # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (We need to link with -pthreads/-mt/ - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather - # a function called by this macro, so we could check for that, but - # who knows whether they'll stub that too in a future libc.) So, - # we'll just look for -pthreads and -lpthread first: - - acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" - ;; -esac - -if test x"$acx_pthread_ok" = xno; then -for flag in $acx_pthread_flags; do - - case $flag in - none) - AC_MSG_CHECKING([whether pthreads work without any flags]) - ;; - - -*) - AC_MSG_CHECKING([whether pthreads work with $flag]) - PTHREAD_CFLAGS="$flag" - ;; - - pthread-config) - AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) - if test x"$acx_pthread_config" = xno; then continue; fi - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; - - *) - AC_MSG_CHECKING([for the pthreads library -l$flag]) - PTHREAD_LIBS="-l$flag" - ;; - esac - - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. - AC_TRY_LINK([#include ], - [pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], - [acx_pthread_ok=yes]) - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - - AC_MSG_RESULT($acx_pthread_ok) - if test "x$acx_pthread_ok" = xyes; then - break; - fi - - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" -done -fi - -# Various other checks: -if test "x$acx_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - AC_MSG_CHECKING([for joinable pthread attribute]) - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - AC_TRY_LINK([#include ], [int attr=$attr; return attr;], - [attr_name=$attr; break]) - done - AC_MSG_RESULT($attr_name) - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then - AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, - [Define to necessary symbol if this constant - uses a non-standard name on your system.]) - fi - - AC_MSG_CHECKING([if more special flags are required for pthreads]) - flag=no - case "${host_cpu}-${host_os}" in - *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; - *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; - esac - AC_MSG_RESULT(${flag}) - if test "x$flag" != xno; then - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" - fi - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - # More AIX lossage: must compile with xlc_r or cc_r - if test x"$GCC" != xyes; then - AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) - else - PTHREAD_CC=$CC - fi - - # The next part tries to detect GCC inconsistency with -shared on some - # architectures and systems. The problem is that in certain - # configurations, when -shared is specified, GCC "forgets" to - # internally use various flags which are still necessary. - - # - # Prepare the flags - # - save_CFLAGS="$CFLAGS" - save_LIBS="$LIBS" - save_CC="$CC" - - # Try with the flags determined by the earlier checks. - # - # -Wl,-z,defs forces link-time symbol resolution, so that the - # linking checks with -shared actually have any value - # - # FIXME: -fPIC is required for -shared on many architectures, - # so we specify it here, but the right way would probably be to - # properly detect whether it is actually required. - CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CC="$PTHREAD_CC" - - # In order not to create several levels of indentation, we test - # the value of "$done" until we find the cure or run out of ideas. - done="no" - - # First, make sure the CFLAGS we added are actually accepted by our - # compiler. If not (and OS X's ld, for instance, does not accept -z), - # then we can't do this test. - if test x"$done" = xno; then - AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies]) - AC_TRY_LINK(,, , [done=yes]) - - if test "x$done" = xyes ; then - AC_MSG_RESULT([no]) - else - AC_MSG_RESULT([yes]) - fi - fi - - if test x"$done" = xno; then - AC_MSG_CHECKING([whether -pthread is sufficient with -shared]) - AC_TRY_LINK([#include ], - [pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], - [done=yes]) - - if test "x$done" = xyes; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi - fi - - # - # Linux gcc on some architectures such as mips/mipsel forgets - # about -lpthread - # - if test x"$done" = xno; then - AC_MSG_CHECKING([whether -lpthread fixes that]) - LIBS="-lpthread $PTHREAD_LIBS $save_LIBS" - AC_TRY_LINK([#include ], - [pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], - [done=yes]) - - if test "x$done" = xyes; then - AC_MSG_RESULT([yes]) - PTHREAD_LIBS="-lpthread $PTHREAD_LIBS" - else - AC_MSG_RESULT([no]) - fi - fi - # - # FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc - # - if test x"$done" = xno; then - AC_MSG_CHECKING([whether -lc_r fixes that]) - LIBS="-lc_r $PTHREAD_LIBS $save_LIBS" - AC_TRY_LINK([#include ], - [pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], - [done=yes]) - - if test "x$done" = xyes; then - AC_MSG_RESULT([yes]) - PTHREAD_LIBS="-lc_r $PTHREAD_LIBS" - else - AC_MSG_RESULT([no]) - fi - fi - if test x"$done" = xno; then - # OK, we have run out of ideas - AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries]) - - # so it's not safe to assume that we may use pthreads - acx_pthread_ok=no - fi - - CFLAGS="$save_CFLAGS" - LIBS="$save_LIBS" - CC="$save_CC" -else - PTHREAD_CC="$CC" -fi - -AC_SUBST(PTHREAD_LIBS) -AC_SUBST(PTHREAD_CFLAGS) -AC_SUBST(PTHREAD_CC) - -# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$acx_pthread_ok" = xyes; then - ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) - : -else - acx_pthread_ok=no - $2 -fi -AC_LANG_RESTORE -]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^_?A[CHUM]_]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([_AC_]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) -m4trace:configure.ac:10: -1- m4_pattern_allow([^AS_FLAGS$]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^_?m4_]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^dnl$]) -m4trace:configure.ac:10: -1- m4_pattern_forbid([^_?AS_]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^SHELL$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PATH_SEPARATOR$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_NAME$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_VERSION$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_STRING$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_URL$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^exec_prefix$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^prefix$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^program_transform_name$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^bindir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^sbindir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^libexecdir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^datarootdir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^datadir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^sysconfdir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^sharedstatedir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^localstatedir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^includedir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^oldincludedir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^docdir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^infodir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^htmldir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^dvidir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^pdfdir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^psdir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^libdir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^localedir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^mandir$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_NAME$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_VERSION$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_STRING$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^PACKAGE_URL$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^DEFS$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^ECHO_C$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^ECHO_N$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^ECHO_T$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^build_alias$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^host_alias$]) -m4trace:configure.ac:10: -1- m4_pattern_allow([^target_alias$]) -m4trace:configure.ac:15: -1- AC_CONFIG_MACRO_DIR([m4]) -m4trace:configure.ac:24: -1- AM_INIT_AUTOMAKE([1.9 dist-bzip2 dist-zip foreign subdir-objects]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) -m4trace:configure.ac:24: -1- AM_SET_CURRENT_AUTOMAKE_VERSION -m4trace:configure.ac:24: -1- AM_AUTOMAKE_VERSION([1.14.1]) -m4trace:configure.ac:24: -1- _AM_AUTOCONF_VERSION([2.69]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^INSTALL_DATA$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^am__isrc$]) -m4trace:configure.ac:24: -1- _AM_SUBST_NOTMAKE([am__isrc]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^CYGPATH_W$]) -m4trace:configure.ac:24: -1- _AM_SET_OPTIONS([1.9 dist-bzip2 dist-zip foreign subdir-objects]) -m4trace:configure.ac:24: -1- _AM_SET_OPTION([1.9]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([1.9]) -m4trace:configure.ac:24: -1- _AM_SET_OPTION([dist-bzip2]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([dist-bzip2]) -m4trace:configure.ac:24: -1- _AM_SET_OPTION([dist-zip]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([dist-zip]) -m4trace:configure.ac:24: -1- _AM_SET_OPTION([foreign]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([foreign]) -m4trace:configure.ac:24: -1- _AM_SET_OPTION([subdir-objects]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([subdir-objects]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^PACKAGE$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^VERSION$]) -m4trace:configure.ac:24: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) - AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([no-define]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^PACKAGE$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^VERSION$]) -m4trace:configure.ac:24: -1- AM_SANITY_CHECK -m4trace:configure.ac:24: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) -m4trace:configure.ac:24: -1- AM_MISSING_HAS_RUN -m4trace:configure.ac:24: -1- AM_AUX_DIR_EXPAND -m4trace:configure.ac:24: -1- m4_pattern_allow([^ACLOCAL$]) -m4trace:configure.ac:24: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AUTOCONF$]) -m4trace:configure.ac:24: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AUTOMAKE$]) -m4trace:configure.ac:24: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AUTOHEADER$]) -m4trace:configure.ac:24: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^MAKEINFO$]) -m4trace:configure.ac:24: -1- AM_PROG_INSTALL_SH -m4trace:configure.ac:24: -1- m4_pattern_allow([^install_sh$]) -m4trace:configure.ac:24: -1- AM_PROG_INSTALL_STRIP -m4trace:configure.ac:24: -1- m4_pattern_allow([^STRIP$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^MKDIR_P$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^mkdir_p$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AWK$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^SET_MAKE$]) -m4trace:configure.ac:24: -1- AM_SET_LEADING_DOT -m4trace:configure.ac:24: -1- m4_pattern_allow([^am__leading_dot$]) -m4trace:configure.ac:24: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([tar-ustar]) -m4trace:configure.ac:24: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([tar-pax]) -m4trace:configure.ac:24: -1- _AM_PROG_TAR([v7]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AMTAR$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^am__tar$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^am__untar$]) -m4trace:configure.ac:24: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES([CC])], - [m4_define([AC_PROG_CC], - m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES([CXX])], - [m4_define([AC_PROG_CXX], - m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES([OBJC])], - [m4_define([AC_PROG_OBJC], - m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], - [_AM_DEPENDENCIES([OBJCXX])], - [m4_define([AC_PROG_OBJCXX], - m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl -]) -m4trace:configure.ac:24: -2- _AM_MANGLE_OPTION([no-dependencies]) -m4trace:configure.ac:24: -1- AM_SILENT_RULES -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_V$]) -m4trace:configure.ac:24: -1- AM_SUBST_NOTMAKE([AM_V]) -m4trace:configure.ac:24: -1- _AM_SUBST_NOTMAKE([AM_V]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_DEFAULT_V$]) -m4trace:configure.ac:24: -1- AM_SUBST_NOTMAKE([AM_DEFAULT_V]) -m4trace:configure.ac:24: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) -m4trace:configure.ac:24: -1- m4_pattern_allow([^AM_BACKSLASH$]) -m4trace:configure.ac:24: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CFLAGS$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^LDFLAGS$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^ac_ct_CC$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^EXEEXT$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^OBJEXT$]) -m4trace:configure.ac:27: -1- _AM_PROG_CC_C_O -m4trace:configure.ac:27: -1- AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) -m4trace:configure.ac:27: -1- _AM_DEPENDENCIES([CC]) -m4trace:configure.ac:27: -1- AM_SET_DEPDIR -m4trace:configure.ac:27: -1- m4_pattern_allow([^DEPDIR$]) -m4trace:configure.ac:27: -1- AM_OUTPUT_DEPENDENCY_COMMANDS -m4trace:configure.ac:27: -1- AM_MAKE_INCLUDE -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__include$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__quote$]) -m4trace:configure.ac:27: -1- AM_DEP_TRACK -m4trace:configure.ac:27: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^AMDEP_TRUE$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^AMDEP_FALSE$]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__nodep$]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([am__nodep]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^CCDEPMODE$]) -m4trace:configure.ac:27: -1- AM_CONDITIONAL([am__fastdepCC], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) -m4trace:configure.ac:27: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) -m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CXX$]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CXXFLAGS$]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^LDFLAGS$]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CXX$]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^ac_ct_CXX$]) -m4trace:configure.ac:28: -1- _AM_DEPENDENCIES([CXX]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^CXXDEPMODE$]) -m4trace:configure.ac:28: -1- AM_CONDITIONAL([am__fastdepCXX], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) -m4trace:configure.ac:28: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) -m4trace:configure.ac:28: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) -m4trace:configure.ac:28: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) -m4trace:configure.ac:30: -1- AC_PROG_LIBTOOL -m4trace:configure.ac:30: -1- _m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. -You should run autoupdate.], [m4/libtool.m4:107: AC_PROG_LIBTOOL is expanded from... -configure.ac:30: the top level]) -m4trace:configure.ac:30: -1- LT_INIT -m4trace:configure.ac:30: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$]) -m4trace:configure.ac:30: -1- LTOPTIONS_VERSION -m4trace:configure.ac:30: -1- LTSUGAR_VERSION -m4trace:configure.ac:30: -1- LTVERSION_VERSION -m4trace:configure.ac:30: -1- LTOBSOLETE_VERSION -m4trace:configure.ac:30: -1- _LT_PROG_LTMAIN -m4trace:configure.ac:30: -1- m4_pattern_allow([^LIBTOOL$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^build$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^build_cpu$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^build_vendor$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^build_os$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^host$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^host_cpu$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^host_vendor$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^host_os$]) -m4trace:configure.ac:30: -1- _LT_PREPARE_SED_QUOTE_VARS -m4trace:configure.ac:30: -1- _LT_PROG_ECHO_BACKSLASH -m4trace:configure.ac:30: -1- LT_PATH_LD -m4trace:configure.ac:30: -1- m4_pattern_allow([^SED$]) -m4trace:configure.ac:30: -1- AC_PROG_EGREP -m4trace:configure.ac:30: -1- m4_pattern_allow([^GREP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^EGREP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^FGREP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^GREP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^LD$]) -m4trace:configure.ac:30: -1- LT_PATH_NM -m4trace:configure.ac:30: -1- m4_pattern_allow([^DUMPBIN$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^DUMPBIN$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^NM$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^LN_S$]) -m4trace:configure.ac:30: -1- LT_CMD_MAX_LEN -m4trace:configure.ac:30: -1- m4_pattern_allow([^OBJDUMP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^OBJDUMP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^DLLTOOL$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^DLLTOOL$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^AR$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^ac_ct_AR$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^STRIP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^RANLIB$]) -m4trace:configure.ac:30: -1- _LT_WITH_SYSROOT -m4trace:configure.ac:30: -1- m4_pattern_allow([LT_OBJDIR]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^LT_OBJDIR$]) -m4trace:configure.ac:30: -1- _LT_CC_BASENAME([$compiler]) -m4trace:configure.ac:30: -1- _LT_PATH_TOOL_PREFIX([${ac_tool_prefix}file], [/usr/bin$PATH_SEPARATOR$PATH]) -m4trace:configure.ac:30: -1- _LT_PATH_TOOL_PREFIX([file], [/usr/bin$PATH_SEPARATOR$PATH]) -m4trace:configure.ac:30: -1- LT_SUPPORTED_TAG([CC]) -m4trace:configure.ac:30: -1- _LT_COMPILER_BOILERPLATE -m4trace:configure.ac:30: -1- _LT_LINKER_BOILERPLATE -m4trace:configure.ac:30: -1- _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], [lt_cv_prog_compiler_rtti_exceptions], [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, )="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, ) -fno-rtti -fno-exceptions"]) -m4trace:configure.ac:30: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, ) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, )], [$_LT_TAGVAR(lt_prog_compiler_pic, )@&t@m4_if([],[],[ -DPIC],[m4_if([],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, ) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, )=" $_LT_TAGVAR(lt_prog_compiler_pic, )" ;; - esac], [_LT_TAGVAR(lt_prog_compiler_pic, )= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, )=no]) -m4trace:configure.ac:30: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, )=]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^MANIFEST_TOOL$]) -m4trace:configure.ac:30: -1- _LT_REQUIRED_DARWIN_CHECKS -m4trace:configure.ac:30: -1- m4_pattern_allow([^DSYMUTIL$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^NMEDIT$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^LIPO$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^OTOOL$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^OTOOL64$]) -m4trace:configure.ac:30: -1- _LT_LINKER_OPTION([if $CC understands -b], [lt_cv_prog_compiler__b], [-b], [_LT_TAGVAR(archive_cmds, )='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, )='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags']) -m4trace:configure.ac:30: -1- LT_SYS_DLOPEN_SELF -m4trace:configure.ac:30: -1- m4_pattern_allow([^CPP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CPP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^STDC_HEADERS$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) -m4trace:configure.ac:30: -1- LT_LANG([CXX]) -m4trace:configure.ac:30: -1- LT_SUPPORTED_TAG([CXX]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CXXCPP$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:30: -1- m4_pattern_allow([^CXXCPP$]) -m4trace:configure.ac:30: -1- _LT_COMPILER_BOILERPLATE -m4trace:configure.ac:30: -1- _LT_LINKER_BOILERPLATE -m4trace:configure.ac:30: -1- _LT_CC_BASENAME([$compiler]) -m4trace:configure.ac:30: -1- LT_PATH_LD -m4trace:configure.ac:30: -1- m4_pattern_allow([^LD$]) -m4trace:configure.ac:30: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, CXX) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, CXX)], [$_LT_TAGVAR(lt_prog_compiler_pic, CXX)@&t@m4_if([CXX],[],[ -DPIC],[m4_if([CXX],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, CXX) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, CXX)=" $_LT_TAGVAR(lt_prog_compiler_pic, CXX)" ;; - esac], [_LT_TAGVAR(lt_prog_compiler_pic, CXX)= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, CXX)=no]) -m4trace:configure.ac:30: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works_CXX], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, CXX)=]) -m4trace:configure.ac:38: -1- m4_pattern_allow([^PYTHON$]) -m4trace:configure.ac:40: -1- AM_PYTHON_CHECK_VERSION([$PYTHON], [2.3], [:], [PYTHON=":"]) -m4trace:configure.ac:40: -1- AM_RUN_LOG([$PYTHON -c "$prog"]) -m4trace:configure.ac:41: -1- AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != ":"]) -m4trace:configure.ac:41: -1- m4_pattern_allow([^HAVE_PYTHON_TRUE$]) -m4trace:configure.ac:41: -1- m4_pattern_allow([^HAVE_PYTHON_FALSE$]) -m4trace:configure.ac:41: -1- _AM_SUBST_NOTMAKE([HAVE_PYTHON_TRUE]) -m4trace:configure.ac:41: -1- _AM_SUBST_NOTMAKE([HAVE_PYTHON_FALSE]) -m4trace:configure.ac:57: -1- ACX_PTHREAD([], [AS_IF([test "x$with_pthreads" != "xcheck"], - [AC_MSG_FAILURE( - [--with-pthreads was specified, but unable to be used])])]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_LANG_SAVE' is obsolete. -You should run autoupdate.], [../../lib/autoconf/lang.m4:128: AC_LANG_SAVE is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_LANG_C' is obsolete. -You should run autoupdate.], [../../lib/autoconf/c.m4:72: AC_LANG_C is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^acx_pthread_config$]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_CREATE_JOINABLE$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_CC$]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_LIBS$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_CFLAGS$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^PTHREAD_CC$]) -m4trace:configure.ac:57: -2- m4_pattern_allow([^HAVE_PTHREAD$]) -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_LANG_RESTORE' is obsolete. -You should run autoupdate.], [../../lib/autoconf/lang.m4:134: AC_LANG_RESTORE is expanded from... -m4/acx_pthread.m4:363: ACX_PTHREAD is expanded from... -../../lib/m4sugar/m4sh.m4:643: AS_IF is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:58: -1- AM_CONDITIONAL([HAVE_PTHREADS], [test "x$have_pthreads" == "xyes"]) -m4trace:configure.ac:58: -1- m4_pattern_allow([^HAVE_PTHREADS_TRUE$]) -m4trace:configure.ac:58: -1- m4_pattern_allow([^HAVE_PTHREADS_FALSE$]) -m4trace:configure.ac:58: -1- _AM_SUBST_NOTMAKE([HAVE_PTHREADS_TRUE]) -m4trace:configure.ac:58: -1- _AM_SUBST_NOTMAKE([HAVE_PTHREADS_FALSE]) -m4trace:configure.ac:59: -1- m4_pattern_allow([^PTHREAD_CFLAGS$]) -m4trace:configure.ac:60: -1- m4_pattern_allow([^PTHREAD_LIBS$]) -m4trace:configure.ac:68: -1- m4_pattern_allow([^LIB@&t@OBJS$]) -m4trace:configure.ac:68: -1- m4_pattern_allow([^LTLIBOBJS$]) -m4trace:configure.ac:68: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) -m4trace:configure.ac:68: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) -m4trace:configure.ac:68: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) -m4trace:configure.ac:68: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) -m4trace:configure.ac:68: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) -m4trace:configure.ac:68: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) -m4trace:configure.ac:68: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS -m4trace:configure.ac:68: -1- _LT_PROG_LTMAIN diff --git a/vendor/gtest-1.6.0/build-aux/compile b/vendor/gtest-1.6.0/build-aux/compile deleted file mode 100755 index 531136b0..00000000 --- a/vendor/gtest-1.6.0/build-aux/compile +++ /dev/null @@ -1,347 +0,0 @@ -#! /bin/sh -# Wrapper for compilers which do not understand '-c -o'. - -scriptversion=2012-10-14.11; # UTC - -# Copyright (C) 1999-2013 Free Software Foundation, Inc. -# Written by Tom Tromey . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -nl=' -' - -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent tools from complaining about whitespace usage. -IFS=" "" $nl" - -file_conv= - -# func_file_conv build_file lazy -# Convert a $build file to $host form and store it in $file -# Currently only supports Windows hosts. If the determined conversion -# type is listed in (the comma separated) LAZY, no conversion will -# take place. -func_file_conv () -{ - file=$1 - case $file in - / | /[!/]*) # absolute file, and not a UNC file - if test -z "$file_conv"; then - # lazily determine how to convert abs files - case `uname -s` in - MINGW*) - file_conv=mingw - ;; - CYGWIN*) - file_conv=cygwin - ;; - *) - file_conv=wine - ;; - esac - fi - case $file_conv/,$2, in - *,$file_conv,*) - ;; - mingw/*) - file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` - ;; - cygwin/*) - file=`cygpath -m "$file" || echo "$file"` - ;; - wine/*) - file=`winepath -w "$file" || echo "$file"` - ;; - esac - ;; - esac -} - -# func_cl_dashL linkdir -# Make cl look for libraries in LINKDIR -func_cl_dashL () -{ - func_file_conv "$1" - if test -z "$lib_path"; then - lib_path=$file - else - lib_path="$lib_path;$file" - fi - linker_opts="$linker_opts -LIBPATH:$file" -} - -# func_cl_dashl library -# Do a library search-path lookup for cl -func_cl_dashl () -{ - lib=$1 - found=no - save_IFS=$IFS - IFS=';' - for dir in $lib_path $LIB - do - IFS=$save_IFS - if $shared && test -f "$dir/$lib.dll.lib"; then - found=yes - lib=$dir/$lib.dll.lib - break - fi - if test -f "$dir/$lib.lib"; then - found=yes - lib=$dir/$lib.lib - break - fi - if test -f "$dir/lib$lib.a"; then - found=yes - lib=$dir/lib$lib.a - break - fi - done - IFS=$save_IFS - - if test "$found" != yes; then - lib=$lib.lib - fi -} - -# func_cl_wrapper cl arg... -# Adjust compile command to suit cl -func_cl_wrapper () -{ - # Assume a capable shell - lib_path= - shared=: - linker_opts= - for arg - do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as 'compile cc -o foo foo.c'. - eat=1 - case $2 in - *.o | *.[oO][bB][jJ]) - func_file_conv "$2" - set x "$@" -Fo"$file" - shift - ;; - *) - func_file_conv "$2" - set x "$@" -Fe"$file" - shift - ;; - esac - ;; - -I) - eat=1 - func_file_conv "$2" mingw - set x "$@" -I"$file" - shift - ;; - -I*) - func_file_conv "${1#-I}" mingw - set x "$@" -I"$file" - shift - ;; - -l) - eat=1 - func_cl_dashl "$2" - set x "$@" "$lib" - shift - ;; - -l*) - func_cl_dashl "${1#-l}" - set x "$@" "$lib" - shift - ;; - -L) - eat=1 - func_cl_dashL "$2" - ;; - -L*) - func_cl_dashL "${1#-L}" - ;; - -static) - shared=false - ;; - -Wl,*) - arg=${1#-Wl,} - save_ifs="$IFS"; IFS=',' - for flag in $arg; do - IFS="$save_ifs" - linker_opts="$linker_opts $flag" - done - IFS="$save_ifs" - ;; - -Xlinker) - eat=1 - linker_opts="$linker_opts $2" - ;; - -*) - set x "$@" "$1" - shift - ;; - *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) - func_file_conv "$1" - set x "$@" -Tp"$file" - shift - ;; - *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) - func_file_conv "$1" mingw - set x "$@" "$file" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift - done - if test -n "$linker_opts"; then - linker_opts="-link$linker_opts" - fi - exec "$@" $linker_opts - exit 1 -} - -eat= - -case $1 in - '') - echo "$0: No command. Try '$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: compile [--help] [--version] PROGRAM [ARGS] - -Wrapper for compilers which do not understand '-c -o'. -Remove '-o dest.o' from ARGS, run PROGRAM with the remaining -arguments, and rename the output as expected. - -If you are trying to build a whole package this is not the -right script to run: please start by reading the file 'INSTALL'. - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "compile $scriptversion" - exit $? - ;; - cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) - func_cl_wrapper "$@" # Doesn't return... - ;; -esac - -ofile= -cfile= - -for arg -do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as 'compile cc -o foo foo.c'. - # So we strip '-o arg' only if arg is an object. - eat=1 - case $2 in - *.o | *.obj) - ofile=$2 - ;; - *) - set x "$@" -o "$2" - shift - ;; - esac - ;; - *.c) - cfile=$1 - set x "$@" "$1" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift -done - -if test -z "$ofile" || test -z "$cfile"; then - # If no '-o' option was seen then we might have been invoked from a - # pattern rule where we don't need one. That is ok -- this is a - # normal compilation that the losing compiler can handle. If no - # '.c' file was seen then we are probably linking. That is also - # ok. - exec "$@" -fi - -# Name of file we expect compiler to create. -cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` - -# Create the lock directory. -# Note: use '[/\\:.-]' here to ensure that we don't use the same name -# that we are using for the .o file. Also, base the name on the expected -# object file name, since that is what matters with a parallel build. -lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d -while true; do - if mkdir "$lockdir" >/dev/null 2>&1; then - break - fi - sleep 1 -done -# FIXME: race condition here if user kills between mkdir and trap. -trap "rmdir '$lockdir'; exit 1" 1 2 15 - -# Run the compile. -"$@" -ret=$? - -if test -f "$cofile"; then - test "$cofile" = "$ofile" || mv "$cofile" "$ofile" -elif test -f "${cofile}bj"; then - test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" -fi - -rmdir "$lockdir" -exit $ret - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/vendor/gtest-1.6.0/build-aux/test-driver b/vendor/gtest-1.6.0/build-aux/test-driver deleted file mode 100755 index d3060566..00000000 --- a/vendor/gtest-1.6.0/build-aux/test-driver +++ /dev/null @@ -1,139 +0,0 @@ -#! /bin/sh -# test-driver - basic testsuite driver script. - -scriptversion=2013-07-13.22; # UTC - -# Copyright (C) 2011-2013 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -# Make unconditional expansion of undefined variables an error. This -# helps a lot in preventing typo-related bugs. -set -u - -usage_error () -{ - echo "$0: $*" >&2 - print_usage >&2 - exit 2 -} - -print_usage () -{ - cat <$log_file 2>&1 -estatus=$? -if test $enable_hard_errors = no && test $estatus -eq 99; then - estatus=1 -fi - -case $estatus:$expect_failure in - 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; - 0:*) col=$grn res=PASS recheck=no gcopy=no;; - 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; - 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; - *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; - *:*) col=$red res=FAIL recheck=yes gcopy=yes;; -esac - -# Report outcome to console. -echo "${col}${res}${std}: $test_name" - -# Register the test result, and other relevant metadata. -echo ":test-result: $res" > $trs_file -echo ":global-test-result: $res" >> $trs_file -echo ":recheck: $recheck" >> $trs_file -echo ":copy-in-global-log: $gcopy" >> $trs_file - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: From 1c1b52111eca2ef92687b77b5d9355b5c72b5afa Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 14 Aug 2015 00:31:44 -0400 Subject: [PATCH 014/212] add vendorized json-cpp this is a checking of the [amalgamated][1] source of the json-cpp parser. It's a great parser and this way we can just include it in the test build without having to build another vendor library and dealing with their build system. This gives us the ability to parse output from httpbin for better unit tests. [1]: https://github.com/open-source-parsers/jsoncpp#generating-amalgamated-source-and-header --- Makefile.am | 4 +- vendor/jsoncpp-0.10.5/dist/.deps/.dirstamp | 0 vendor/jsoncpp-0.10.5/dist/.deps/jsoncpp.Po | 545 ++ vendor/jsoncpp-0.10.5/dist/.dirstamp | 0 .../jsoncpp-0.10.5/dist/json/json-forwards.h | 255 + vendor/jsoncpp-0.10.5/dist/json/json.h | 1961 +++++++ vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp | 4890 +++++++++++++++++ vendor/jsoncpp-0.10.5/dist/jsoncpp.o | Bin 0 -> 2178952 bytes 8 files changed, 7653 insertions(+), 2 deletions(-) create mode 100644 vendor/jsoncpp-0.10.5/dist/.deps/.dirstamp create mode 100644 vendor/jsoncpp-0.10.5/dist/.deps/jsoncpp.Po create mode 100644 vendor/jsoncpp-0.10.5/dist/.dirstamp create mode 100644 vendor/jsoncpp-0.10.5/dist/json/json-forwards.h create mode 100644 vendor/jsoncpp-0.10.5/dist/json/json.h create mode 100644 vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp create mode 100644 vendor/jsoncpp-0.10.5/dist/jsoncpp.o diff --git a/Makefile.am b/Makefile.am index cb52323a..8973b1b8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,9 +1,9 @@ ACLOCAL_AMFLAGS=-I m4 -CPPFLAGS=-Iinclude -Ivendor/gtest-1.7.0/include +CPPFLAGS=-Iinclude -Ivendor/gtest-1.7.0/include -Ivendor/jsoncpp-0.10.5/dist check_PROGRAMS = test-program pkginclude_HEADERS = include/restclient-cpp/restclient.h include/restclient-cpp/meta.h -test_program_SOURCES = test/test_restclient_delete.cpp test/test_restclient_get.cpp test/test_restclient_post.cpp test/test_restclient_put.cpp test/tests.cpp +test_program_SOURCES = vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp test/test_restclient_delete.cpp test/test_restclient_get.cpp test/test_restclient_post.cpp test/test_restclient_put.cpp test/tests.cpp test_program_LDADD = .libs/librestclient-cpp.a test_program_LDFLAGS=-Lvendor/gtest-1.7.0/lib/.libs -lgtest diff --git a/vendor/jsoncpp-0.10.5/dist/.deps/.dirstamp b/vendor/jsoncpp-0.10.5/dist/.deps/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/vendor/jsoncpp-0.10.5/dist/.deps/jsoncpp.Po b/vendor/jsoncpp-0.10.5/dist/.deps/jsoncpp.Po new file mode 100644 index 00000000..80bdb77e --- /dev/null +++ b/vendor/jsoncpp-0.10.5/dist/.deps/jsoncpp.Po @@ -0,0 +1,545 @@ +vendor/jsoncpp-0.10.5/dist/jsoncpp.o: \ + vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp \ + vendor/jsoncpp-0.10.5/dist/json/json.h \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iosfwd \ + /usr/include/wchar.h /usr/include/_types.h /usr/include/sys/_types.h \ + /usr/include/sys/cdefs.h /usr/include/sys/_symbol_aliasing.h \ + /usr/include/sys/_posix_availability.h /usr/include/machine/_types.h \ + /usr/include/i386/_types.h /usr/include/sys/_pthread/_pthread_types.h \ + /usr/include/Availability.h /usr/include/AvailabilityInternal.h \ + /usr/include/sys/_types/_null.h /usr/include/sys/_types/_size_t.h \ + /usr/include/sys/_types/_mbstate_t.h \ + /usr/include/sys/_types/_ct_rune_t.h /usr/include/sys/_types/_rune_t.h \ + /usr/include/sys/_types/_wchar_t.h \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/stdarg.h \ + /usr/include/stdio.h /usr/include/sys/_types/_va_list.h \ + /usr/include/sys/stdio.h /usr/include/sys/_types/_off_t.h \ + /usr/include/sys/_types/_ssize_t.h /usr/include/time.h \ + /usr/include/sys/_types/_clock_t.h /usr/include/sys/_types/_time_t.h \ + /usr/include/sys/_types/_timespec.h /usr/include/_wctype.h \ + /usr/include/sys/_types/_wint_t.h /usr/include/_types/_wctype_t.h \ + /usr/include/ctype.h /usr/include/runetype.h \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstring \ + /usr/include/string.h /usr/include/sys/_types/_rsize_t.h \ + /usr/include/sys/_types/_errno_t.h /usr/include/strings.h \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdio \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cwchar \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cwctype \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cctype \ + /usr/include/wctype.h /usr/include/_types/_wctrans_t.h \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/initializer_list \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstddef \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/stddef.h \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/type_traits \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/utility \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tuple \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tuple_03 \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/typeinfo \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/exception \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdint \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/stdint.h \ + /usr/include/stdint.h /usr/include/sys/_types/_int8_t.h \ + /usr/include/sys/_types/_int16_t.h /usr/include/sys/_types/_int32_t.h \ + /usr/include/sys/_types/_int64_t.h /usr/include/_types/_uint8_t.h \ + /usr/include/_types/_uint16_t.h /usr/include/_types/_uint32_t.h \ + /usr/include/_types/_uint64_t.h /usr/include/sys/_types/_intptr_t.h \ + /usr/include/sys/_types/_uintptr_t.h /usr/include/_types/_intmax_t.h \ + /usr/include/_types/_uintmax_t.h \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/new \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/limits \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__undef_min_max \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iterator \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_base \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_base_03 \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__debug \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/tuple \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/stdexcept \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__bit_reference \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/climits \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/limits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__split_buffer \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/map \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tree \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/functional \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_03 \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/deque \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/stack \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/istream \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ostream \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ios \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__locale \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/mutex \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__mutex_base \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/chrono \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ctime \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ratio \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/system_error \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cerrno \ + /usr/include/errno.h /usr/include/sys/errno.h /usr/include/pthread.h \ + /usr/include/pthread/pthread_impl.h /usr/include/pthread/sched.h \ + /usr/include/sys/_pthread/_pthread_attr_t.h \ + /usr/include/sys/_pthread/_pthread_cond_t.h \ + /usr/include/sys/_pthread/_pthread_condattr_t.h \ + /usr/include/sys/_pthread/_pthread_key_t.h \ + /usr/include/sys/_pthread/_pthread_mutex_t.h \ + /usr/include/sys/_pthread/_pthread_mutexattr_t.h \ + /usr/include/sys/_pthread/_pthread_once_t.h \ + /usr/include/sys/_pthread/_pthread_rwlock_t.h \ + /usr/include/sys/_pthread/_pthread_rwlockattr_t.h \ + /usr/include/sys/_pthread/_pthread_t.h /usr/include/pthread/qos.h \ + /usr/include/sys/qos.h /usr/include/sys/_types/_mach_port_t.h \ + /usr/include/sys/_types/_sigset_t.h /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/xlocale.h /usr/include/_xlocale.h \ + /usr/include/xlocale/_ctype.h /usr/include/xlocale/__wctype.h \ + /usr/include/xlocale/_stdio.h /usr/include/xlocale/_string.h \ + /usr/include/xlocale/_time.h /usr/include/xlocale/_wchar.h \ + /usr/include/xlocale/_wctype.h \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/streambuf \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/locale \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdlib \ + /usr/include/stdlib.h /usr/include/sys/wait.h \ + /usr/include/sys/_types/_pid_t.h /usr/include/sys/_types/_id_t.h \ + /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ + /usr/include/machine/signal.h /usr/include/i386/signal.h \ + /usr/include/machine/_mcontext.h /usr/include/i386/_mcontext.h \ + /usr/include/mach/i386/_structs.h \ + /usr/include/sys/_types/_sigaltstack.h \ + /usr/include/sys/_types/_ucontext.h /usr/include/sys/_types/_uid_t.h \ + /usr/include/sys/resource.h /usr/include/sys/_types/_timeval.h \ + /usr/include/machine/endian.h /usr/include/i386/endian.h \ + /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + /usr/include/sys/_types/_dev_t.h /usr/include/sys/_types/_mode_t.h \ + /usr/include/xlocale/_stdlib.h /usr/include/nl_types.h \ + /usr/include/sys/types.h /usr/include/sys/_types/_blkcnt_t.h \ + /usr/include/sys/_types/_blksize_t.h /usr/include/sys/_types/_gid_t.h \ + /usr/include/sys/_types/_in_addr_t.h \ + /usr/include/sys/_types/_in_port_t.h /usr/include/sys/_types/_ino_t.h \ + /usr/include/sys/_types/_ino64_t.h /usr/include/sys/_types/_key_t.h \ + /usr/include/sys/_types/_nlink_t.h \ + /usr/include/sys/_types/_useconds_t.h \ + /usr/include/sys/_types/_suseconds_t.h \ + /usr/include/sys/_types/_fd_def.h \ + /usr/include/sys/_types/_fd_setsize.h \ + /usr/include/sys/_types/_fd_set.h /usr/include/sys/_types/_fd_clr.h \ + /usr/include/sys/_types/_fd_zero.h /usr/include/sys/_types/_fd_isset.h \ + /usr/include/sys/_types/_fd_copy.h \ + /usr/include/sys/_types/_fsblkcnt_t.h \ + /usr/include/sys/_types/_fsfilcnt_t.h /usr/include/_types/_nl_item.h \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/bitset \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/sstream \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cassert \ + /usr/include/assert.h \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/set \ + /usr/include/math.h \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iomanip \ + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath + +vendor/jsoncpp-0.10.5/dist/json/json.h: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iosfwd: + +/usr/include/wchar.h: + +/usr/include/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/sys/cdefs.h: + +/usr/include/sys/_symbol_aliasing.h: + +/usr/include/sys/_posix_availability.h: + +/usr/include/machine/_types.h: + +/usr/include/i386/_types.h: + +/usr/include/sys/_pthread/_pthread_types.h: + +/usr/include/Availability.h: + +/usr/include/AvailabilityInternal.h: + +/usr/include/sys/_types/_null.h: + +/usr/include/sys/_types/_size_t.h: + +/usr/include/sys/_types/_mbstate_t.h: + +/usr/include/sys/_types/_ct_rune_t.h: + +/usr/include/sys/_types/_rune_t.h: + +/usr/include/sys/_types/_wchar_t.h: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/stdarg.h: + +/usr/include/stdio.h: + +/usr/include/sys/_types/_va_list.h: + +/usr/include/sys/stdio.h: + +/usr/include/sys/_types/_off_t.h: + +/usr/include/sys/_types/_ssize_t.h: + +/usr/include/time.h: + +/usr/include/sys/_types/_clock_t.h: + +/usr/include/sys/_types/_time_t.h: + +/usr/include/sys/_types/_timespec.h: + +/usr/include/_wctype.h: + +/usr/include/sys/_types/_wint_t.h: + +/usr/include/_types/_wctype_t.h: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstring: + +/usr/include/string.h: + +/usr/include/sys/_types/_rsize_t.h: + +/usr/include/sys/_types/_errno_t.h: + +/usr/include/strings.h: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdio: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cwchar: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cwctype: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cctype: + +/usr/include/wctype.h: + +/usr/include/_types/_wctrans_t.h: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/initializer_list: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstddef: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/stddef.h: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/type_traits: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/utility: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tuple: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tuple_03: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/typeinfo: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/exception: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdint: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/sys/_types/_int8_t.h: + +/usr/include/sys/_types/_int16_t.h: + +/usr/include/sys/_types/_int32_t.h: + +/usr/include/sys/_types/_int64_t.h: + +/usr/include/_types/_uint8_t.h: + +/usr/include/_types/_uint16_t.h: + +/usr/include/_types/_uint32_t.h: + +/usr/include/_types/_uint64_t.h: + +/usr/include/sys/_types/_intptr_t.h: + +/usr/include/sys/_types/_uintptr_t.h: + +/usr/include/_types/_intmax_t.h: + +/usr/include/_types/_uintmax_t.h: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/new: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/limits: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__undef_min_max: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iterator: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_base: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_base_03: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__debug: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/tuple: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/stdexcept: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__bit_reference: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/climits: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/limits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__split_buffer: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/map: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tree: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/functional: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_03: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/deque: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/stack: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/istream: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ostream: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ios: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__locale: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/mutex: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__mutex_base: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/chrono: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ctime: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ratio: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/system_error: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cerrno: + +/usr/include/errno.h: + +/usr/include/sys/errno.h: + +/usr/include/pthread.h: + +/usr/include/pthread/pthread_impl.h: + +/usr/include/pthread/sched.h: + +/usr/include/sys/_pthread/_pthread_attr_t.h: + +/usr/include/sys/_pthread/_pthread_cond_t.h: + +/usr/include/sys/_pthread/_pthread_condattr_t.h: + +/usr/include/sys/_pthread/_pthread_key_t.h: + +/usr/include/sys/_pthread/_pthread_mutex_t.h: + +/usr/include/sys/_pthread/_pthread_mutexattr_t.h: + +/usr/include/sys/_pthread/_pthread_once_t.h: + +/usr/include/sys/_pthread/_pthread_rwlock_t.h: + +/usr/include/sys/_pthread/_pthread_rwlockattr_t.h: + +/usr/include/sys/_pthread/_pthread_t.h: + +/usr/include/pthread/qos.h: + +/usr/include/sys/qos.h: + +/usr/include/sys/_types/_mach_port_t.h: + +/usr/include/sys/_types/_sigset_t.h: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/xlocale.h: + +/usr/include/_xlocale.h: + +/usr/include/xlocale/_ctype.h: + +/usr/include/xlocale/__wctype.h: + +/usr/include/xlocale/_stdio.h: + +/usr/include/xlocale/_string.h: + +/usr/include/xlocale/_time.h: + +/usr/include/xlocale/_wchar.h: + +/usr/include/xlocale/_wctype.h: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/streambuf: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/locale: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdlib: + +/usr/include/stdlib.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/_types/_pid_t.h: + +/usr/include/sys/_types/_id_t.h: + +/usr/include/sys/signal.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/machine/_mcontext.h: + +/usr/include/i386/_mcontext.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/_types/_sigaltstack.h: + +/usr/include/sys/_types/_ucontext.h: + +/usr/include/sys/_types/_uid_t.h: + +/usr/include/sys/resource.h: + +/usr/include/sys/_types/_timeval.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/alloca.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +/usr/include/sys/_types/_dev_t.h: + +/usr/include/sys/_types/_mode_t.h: + +/usr/include/xlocale/_stdlib.h: + +/usr/include/nl_types.h: + +/usr/include/sys/types.h: + +/usr/include/sys/_types/_blkcnt_t.h: + +/usr/include/sys/_types/_blksize_t.h: + +/usr/include/sys/_types/_gid_t.h: + +/usr/include/sys/_types/_in_addr_t.h: + +/usr/include/sys/_types/_in_port_t.h: + +/usr/include/sys/_types/_ino_t.h: + +/usr/include/sys/_types/_ino64_t.h: + +/usr/include/sys/_types/_key_t.h: + +/usr/include/sys/_types/_nlink_t.h: + +/usr/include/sys/_types/_useconds_t.h: + +/usr/include/sys/_types/_suseconds_t.h: + +/usr/include/sys/_types/_fd_def.h: + +/usr/include/sys/_types/_fd_setsize.h: + +/usr/include/sys/_types/_fd_set.h: + +/usr/include/sys/_types/_fd_clr.h: + +/usr/include/sys/_types/_fd_zero.h: + +/usr/include/sys/_types/_fd_isset.h: + +/usr/include/sys/_types/_fd_copy.h: + +/usr/include/sys/_types/_fsblkcnt_t.h: + +/usr/include/sys/_types/_fsfilcnt_t.h: + +/usr/include/_types/_nl_item.h: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/bitset: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/sstream: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cassert: + +/usr/include/assert.h: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/set: + +/usr/include/math.h: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iomanip: + +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath: diff --git a/vendor/jsoncpp-0.10.5/dist/.dirstamp b/vendor/jsoncpp-0.10.5/dist/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/vendor/jsoncpp-0.10.5/dist/json/json-forwards.h b/vendor/jsoncpp-0.10.5/dist/json/json-forwards.h new file mode 100644 index 00000000..ccbdb2b1 --- /dev/null +++ b/vendor/jsoncpp-0.10.5/dist/json/json-forwards.h @@ -0,0 +1,255 @@ +/// Json-cpp amalgated forward header (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json-forwards.h" +/// This header provides forward declaration for all JsonCpp types. + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + +/* +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +The author (Baptiste Lepilleur) explicitly disclaims copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is +released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +======================================================================== +(END LICENSE TEXT) + +The MIT license is compatible with both the GPL and commercial +software, affording one all of the rights of Public Domain with the +minor nuisance of being required to keep the above copyright notice +and license text in the source code. Note also that by accepting the +Public Domain "license" you can re-license your copy using whatever +license you like. + +*/ + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + + + + + +#ifndef JSON_FORWARD_AMALGATED_H_INCLUDED +# define JSON_FORWARD_AMALGATED_H_INCLUDED +/// If defined, indicates that the source file is amalgated +/// to prevent private header inclusion. +#define JSON_IS_AMALGAMATION + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/config.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_CONFIG_H_INCLUDED +#define JSON_CONFIG_H_INCLUDED + +/// If defined, indicates that json library is embedded in CppTL library. +//# define JSON_IN_CPPTL 1 + +/// If defined, indicates that json may leverage CppTL library +//# define JSON_USE_CPPTL 1 +/// If defined, indicates that cpptl vector based map should be used instead of +/// std::map +/// as Value container. +//# define JSON_USE_CPPTL_SMALLMAP 1 + +// If non-zero, the library uses exceptions to report bad input instead of C +// assertion macros. The default is to use exceptions. +#ifndef JSON_USE_EXCEPTION +#define JSON_USE_EXCEPTION 1 +#endif + +/// If defined, indicates that the source file is amalgated +/// to prevent private header inclusion. +/// Remarks: it is automatically defined in the generated amalgated header. +// #define JSON_IS_AMALGAMATION + +#ifdef JSON_IN_CPPTL +#include +#ifndef JSON_USE_CPPTL +#define JSON_USE_CPPTL 1 +#endif +#endif + +#ifdef JSON_IN_CPPTL +#define JSON_API CPPTL_API +#elif defined(JSON_DLL_BUILD) +#if defined(_MSC_VER) +#define JSON_API __declspec(dllexport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#elif defined(JSON_DLL) +#if defined(_MSC_VER) +#define JSON_API __declspec(dllimport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#endif // ifdef JSON_IN_CPPTL +#if !defined(JSON_API) +#define JSON_API +#endif + +// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for +// integer +// Storages, and 64 bits integer support is disabled. +// #define JSON_NO_INT64 1 + +#if defined(_MSC_VER) && _MSC_VER <= 1200 // MSVC 6 +// Microsoft Visual Studio 6 only support conversion from __int64 to double +// (no conversion from unsigned __int64). +#define JSON_USE_INT64_DOUBLE_CONVERSION 1 +// Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255' +// characters in the debug information) +// All projects I've ever seen with VS6 were using this globally (not bothering +// with pragma push/pop). +#pragma warning(disable : 4786) +#endif // if defined(_MSC_VER) && _MSC_VER < 1200 // MSVC 6 + +#if defined(_MSC_VER) && _MSC_VER >= 1500 // MSVC 2008 +/// Indicates that the following function is deprecated. +#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) +#elif defined(__clang__) && defined(__has_feature) +#if __has_feature(attribute_deprecated_with_message) +#define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) +#endif +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) +#elif defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) +#endif + +#if !defined(JSONCPP_DEPRECATED) +#define JSONCPP_DEPRECATED(message) +#endif // if !defined(JSONCPP_DEPRECATED) + +namespace Json { +typedef int Int; +typedef unsigned int UInt; +#if defined(JSON_NO_INT64) +typedef int LargestInt; +typedef unsigned int LargestUInt; +#undef JSON_HAS_INT64 +#else // if defined(JSON_NO_INT64) +// For Microsoft Visual use specific types as long long is not supported +#if defined(_MSC_VER) // Microsoft Visual Studio +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#else // if defined(_MSC_VER) // Other platforms, use long long +typedef long long int Int64; +typedef unsigned long long int UInt64; +#endif // if defined(_MSC_VER) +typedef Int64 LargestInt; +typedef UInt64 LargestUInt; +#define JSON_HAS_INT64 +#endif // if defined(JSON_NO_INT64) +} // end namespace Json + +#endif // JSON_CONFIG_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/config.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/forwards.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_FORWARDS_H_INCLUDED +#define JSON_FORWARDS_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "config.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +// writer.h +class FastWriter; +class StyledWriter; + +// reader.h +class Reader; + +// features.h +class Features; + +// value.h +typedef unsigned int ArrayIndex; +class StaticString; +class Path; +class PathArgument; +class Value; +class ValueIteratorBase; +class ValueIterator; +class ValueConstIterator; + +} // namespace Json + +#endif // JSON_FORWARDS_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/forwards.h +// ////////////////////////////////////////////////////////////////////// + + + + + +#endif //ifndef JSON_FORWARD_AMALGATED_H_INCLUDED diff --git a/vendor/jsoncpp-0.10.5/dist/json/json.h b/vendor/jsoncpp-0.10.5/dist/json/json.h new file mode 100644 index 00000000..1eccbd37 --- /dev/null +++ b/vendor/jsoncpp-0.10.5/dist/json/json.h @@ -0,0 +1,1961 @@ +/// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json.h" + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + +/* +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +The author (Baptiste Lepilleur) explicitly disclaims copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is +released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +======================================================================== +(END LICENSE TEXT) + +The MIT license is compatible with both the GPL and commercial +software, affording one all of the rights of Public Domain with the +minor nuisance of being required to keep the above copyright notice +and license text in the source code. Note also that by accepting the +Public Domain "license" you can re-license your copy using whatever +license you like. + +*/ + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + + + + + +#ifndef JSON_AMALGATED_H_INCLUDED +# define JSON_AMALGATED_H_INCLUDED +/// If defined, indicates that the source file is amalgated +/// to prevent private header inclusion. +#define JSON_IS_AMALGAMATION + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/version.h +// ////////////////////////////////////////////////////////////////////// + +// DO NOT EDIT. This file (and "version") is generated by CMake. +// Run CMake configure step to update it. +#ifndef JSON_VERSION_H_INCLUDED +# define JSON_VERSION_H_INCLUDED + +# define JSONCPP_VERSION_STRING "0.10.5" +# define JSONCPP_VERSION_MAJOR 0 +# define JSONCPP_VERSION_MINOR 10 +# define JSONCPP_VERSION_PATCH 5 +# define JSONCPP_VERSION_QUALIFIER +# define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | (JSONCPP_VERSION_PATCH << 8)) + +#endif // JSON_VERSION_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/version.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/config.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_CONFIG_H_INCLUDED +#define JSON_CONFIG_H_INCLUDED + +/// If defined, indicates that json library is embedded in CppTL library. +//# define JSON_IN_CPPTL 1 + +/// If defined, indicates that json may leverage CppTL library +//# define JSON_USE_CPPTL 1 +/// If defined, indicates that cpptl vector based map should be used instead of +/// std::map +/// as Value container. +//# define JSON_USE_CPPTL_SMALLMAP 1 + +// If non-zero, the library uses exceptions to report bad input instead of C +// assertion macros. The default is to use exceptions. +#ifndef JSON_USE_EXCEPTION +#define JSON_USE_EXCEPTION 1 +#endif + +/// If defined, indicates that the source file is amalgated +/// to prevent private header inclusion. +/// Remarks: it is automatically defined in the generated amalgated header. +// #define JSON_IS_AMALGAMATION + +#ifdef JSON_IN_CPPTL +#include +#ifndef JSON_USE_CPPTL +#define JSON_USE_CPPTL 1 +#endif +#endif + +#ifdef JSON_IN_CPPTL +#define JSON_API CPPTL_API +#elif defined(JSON_DLL_BUILD) +#if defined(_MSC_VER) +#define JSON_API __declspec(dllexport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#elif defined(JSON_DLL) +#if defined(_MSC_VER) +#define JSON_API __declspec(dllimport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#endif // ifdef JSON_IN_CPPTL +#if !defined(JSON_API) +#define JSON_API +#endif + +// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for +// integer +// Storages, and 64 bits integer support is disabled. +// #define JSON_NO_INT64 1 + +#if defined(_MSC_VER) && _MSC_VER <= 1200 // MSVC 6 +// Microsoft Visual Studio 6 only support conversion from __int64 to double +// (no conversion from unsigned __int64). +#define JSON_USE_INT64_DOUBLE_CONVERSION 1 +// Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255' +// characters in the debug information) +// All projects I've ever seen with VS6 were using this globally (not bothering +// with pragma push/pop). +#pragma warning(disable : 4786) +#endif // if defined(_MSC_VER) && _MSC_VER < 1200 // MSVC 6 + +#if defined(_MSC_VER) && _MSC_VER >= 1500 // MSVC 2008 +/// Indicates that the following function is deprecated. +#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) +#elif defined(__clang__) && defined(__has_feature) +#if __has_feature(attribute_deprecated_with_message) +#define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) +#endif +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) +#elif defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) +#endif + +#if !defined(JSONCPP_DEPRECATED) +#define JSONCPP_DEPRECATED(message) +#endif // if !defined(JSONCPP_DEPRECATED) + +namespace Json { +typedef int Int; +typedef unsigned int UInt; +#if defined(JSON_NO_INT64) +typedef int LargestInt; +typedef unsigned int LargestUInt; +#undef JSON_HAS_INT64 +#else // if defined(JSON_NO_INT64) +// For Microsoft Visual use specific types as long long is not supported +#if defined(_MSC_VER) // Microsoft Visual Studio +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#else // if defined(_MSC_VER) // Other platforms, use long long +typedef long long int Int64; +typedef unsigned long long int UInt64; +#endif // if defined(_MSC_VER) +typedef Int64 LargestInt; +typedef UInt64 LargestUInt; +#define JSON_HAS_INT64 +#endif // if defined(JSON_NO_INT64) +} // end namespace Json + +#endif // JSON_CONFIG_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/config.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/forwards.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_FORWARDS_H_INCLUDED +#define JSON_FORWARDS_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "config.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +// writer.h +class FastWriter; +class StyledWriter; + +// reader.h +class Reader; + +// features.h +class Features; + +// value.h +typedef unsigned int ArrayIndex; +class StaticString; +class Path; +class PathArgument; +class Value; +class ValueIteratorBase; +class ValueIterator; +class ValueConstIterator; + +} // namespace Json + +#endif // JSON_FORWARDS_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/forwards.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/features.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_FEATURES_H_INCLUDED +#define CPPTL_JSON_FEATURES_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "forwards.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +/** \brief Configuration passed to reader and writer. + * This configuration object can be used to force the Reader or Writer + * to behave in a standard conforming way. + */ +class JSON_API Features { +public: + /** \brief A configuration that allows all features and assumes all strings + * are UTF-8. + * - C & C++ comments are allowed + * - Root object can be any JSON value + * - Assumes Value strings are encoded in UTF-8 + */ + static Features all(); + + /** \brief A configuration that is strictly compatible with the JSON + * specification. + * - Comments are forbidden. + * - Root object must be either an array or an object value. + * - Assumes Value strings are encoded in UTF-8 + */ + static Features strictMode(); + + /** \brief Initialize the configuration like JsonConfig::allFeatures; + */ + Features(); + + /// \c true if comments are allowed. Default: \c true. + bool allowComments_; + + /// \c true if root must be either an array or an object value. Default: \c + /// false. + bool strictRoot_; +}; + +} // namespace Json + +#endif // CPPTL_JSON_FEATURES_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/features.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/value.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_H_INCLUDED +#define CPPTL_JSON_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "forwards.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include + +#ifndef JSON_USE_CPPTL_SMALLMAP +#include +#else +#include +#endif +#ifdef JSON_USE_CPPTL +#include +#endif + +// Disable warning C4251: : needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(push) +#pragma warning(disable : 4251) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +/** \brief JSON (JavaScript Object Notation). + */ +namespace Json { + +/** Base class for all exceptions we throw. + * + * We use nothing but these internally. Of course, STL can throw others. + */ +class JSON_API Exception : public std::exception { +public: + Exception(std::string const& msg); + virtual ~Exception() throw(); + virtual char const* what() const throw(); +protected: + std::string const msg_; +}; + +/** Exceptions which the user cannot easily avoid. + * + * E.g. out-of-memory (when we use malloc), stack-overflow, malicious input + * + * \remark derived from Json::Exception + */ +class JSON_API RuntimeError : public Exception { +public: + RuntimeError(std::string const& msg); +}; + +/** Exceptions thrown by JSON_ASSERT/JSON_FAIL macros. + * + * These are precondition-violations (user bugs) and internal errors (our bugs). + * + * \remark derived from Json::Exception + */ +class JSON_API LogicError : public Exception { +public: + LogicError(std::string const& msg); +}; + +/// used internally +void throwRuntimeError(std::string const& msg); +/// used internally +void throwLogicError(std::string const& msg); + +/** \brief Type of the value held by a Value object. + */ +enum ValueType { + nullValue = 0, ///< 'null' value + intValue, ///< signed integer value + uintValue, ///< unsigned integer value + realValue, ///< double value + stringValue, ///< UTF-8 string value + booleanValue, ///< bool value + arrayValue, ///< array value (ordered list) + objectValue ///< object value (collection of name/value pairs). +}; + +enum CommentPlacement { + commentBefore = 0, ///< a comment placed on the line before a value + commentAfterOnSameLine, ///< a comment just after a value on the same line + commentAfter, ///< a comment on the line after a value (only make sense for + /// root value) + numberOfCommentPlacement +}; + +//# ifdef JSON_USE_CPPTL +// typedef CppTL::AnyEnumerator EnumMemberNames; +// typedef CppTL::AnyEnumerator EnumValues; +//# endif + +/** \brief Lightweight wrapper to tag static string. + * + * Value constructor and objectValue member assignement takes advantage of the + * StaticString and avoid the cost of string duplication when storing the + * string or the member name. + * + * Example of usage: + * \code + * Json::Value aValue( StaticString("some text") ); + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode + */ +class JSON_API StaticString { +public: + explicit StaticString(const char* czstring) : c_str_(czstring) {} + + operator const char*() const { return c_str_; } + + const char* c_str() const { return c_str_; } + +private: + const char* c_str_; +}; + +/** \brief Represents a JSON value. + * + * This class is a discriminated union wrapper that can represents a: + * - signed integer [range: Value::minInt - Value::maxInt] + * - unsigned integer (range: 0 - Value::maxUInt) + * - double + * - UTF-8 string + * - boolean + * - 'null' + * - an ordered list of Value + * - collection of name/value pairs (javascript object) + * + * The type of the held value is represented by a #ValueType and + * can be obtained using type(). + * + * Values of an #objectValue or #arrayValue can be accessed using operator[]() + * methods. + * Non-const methods will automatically create the a #nullValue element + * if it does not exist. + * The sequence of an #arrayValue will be automatically resized and initialized + * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. + * + * The get() methods can be used to obtain default value in the case the + * required element does not exist. + * + * It is possible to iterate over the list of a #objectValue values using + * the getMemberNames() method. + * + * \note #Value string-length fit in size_t, but keys must be < 2^30. + * (The reason is an implementation detail.) A #CharReader will raise an + * exception if a bound is exceeded to avoid security holes in your app, + * but the Value API does *not* check bounds. That is the responsibility + * of the caller. + */ +class JSON_API Value { + friend class ValueIteratorBase; +public: + typedef std::vector Members; + typedef ValueIterator iterator; + typedef ValueConstIterator const_iterator; + typedef Json::UInt UInt; + typedef Json::Int Int; +#if defined(JSON_HAS_INT64) + typedef Json::UInt64 UInt64; + typedef Json::Int64 Int64; +#endif // defined(JSON_HAS_INT64) + typedef Json::LargestInt LargestInt; + typedef Json::LargestUInt LargestUInt; + typedef Json::ArrayIndex ArrayIndex; + + static const Value& nullRef; +#if !defined(__ARMEL__) + /// \deprecated This exists for binary compatibility only. Use nullRef. + static const Value null; +#endif + /// Minimum signed integer value that can be stored in a Json::Value. + static const LargestInt minLargestInt; + /// Maximum signed integer value that can be stored in a Json::Value. + static const LargestInt maxLargestInt; + /// Maximum unsigned integer value that can be stored in a Json::Value. + static const LargestUInt maxLargestUInt; + + /// Minimum signed int value that can be stored in a Json::Value. + static const Int minInt; + /// Maximum signed int value that can be stored in a Json::Value. + static const Int maxInt; + /// Maximum unsigned int value that can be stored in a Json::Value. + static const UInt maxUInt; + +#if defined(JSON_HAS_INT64) + /// Minimum signed 64 bits int value that can be stored in a Json::Value. + static const Int64 minInt64; + /// Maximum signed 64 bits int value that can be stored in a Json::Value. + static const Int64 maxInt64; + /// Maximum unsigned 64 bits int value that can be stored in a Json::Value. + static const UInt64 maxUInt64; +#endif // defined(JSON_HAS_INT64) + +private: +#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + class CZString { + public: + enum DuplicationPolicy { + noDuplication = 0, + duplicate, + duplicateOnCopy + }; + CZString(ArrayIndex index); + CZString(char const* str, unsigned length, DuplicationPolicy allocate); + CZString(CZString const& other); + ~CZString(); + CZString& operator=(CZString other); + bool operator<(CZString const& other) const; + bool operator==(CZString const& other) const; + ArrayIndex index() const; + //const char* c_str() const; ///< \deprecated + char const* data() const; + unsigned length() const; + bool isStaticString() const; + + private: + void swap(CZString& other); + + struct StringStorage { + unsigned policy_: 2; + unsigned length_: 30; // 1GB max + }; + + char const* cstr_; // actually, a prefixed string, unless policy is noDup + union { + ArrayIndex index_; + StringStorage storage_; + }; + }; + +public: +#ifndef JSON_USE_CPPTL_SMALLMAP + typedef std::map ObjectValues; +#else + typedef CppTL::SmallMap ObjectValues; +#endif // ifndef JSON_USE_CPPTL_SMALLMAP +#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + +public: + /** \brief Create a default Value of the given type. + + This is a very useful constructor. + To create an empty array, pass arrayValue. + To create an empty object, pass objectValue. + Another Value can then be set to this one by assignment. +This is useful since clear() and resize() will not alter types. + + Examples: +\code +Json::Value null_value; // null +Json::Value arr_value(Json::arrayValue); // [] +Json::Value obj_value(Json::objectValue); // {} +\endcode + */ + Value(ValueType type = nullValue); + Value(Int value); + Value(UInt value); +#if defined(JSON_HAS_INT64) + Value(Int64 value); + Value(UInt64 value); +#endif // if defined(JSON_HAS_INT64) + Value(double value); + Value(const char* value); ///< Copy til first 0. (NULL causes to seg-fault.) + Value(const char* begin, const char* end); ///< Copy all, incl zeroes. + /** \brief Constructs a value from a static string. + + * Like other value string constructor but do not duplicate the string for + * internal storage. The given string must remain alive after the call to this + * constructor. + * \note This works only for null-terminated strings. (We cannot change the + * size of this class, so we have nowhere to store the length, + * which might be computed later for various operations.) + * + * Example of usage: + * \code + * static StaticString foo("some text"); + * Json::Value aValue(foo); + * \endcode + */ + Value(const StaticString& value); + Value(const std::string& value); ///< Copy data() til size(). Embedded zeroes too. +#ifdef JSON_USE_CPPTL + Value(const CppTL::ConstString& value); +#endif + Value(bool value); + /// Deep copy. + Value(const Value& other); + ~Value(); + + /// Deep copy, then swap(other). + /// \note Over-write existing comments. To preserve comments, use #swapPayload(). + Value &operator=(const Value &other); + /// Swap everything. + void swap(Value& other); + /// Swap values but leave comments and source offsets in place. + void swapPayload(Value& other); + + ValueType type() const; + + /// Compare payload only, not comments etc. + bool operator<(const Value& other) const; + bool operator<=(const Value& other) const; + bool operator>=(const Value& other) const; + bool operator>(const Value& other) const; + bool operator==(const Value& other) const; + bool operator!=(const Value& other) const; + int compare(const Value& other) const; + + const char* asCString() const; ///< Embedded zeroes could cause you trouble! + std::string asString() const; ///< Embedded zeroes are possible. + /** Get raw char* of string-value. + * \return false if !string. (Seg-fault if str or end are NULL.) + */ + bool getString( + char const** begin, char const** end) const; +#ifdef JSON_USE_CPPTL + CppTL::ConstString asConstString() const; +#endif + Int asInt() const; + UInt asUInt() const; +#if defined(JSON_HAS_INT64) + Int64 asInt64() const; + UInt64 asUInt64() const; +#endif // if defined(JSON_HAS_INT64) + LargestInt asLargestInt() const; + LargestUInt asLargestUInt() const; + float asFloat() const; + double asDouble() const; + bool asBool() const; + + bool isNull() const; + bool isBool() const; + bool isInt() const; + bool isInt64() const; + bool isUInt() const; + bool isUInt64() const; + bool isIntegral() const; + bool isDouble() const; + bool isNumeric() const; + bool isString() const; + bool isArray() const; + bool isObject() const; + + bool isConvertibleTo(ValueType other) const; + + /// Number of values in array or object + ArrayIndex size() const; + + /// \brief Return true if empty array, empty object, or null; + /// otherwise, false. + bool empty() const; + + /// Return isNull() + bool operator!() const; + + /// Remove all object members and array elements. + /// \pre type() is arrayValue, objectValue, or nullValue + /// \post type() is unchanged + void clear(); + + /// Resize the array to size elements. + /// New elements are initialized to null. + /// May only be called on nullValue or arrayValue. + /// \pre type() is arrayValue or nullValue + /// \post type() is arrayValue + void resize(ArrayIndex size); + + /// Access an array element (zero based index ). + /// If the array contains less than index element, then null value are + /// inserted + /// in the array so that its size is index+1. + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + Value& operator[](ArrayIndex index); + + /// Access an array element (zero based index ). + /// If the array contains less than index element, then null value are + /// inserted + /// in the array so that its size is index+1. + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + Value& operator[](int index); + + /// Access an array element (zero based index ) + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + const Value& operator[](ArrayIndex index) const; + + /// Access an array element (zero based index ) + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + const Value& operator[](int index) const; + + /// If the array contains at least index+1 elements, returns the element + /// value, + /// otherwise returns defaultValue. + Value get(ArrayIndex index, const Value& defaultValue) const; + /// Return true if index < size(). + bool isValidIndex(ArrayIndex index) const; + /// \brief Append value to array at the end. + /// + /// Equivalent to jsonvalue[jsonvalue.size()] = value; + Value& append(const Value& value); + + /// Access an object value by name, create a null member if it does not exist. + /// \note Because of our implementation, keys are limited to 2^30 -1 chars. + /// Exceeding that will cause an exception. + Value& operator[](const char* key); + /// Access an object value by name, returns null if there is no member with + /// that name. + const Value& operator[](const char* key) const; + /// Access an object value by name, create a null member if it does not exist. + /// \param key may contain embedded nulls. + Value& operator[](const std::string& key); + /// Access an object value by name, returns null if there is no member with + /// that name. + /// \param key may contain embedded nulls. + const Value& operator[](const std::string& key) const; + /** \brief Access an object value by name, create a null member if it does not + exist. + + * If the object has no entry for that name, then the member name used to store + * the new entry is not duplicated. + * Example of use: + * \code + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode + */ + Value& operator[](const StaticString& key); +#ifdef JSON_USE_CPPTL + /// Access an object value by name, create a null member if it does not exist. + Value& operator[](const CppTL::ConstString& key); + /// Access an object value by name, returns null if there is no member with + /// that name. + const Value& operator[](const CppTL::ConstString& key) const; +#endif + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + Value get(const char* key, const Value& defaultValue) const; + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + /// \note key may contain embedded nulls. + Value get(const char* begin, const char* end, const Value& defaultValue) const; + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + /// \param key may contain embedded nulls. + Value get(const std::string& key, const Value& defaultValue) const; +#ifdef JSON_USE_CPPTL + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + Value get(const CppTL::ConstString& key, const Value& defaultValue) const; +#endif + /// Most general and efficient version of isMember()const, get()const, + /// and operator[]const + /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 + Value const* find(char const* begin, char const* end) const; + /// Most general and efficient version of object-mutators. + /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 + /// \return non-zero, but JSON_ASSERT if this is neither object nor nullValue. + Value const* demand(char const* begin, char const* end); + /// \brief Remove and return the named member. + /// + /// Do nothing if it did not exist. + /// \return the removed Value, or null. + /// \pre type() is objectValue or nullValue + /// \post type() is unchanged + /// \deprecated + Value removeMember(const char* key); + /// Same as removeMember(const char*) + /// \param key may contain embedded nulls. + /// \deprecated + Value removeMember(const std::string& key); + /// Same as removeMember(const char* begin, const char* end, Value* removed), + /// but 'key' is null-terminated. + bool removeMember(const char* key, Value* removed); + /** \brief Remove the named map member. + + Update 'removed' iff removed. + \param key may contain embedded nulls. + \return true iff removed (no exceptions) + */ + bool removeMember(std::string const& key, Value* removed); + /// Same as removeMember(std::string const& key, Value* removed) + bool removeMember(const char* begin, const char* end, Value* removed); + /** \brief Remove the indexed array element. + + O(n) expensive operations. + Update 'removed' iff removed. + \return true iff removed (no exceptions) + */ + bool removeIndex(ArrayIndex i, Value* removed); + + /// Return true if the object has a member named key. + /// \note 'key' must be null-terminated. + bool isMember(const char* key) const; + /// Return true if the object has a member named key. + /// \param key may contain embedded nulls. + bool isMember(const std::string& key) const; + /// Same as isMember(std::string const& key)const + bool isMember(const char* begin, const char* end) const; +#ifdef JSON_USE_CPPTL + /// Return true if the object has a member named key. + bool isMember(const CppTL::ConstString& key) const; +#endif + + /// \brief Return a list of the member names. + /// + /// If null, return an empty list. + /// \pre type() is objectValue or nullValue + /// \post if type() was nullValue, it remains nullValue + Members getMemberNames() const; + + //# ifdef JSON_USE_CPPTL + // EnumMemberNames enumMemberNames() const; + // EnumValues enumValues() const; + //# endif + + /// \deprecated Always pass len. + JSONCPP_DEPRECATED("Use setComment(std::string const&) instead.") + void setComment(const char* comment, CommentPlacement placement); + /// Comments must be //... or /* ... */ + void setComment(const char* comment, size_t len, CommentPlacement placement); + /// Comments must be //... or /* ... */ + void setComment(const std::string& comment, CommentPlacement placement); + bool hasComment(CommentPlacement placement) const; + /// Include delimiters and embedded newlines. + std::string getComment(CommentPlacement placement) const; + + std::string toStyledString() const; + + const_iterator begin() const; + const_iterator end() const; + + iterator begin(); + iterator end(); + +private: + void initBasic(ValueType type, bool allocated = false); + + Value& resolveReference(const char* key); + Value& resolveReference(const char* key, const char* end); + + struct CommentInfo { + CommentInfo(); + ~CommentInfo(); + + void setComment(const char* text, size_t len); + + char* comment_; + }; + + // struct MemberNamesTransform + //{ + // typedef const char *result_type; + // const char *operator()( const CZString &name ) const + // { + // return name.c_str(); + // } + //}; + + union ValueHolder { + LargestInt int_; + LargestUInt uint_; + double real_; + bool bool_; + char* string_; // actually ptr to unsigned, followed by str, unless !allocated_ + ObjectValues* map_; + } value_; + ValueType type_ : 8; + unsigned int allocated_ : 1; // Notes: if declared as bool, bitfield is useless. + // If not allocated_, string_ must be null-terminated. + CommentInfo* comments_; +}; + +/** \brief Experimental and untested: represents an element of the "path" to + * access a node. + */ +class JSON_API PathArgument { +public: + friend class Path; + + PathArgument(); + PathArgument(ArrayIndex index); + PathArgument(const char* key); + PathArgument(const std::string& key); + +private: + enum Kind { + kindNone = 0, + kindIndex, + kindKey + }; + std::string key_; + ArrayIndex index_; + Kind kind_; +}; + +/** \brief Experimental and untested: represents a "path" to access a node. + * + * Syntax: + * - "." => root node + * - ".[n]" => elements at index 'n' of root node (an array value) + * - ".name" => member named 'name' of root node (an object value) + * - ".name1.name2.name3" + * - ".[0][1][2].name1[3]" + * - ".%" => member name is provided as parameter + * - ".[%]" => index is provied as parameter + */ +class JSON_API Path { +public: + Path(const std::string& path, + const PathArgument& a1 = PathArgument(), + const PathArgument& a2 = PathArgument(), + const PathArgument& a3 = PathArgument(), + const PathArgument& a4 = PathArgument(), + const PathArgument& a5 = PathArgument()); + + const Value& resolve(const Value& root) const; + Value resolve(const Value& root, const Value& defaultValue) const; + /// Creates the "path" to access the specified node and returns a reference on + /// the node. + Value& make(Value& root) const; + +private: + typedef std::vector InArgs; + typedef std::vector Args; + + void makePath(const std::string& path, const InArgs& in); + void addPathInArg(const std::string& path, + const InArgs& in, + InArgs::const_iterator& itInArg, + PathArgument::Kind kind); + void invalidPath(const std::string& path, int location); + + Args args_; +}; + +/** \brief base class for Value iterators. + * + */ +class JSON_API ValueIteratorBase { +public: + typedef std::bidirectional_iterator_tag iterator_category; + typedef unsigned int size_t; + typedef int difference_type; + typedef ValueIteratorBase SelfType; + + bool operator==(const SelfType& other) const { return isEqual(other); } + + bool operator!=(const SelfType& other) const { return !isEqual(other); } + + difference_type operator-(const SelfType& other) const { + return other.computeDistance(*this); + } + + /// Return either the index or the member name of the referenced value as a + /// Value. + Value key() const; + + /// Return the index of the referenced Value, or -1 if it is not an arrayValue. + UInt index() const; + + /// Return the member name of the referenced Value, or "" if it is not an + /// objectValue. + /// \note Avoid `c_str()` on result, as embedded zeroes are possible. + std::string name() const; + + /// Return the member name of the referenced Value. "" if it is not an + /// objectValue. + /// \deprecated This cannot be used for UTF-8 strings, since there can be embedded nulls. + JSONCPP_DEPRECATED("Use `key = name();` instead.") + char const* memberName() const; + /// Return the member name of the referenced Value, or NULL if it is not an + /// objectValue. + /// \note Better version than memberName(). Allows embedded nulls. + char const* memberName(char const** end) const; + +protected: + Value& deref() const; + + void increment(); + + void decrement(); + + difference_type computeDistance(const SelfType& other) const; + + bool isEqual(const SelfType& other) const; + + void copy(const SelfType& other); + +private: + Value::ObjectValues::iterator current_; + // Indicates that iterator is for a null value. + bool isNull_; + +public: + // For some reason, BORLAND needs these at the end, rather + // than earlier. No idea why. + ValueIteratorBase(); + explicit ValueIteratorBase(const Value::ObjectValues::iterator& current); +}; + +/** \brief const iterator for object and array value. + * + */ +class JSON_API ValueConstIterator : public ValueIteratorBase { + friend class Value; + +public: + typedef const Value value_type; + //typedef unsigned int size_t; + //typedef int difference_type; + typedef const Value& reference; + typedef const Value* pointer; + typedef ValueConstIterator SelfType; + + ValueConstIterator(); + +private: +/*! \internal Use by Value to create an iterator. + */ + explicit ValueConstIterator(const Value::ObjectValues::iterator& current); +public: + SelfType& operator=(const ValueIteratorBase& other); + + SelfType operator++(int) { + SelfType temp(*this); + ++*this; + return temp; + } + + SelfType operator--(int) { + SelfType temp(*this); + --*this; + return temp; + } + + SelfType& operator--() { + decrement(); + return *this; + } + + SelfType& operator++() { + increment(); + return *this; + } + + reference operator*() const { return deref(); } + + pointer operator->() const { return &deref(); } +}; + +/** \brief Iterator for object and array value. + */ +class JSON_API ValueIterator : public ValueIteratorBase { + friend class Value; + +public: + typedef Value value_type; + typedef unsigned int size_t; + typedef int difference_type; + typedef Value& reference; + typedef Value* pointer; + typedef ValueIterator SelfType; + + ValueIterator(); + ValueIterator(const ValueConstIterator& other); + ValueIterator(const ValueIterator& other); + +private: +/*! \internal Use by Value to create an iterator. + */ + explicit ValueIterator(const Value::ObjectValues::iterator& current); +public: + SelfType& operator=(const SelfType& other); + + SelfType operator++(int) { + SelfType temp(*this); + ++*this; + return temp; + } + + SelfType operator--(int) { + SelfType temp(*this); + --*this; + return temp; + } + + SelfType& operator--() { + decrement(); + return *this; + } + + SelfType& operator++() { + increment(); + return *this; + } + + reference operator*() const { return deref(); } + + pointer operator->() const { return &deref(); } +}; + +} // namespace Json + + +namespace std { +/// Specialize std::swap() for Json::Value. +template<> +inline void swap(Json::Value& a, Json::Value& b) { a.swap(b); } +} + + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // CPPTL_JSON_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/value.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/reader.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_READER_H_INCLUDED +#define CPPTL_JSON_READER_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "features.h" +#include "value.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include + +// Disable warning C4251: : needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(push) +#pragma warning(disable : 4251) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +namespace Json { + +/** \brief Unserialize a JSON document into a + *Value. + * + * \deprecated Use CharReader and CharReaderBuilder. + */ +class JSON_API Reader { +public: + typedef char Char; + typedef const Char* Location; + + /** \brief Constructs a Reader allowing all features + * for parsing. + */ + Reader(); + + /** \brief Constructs a Reader allowing the specified feature set + * for parsing. + */ + Reader(const Features& features); + + /** \brief Read a Value from a JSON + * document. + * \param document UTF-8 encoded string containing the document to read. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param collectComments \c true to collect comment and allow writing them + * back during + * serialization, \c false to discard comments. + * This parameter is ignored if + * Features::allowComments_ + * is \c false. + * \return \c true if the document was successfully parsed, \c false if an + * error occurred. + */ + bool + parse(const std::string& document, Value& root, bool collectComments = true); + + /** \brief Read a Value from a JSON + document. + * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the + document to read. + * \param endDoc Pointer on the end of the UTF-8 encoded string of the + document to read. + * Must be >= beginDoc. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param collectComments \c true to collect comment and allow writing them + back during + * serialization, \c false to discard comments. + * This parameter is ignored if + Features::allowComments_ + * is \c false. + * \return \c true if the document was successfully parsed, \c false if an + error occurred. + */ + bool parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments = true); + + /// \brief Parse from input stream. + /// \see Json::operator>>(std::istream&, Json::Value&). + bool parse(std::istream& is, Value& root, bool collectComments = true); + + /** \brief Returns a user friendly string that list errors in the parsed + * document. + * \return Formatted error message with the list of errors with their location + * in + * the parsed document. An empty string is returned if no error + * occurred + * during parsing. + * \deprecated Use getFormattedErrorMessages() instead (typo fix). + */ + JSONCPP_DEPRECATED("Use getFormattedErrorMessages() instead.") + std::string getFormatedErrorMessages() const; + + /** \brief Returns a user friendly string that list errors in the parsed + * document. + * \return Formatted error message with the list of errors with their location + * in + * the parsed document. An empty string is returned if no error + * occurred + * during parsing. + */ + std::string getFormattedErrorMessages() const; + +private: + enum TokenType { + tokenEndOfStream = 0, + tokenObjectBegin, + tokenObjectEnd, + tokenArrayBegin, + tokenArrayEnd, + tokenString, + tokenNumber, + tokenTrue, + tokenFalse, + tokenNull, + tokenArraySeparator, + tokenMemberSeparator, + tokenComment, + tokenError + }; + + class Token { + public: + TokenType type_; + Location start_; + Location end_; + }; + + class ErrorInfo { + public: + Token token_; + std::string message_; + Location extra_; + }; + + typedef std::deque Errors; + + bool readToken(Token& token); + void skipSpaces(); + bool match(Location pattern, int patternLength); + bool readComment(); + bool readCStyleComment(); + bool readCppStyleComment(); + bool readString(); + void readNumber(); + bool readValue(); + bool readObject(Token& token); + bool readArray(Token& token); + bool decodeNumber(Token& token); + bool decodeNumber(Token& token, Value& decoded); + bool decodeString(Token& token); + bool decodeString(Token& token, std::string& decoded); + bool decodeDouble(Token& token); + bool decodeDouble(Token& token, Value& decoded); + bool decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool addError(const std::string& message, Token& token, Location extra = 0); + bool recoverFromError(TokenType skipUntilToken); + bool addErrorAndRecover(const std::string& message, + Token& token, + TokenType skipUntilToken); + void skipUntilSpace(); + Value& currentValue(); + Char getNextChar(); + void + getLocationLineAndColumn(Location location, int& line, int& column) const; + std::string getLocationLineAndColumn(Location location) const; + void addComment(Location begin, Location end, CommentPlacement placement); + void skipCommentTokens(Token& token); + + typedef std::stack Nodes; + Nodes nodes_; + Errors errors_; + std::string document_; + Location begin_; + Location end_; + Location current_; + Location lastValueEnd_; + Value* lastValue_; + std::string commentsBefore_; + Features features_; + bool collectComments_; +}; // Reader + +/** Interface for reading JSON from a char array. + */ +class JSON_API CharReader { +public: + virtual ~CharReader() {} + /** \brief Read a Value from a JSON + document. + * The document must be a UTF-8 encoded string containing the document to read. + * + * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the + document to read. + * \param endDoc Pointer on the end of the UTF-8 encoded string of the + document to read. + * Must be >= beginDoc. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param errs [out] Formatted error messages (if not NULL) + * a user friendly string that lists errors in the parsed + * document. + * \return \c true if the document was successfully parsed, \c false if an + error occurred. + */ + virtual bool parse( + char const* beginDoc, char const* endDoc, + Value* root, std::string* errs) = 0; + + class Factory { + public: + virtual ~Factory() {} + /** \brief Allocate a CharReader via operator new(). + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + virtual CharReader* newCharReader() const = 0; + }; // Factory +}; // CharReader + +/** \brief Build a CharReader implementation. + +Usage: +\code + using namespace Json; + CharReaderBuilder builder; + builder["collectComments"] = false; + Value value; + std::string errs; + bool ok = parseFromStream(builder, std::cin, &value, &errs); +\endcode +*/ +class JSON_API CharReaderBuilder : public CharReader::Factory { +public: + // Note: We use a Json::Value so that we can add data-members to this class + // without a major version bump. + /** Configuration of this builder. + These are case-sensitive. + Available settings (case-sensitive): + - `"collectComments": false or true` + - true to collect comment and allow writing them + back during serialization, false to discard comments. + This parameter is ignored if allowComments is false. + - `"allowComments": false or true` + - true if comments are allowed. + - `"strictRoot": false or true` + - true if root must be either an array or an object value + - `"allowDroppedNullPlaceholders": false or true` + - true if dropped null placeholders are allowed. (See StreamWriterBuilder.) + - `"allowNumericKeys": false or true` + - true if numeric object keys are allowed. + - `"allowSingleQuotes": false or true` + - true if '' are allowed for strings (both keys and values) + - `"stackLimit": integer` + - Exceeding stackLimit (recursive depth of `readValue()`) will + cause an exception. + - This is a security issue (seg-faults caused by deeply nested JSON), + so the default is low. + - `"failIfExtra": false or true` + - If true, `parse()` returns false when extra non-whitespace trails + the JSON value in the input string. + - `"rejectDupKeys": false or true` + - If true, `parse()` returns false when a key is duplicated within an object. + + You can examine 'settings_` yourself + to see the defaults. You can also write and read them just like any + JSON Value. + \sa setDefaults() + */ + Json::Value settings_; + + CharReaderBuilder(); + virtual ~CharReaderBuilder(); + + virtual CharReader* newCharReader() const; + + /** \return true if 'settings' are legal and consistent; + * otherwise, indicate bad settings via 'invalid'. + */ + bool validate(Json::Value* invalid) const; + + /** A simple way to update a specific setting. + */ + Value& operator[](std::string key); + + /** Called by ctor, but you can use this to reset settings_. + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_reader.cpp CharReaderBuilderDefaults + */ + static void setDefaults(Json::Value* settings); + /** Same as old Features::strictMode(). + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_reader.cpp CharReaderBuilderStrictMode + */ + static void strictMode(Json::Value* settings); +}; + +/** Consume entire stream and use its begin/end. + * Someday we might have a real StreamReader, but for now this + * is convenient. + */ +bool JSON_API parseFromStream( + CharReader::Factory const&, + std::istream&, + Value* root, std::string* errs); + +/** \brief Read from 'sin' into 'root'. + + Always keep comments from the input JSON. + + This can be used to read a file into a particular sub-object. + For example: + \code + Json::Value root; + cin >> root["dir"]["file"]; + cout << root; + \endcode + Result: + \verbatim + { + "dir": { + "file": { + // The input stream JSON would be nested here. + } + } + } + \endverbatim + \throw std::exception on parse error. + \see Json::operator<<() +*/ +JSON_API std::istream& operator>>(std::istream&, Value&); + +} // namespace Json + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // CPPTL_JSON_READER_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/reader.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/writer.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_WRITER_H_INCLUDED +#define JSON_WRITER_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "value.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include + +// Disable warning C4251: : needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(push) +#pragma warning(disable : 4251) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +namespace Json { + +class Value; + +/** + +Usage: +\code + using namespace Json; + void writeToStdout(StreamWriter::Factory const& factory, Value const& value) { + std::unique_ptr const writer( + factory.newStreamWriter()); + writer->write(value, &std::cout); + std::cout << std::endl; // add lf and flush + } +\endcode +*/ +class JSON_API StreamWriter { +protected: + std::ostream* sout_; // not owned; will not delete +public: + StreamWriter(); + virtual ~StreamWriter(); + /** Write Value into document as configured in sub-class. + Do not take ownership of sout, but maintain a reference during function. + \pre sout != NULL + \return zero on success (For now, we always return zero, so check the stream instead.) + \throw std::exception possibly, depending on configuration + */ + virtual int write(Value const& root, std::ostream* sout) = 0; + + /** \brief A simple abstract factory. + */ + class JSON_API Factory { + public: + virtual ~Factory(); + /** \brief Allocate a CharReader via operator new(). + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + virtual StreamWriter* newStreamWriter() const = 0; + }; // Factory +}; // StreamWriter + +/** \brief Write into stringstream, then return string, for convenience. + * A StreamWriter will be created from the factory, used, and then deleted. + */ +std::string JSON_API writeString(StreamWriter::Factory const& factory, Value const& root); + + +/** \brief Build a StreamWriter implementation. + +Usage: +\code + using namespace Json; + Value value = ...; + StreamWriterBuilder builder; + builder["commentStyle"] = "None"; + builder["indentation"] = " "; // or whatever you like + std::unique_ptr writer( + builder.newStreamWriter()); + writer->write(value, &std::cout); + std::cout << std::endl; // add lf and flush +\endcode +*/ +class JSON_API StreamWriterBuilder : public StreamWriter::Factory { +public: + // Note: We use a Json::Value so that we can add data-members to this class + // without a major version bump. + /** Configuration of this builder. + Available settings (case-sensitive): + - "commentStyle": "None" or "All" + - "indentation": "" + - "enableYAMLCompatibility": false or true + - slightly change the whitespace around colons + - "dropNullPlaceholders": false or true + - Drop the "null" string from the writer's output for nullValues. + Strictly speaking, this is not valid JSON. But when the output is being + fed to a browser's Javascript, it makes for smaller output and the + browser can handle the output just fine. + + You can examine 'settings_` yourself + to see the defaults. You can also write and read them just like any + JSON Value. + \sa setDefaults() + */ + Json::Value settings_; + + StreamWriterBuilder(); + virtual ~StreamWriterBuilder(); + + /** + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + virtual StreamWriter* newStreamWriter() const; + + /** \return true if 'settings' are legal and consistent; + * otherwise, indicate bad settings via 'invalid'. + */ + bool validate(Json::Value* invalid) const; + /** A simple way to update a specific setting. + */ + Value& operator[](std::string key); + + /** Called by ctor, but you can use this to reset settings_. + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_writer.cpp StreamWriterBuilderDefaults + */ + static void setDefaults(Json::Value* settings); +}; + +/** \brief Abstract class for writers. + * \deprecated Use StreamWriter. (And really, this is an implementation detail.) + */ +class JSON_API Writer { +public: + virtual ~Writer(); + + virtual std::string write(const Value& root) = 0; +}; + +/** \brief Outputs a Value in JSON format + *without formatting (not human friendly). + * + * The JSON document is written in a single line. It is not intended for 'human' + *consumption, + * but may be usefull to support feature such as RPC where bandwith is limited. + * \sa Reader, Value + * \deprecated Use StreamWriterBuilder. + */ +class JSON_API FastWriter : public Writer { + +public: + FastWriter(); + virtual ~FastWriter() {} + + void enableYAMLCompatibility(); + +public: // overridden from Writer + virtual std::string write(const Value& root); + +private: + void writeValue(const Value& value); + + std::string document_; + bool yamlCompatiblityEnabled_; +}; + +/** \brief Writes a Value in JSON format in a + *human friendly way. + * + * The rules for line break and indent are as follow: + * - Object value: + * - if empty then print {} without indent and line break + * - if not empty the print '{', line break & indent, print one value per + *line + * and then unindent and line break and print '}'. + * - Array value: + * - if empty then print [] without indent and line break + * - if the array contains no object value, empty array or some other value + *types, + * and all the values fit on one lines, then print the array on a single + *line. + * - otherwise, it the values do not fit on one line, or the array contains + * object or non empty array, then print one value per line. + * + * If the Value have comments then they are outputed according to their + *#CommentPlacement. + * + * \sa Reader, Value, Value::setComment() + * \deprecated Use StreamWriterBuilder. + */ +class JSON_API StyledWriter : public Writer { +public: + StyledWriter(); + virtual ~StyledWriter() {} + +public: // overridden from Writer + /** \brief Serialize a Value in JSON format. + * \param root Value to serialize. + * \return String containing the JSON document that represents the root value. + */ + virtual std::string write(const Value& root); + +private: + void writeValue(const Value& value); + void writeArrayValue(const Value& value); + bool isMultineArray(const Value& value); + void pushValue(const std::string& value); + void writeIndent(); + void writeWithIndent(const std::string& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(const Value& root); + void writeCommentAfterValueOnSameLine(const Value& root); + bool hasCommentForValue(const Value& value); + static std::string normalizeEOL(const std::string& text); + + typedef std::vector ChildValues; + + ChildValues childValues_; + std::string document_; + std::string indentString_; + int rightMargin_; + int indentSize_; + bool addChildValues_; +}; + +/** \brief Writes a Value in JSON format in a + human friendly way, + to a stream rather than to a string. + * + * The rules for line break and indent are as follow: + * - Object value: + * - if empty then print {} without indent and line break + * - if not empty the print '{', line break & indent, print one value per + line + * and then unindent and line break and print '}'. + * - Array value: + * - if empty then print [] without indent and line break + * - if the array contains no object value, empty array or some other value + types, + * and all the values fit on one lines, then print the array on a single + line. + * - otherwise, it the values do not fit on one line, or the array contains + * object or non empty array, then print one value per line. + * + * If the Value have comments then they are outputed according to their + #CommentPlacement. + * + * \param indentation Each level will be indented by this amount extra. + * \sa Reader, Value, Value::setComment() + * \deprecated Use StreamWriterBuilder. + */ +class JSON_API StyledStreamWriter { +public: + StyledStreamWriter(std::string indentation = "\t"); + ~StyledStreamWriter() {} + +public: + /** \brief Serialize a Value in JSON format. + * \param out Stream to write to. (Can be ostringstream, e.g.) + * \param root Value to serialize. + * \note There is no point in deriving from Writer, since write() should not + * return a value. + */ + void write(std::ostream& out, const Value& root); + +private: + void writeValue(const Value& value); + void writeArrayValue(const Value& value); + bool isMultineArray(const Value& value); + void pushValue(const std::string& value); + void writeIndent(); + void writeWithIndent(const std::string& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(const Value& root); + void writeCommentAfterValueOnSameLine(const Value& root); + bool hasCommentForValue(const Value& value); + static std::string normalizeEOL(const std::string& text); + + typedef std::vector ChildValues; + + ChildValues childValues_; + std::ostream* document_; + std::string indentString_; + int rightMargin_; + std::string indentation_; + bool addChildValues_ : 1; + bool indented_ : 1; +}; + +#if defined(JSON_HAS_INT64) +std::string JSON_API valueToString(Int value); +std::string JSON_API valueToString(UInt value); +#endif // if defined(JSON_HAS_INT64) +std::string JSON_API valueToString(LargestInt value); +std::string JSON_API valueToString(LargestUInt value); +std::string JSON_API valueToString(double value); +std::string JSON_API valueToString(bool value); +std::string JSON_API valueToQuotedString(const char* value); + +/// \brief Output using the StyledStreamWriter. +/// \see Json::operator>>() +JSON_API std::ostream& operator<<(std::ostream&, const Value& root); + +} // namespace Json + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // JSON_WRITER_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/writer.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/assertions.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_ASSERTIONS_H_INCLUDED +#define CPPTL_JSON_ASSERTIONS_H_INCLUDED + +#include +#include + +#if !defined(JSON_IS_AMALGAMATION) +#include "config.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +/** It should not be possible for a maliciously designed file to + * cause an abort() or seg-fault, so these macros are used only + * for pre-condition violations and internal logic errors. + */ +#if JSON_USE_EXCEPTION + +// @todo <= add detail about condition in exception +# define JSON_ASSERT(condition) \ + {if (!(condition)) {Json::throwLogicError( "assert json failed" );}} + +# define JSON_FAIL_MESSAGE(message) \ + { \ + std::ostringstream oss; oss << message; \ + Json::throwLogicError(oss.str()); \ + abort(); \ + } + +#else // JSON_USE_EXCEPTION + +# define JSON_ASSERT(condition) assert(condition) + +// The call to assert() will show the failure message in debug builds. In +// release builds we abort, for a core-dump or debugger. +# define JSON_FAIL_MESSAGE(message) \ + { \ + std::ostringstream oss; oss << message; \ + assert(false && oss.str().c_str()); \ + abort(); \ + } + + +#endif + +#define JSON_ASSERT_MESSAGE(condition, message) \ + if (!(condition)) { \ + JSON_FAIL_MESSAGE(message); \ + } + +#endif // CPPTL_JSON_ASSERTIONS_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/assertions.h +// ////////////////////////////////////////////////////////////////////// + + + + + +#endif //ifndef JSON_AMALGATED_H_INCLUDED diff --git a/vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp b/vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp new file mode 100644 index 00000000..1ff900de --- /dev/null +++ b/vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp @@ -0,0 +1,4890 @@ +/// Json-cpp amalgated source (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json.h" + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + +/* +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +The author (Baptiste Lepilleur) explicitly disclaims copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is +released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +======================================================================== +(END LICENSE TEXT) + +The MIT license is compatible with both the GPL and commercial +software, affording one all of the rights of Public Domain with the +minor nuisance of being required to keep the above copyright notice +and license text in the source code. Note also that by accepting the +Public Domain "license" you can re-license your copy using whatever +license you like. + +*/ + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + + + + + + +#include "json/json.h" + +#ifndef JSON_IS_AMALGAMATION +#error "Compile with -I PATH_TO_JSON_DIRECTORY" +#endif + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_tool.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED +#define LIB_JSONCPP_JSON_TOOL_H_INCLUDED + +/* This header provides common string manipulation support, such as UTF-8, + * portable conversion from/to string... + * + * It is an internal header that must not be exposed. + */ + +namespace Json { + +/// Converts a unicode code-point to UTF-8. +static inline std::string codePointToUTF8(unsigned int cp) { + std::string result; + + // based on description from http://en.wikipedia.org/wiki/UTF-8 + + if (cp <= 0x7f) { + result.resize(1); + result[0] = static_cast(cp); + } else if (cp <= 0x7FF) { + result.resize(2); + result[1] = static_cast(0x80 | (0x3f & cp)); + result[0] = static_cast(0xC0 | (0x1f & (cp >> 6))); + } else if (cp <= 0xFFFF) { + result.resize(3); + result[2] = static_cast(0x80 | (0x3f & cp)); + result[1] = static_cast(0x80 | (0x3f & (cp >> 6))); + result[0] = static_cast(0xE0 | (0xf & (cp >> 12))); + } else if (cp <= 0x10FFFF) { + result.resize(4); + result[3] = static_cast(0x80 | (0x3f & cp)); + result[2] = static_cast(0x80 | (0x3f & (cp >> 6))); + result[1] = static_cast(0x80 | (0x3f & (cp >> 12))); + result[0] = static_cast(0xF0 | (0x7 & (cp >> 18))); + } + + return result; +} + +/// Returns true if ch is a control character (in range [1,31]). +static inline bool isControlCharacter(char ch) { return ch > 0 && ch <= 0x1F; } + +enum { + /// Constant that specify the size of the buffer that must be passed to + /// uintToString. + uintToStringBufferSize = 3 * sizeof(LargestUInt) + 1 +}; + +// Defines a char buffer for use with uintToString(). +typedef char UIntToStringBuffer[uintToStringBufferSize]; + +/** Converts an unsigned integer to string. + * @param value Unsigned interger to convert to string + * @param current Input/Output string buffer. + * Must have at least uintToStringBufferSize chars free. + */ +static inline void uintToString(LargestUInt value, char*& current) { + *--current = 0; + do { + *--current = static_cast(value % 10U + static_cast('0')); + value /= 10; + } while (value != 0); +} + +/** Change ',' to '.' everywhere in buffer. + * + * We had a sophisticated way, but it did not work in WinCE. + * @see https://github.com/open-source-parsers/jsoncpp/pull/9 + */ +static inline void fixNumericLocale(char* begin, char* end) { + while (begin < end) { + if (*begin == ',') { + *begin = '.'; + } + ++begin; + } +} + +} // namespace Json { + +#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_tool.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_reader.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2011 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include "json_tool.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) && _MSC_VER < 1500 // VC++ 8.0 and below +#define snprintf _snprintf +#endif + +#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 +// Disable warning about strdup being deprecated. +#pragma warning(disable : 4996) +#endif + +static int const stackLimit_g = 1000; +static int stackDepth_g = 0; // see readValue() + +namespace Json { + +typedef std::auto_ptr CharReaderPtr; + +// Implementation of class Features +// //////////////////////////////// + +Features::Features() + : allowComments_(true), strictRoot_(false) +{} +Features Features::all() { return Features(); } + +Features Features::strictMode() { + Features features; + features.allowComments_ = false; + features.strictRoot_ = true; + return features; +} + +// Implementation of class Reader +// //////////////////////////////// + +static bool containsNewLine(Reader::Location begin, Reader::Location end) { + for (; begin < end; ++begin) + if (*begin == '\n' || *begin == '\r') + return true; + return false; +} + +// Class Reader +// ////////////////////////////////////////////////////////////////// + +Reader::Reader() + : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), + lastValue_(), commentsBefore_(), features_(Features::all()), + collectComments_() {} + +Reader::Reader(const Features& features) + : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), + lastValue_(), commentsBefore_(), features_(features), collectComments_() { +} + +bool +Reader::parse(const std::string& document, Value& root, bool collectComments) { + document_ = document; + const char* begin = document_.c_str(); + const char* end = begin + document_.length(); + return parse(begin, end, root, collectComments); +} + +bool Reader::parse(std::istream& sin, Value& root, bool collectComments) { + // std::istream_iterator begin(sin); + // std::istream_iterator end; + // Those would allow streamed input from a file, if parse() were a + // template function. + + // Since std::string is reference-counted, this at least does not + // create an extra copy. + std::string doc; + std::getline(sin, doc, (char)EOF); + return parse(doc, root, collectComments); +} + +bool Reader::parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments) { + if (!features_.allowComments_) { + collectComments = false; + } + + begin_ = beginDoc; + end_ = endDoc; + collectComments_ = collectComments; + current_ = begin_; + lastValueEnd_ = 0; + lastValue_ = 0; + commentsBefore_ = ""; + errors_.clear(); + while (!nodes_.empty()) + nodes_.pop(); + nodes_.push(&root); + + stackDepth_g = 0; // Yes, this is bad coding, but options are limited. + bool successful = readValue(); + Token token; + skipCommentTokens(token); + if (collectComments_ && !commentsBefore_.empty()) + root.setComment(commentsBefore_, commentAfter); + if (features_.strictRoot_) { + if (!root.isArray() && !root.isObject()) { + // Set error location to start of doc, ideally should be first token found + // in doc + token.type_ = tokenError; + token.start_ = beginDoc; + token.end_ = endDoc; + addError( + "A valid JSON document must be either an array or an object value.", + token); + return false; + } + } + return successful; +} + +bool Reader::readValue() { + // This is a non-reentrant way to support a stackLimit. Terrible! + // But this deprecated class has a security problem: Bad input can + // cause a seg-fault. This seems like a fair, binary-compatible way + // to prevent the problem. + if (stackDepth_g >= stackLimit_g) throwRuntimeError("Exceeded stackLimit in readValue()."); + ++stackDepth_g; + + Token token; + skipCommentTokens(token); + bool successful = true; + + if (collectComments_ && !commentsBefore_.empty()) { + currentValue().setComment(commentsBefore_, commentBefore); + commentsBefore_ = ""; + } + + switch (token.type_) { + case tokenObjectBegin: + successful = readObject(token); + break; + case tokenArrayBegin: + successful = readArray(token); + break; + case tokenNumber: + successful = decodeNumber(token); + break; + case tokenString: + successful = decodeString(token); + break; + case tokenTrue: + { + Value v(true); + currentValue().swapPayload(v); + } + break; + case tokenFalse: + { + Value v(false); + currentValue().swapPayload(v); + } + break; + case tokenNull: + { + Value v; + currentValue().swapPayload(v); + } + break; + // Else, fall through... + default: + return addError("Syntax error: value, object or array expected.", token); + } + + if (collectComments_) { + lastValueEnd_ = current_; + lastValue_ = ¤tValue(); + } + + --stackDepth_g; + return successful; +} + +void Reader::skipCommentTokens(Token& token) { + if (features_.allowComments_) { + do { + readToken(token); + } while (token.type_ == tokenComment); + } else { + readToken(token); + } +} + +bool Reader::readToken(Token& token) { + skipSpaces(); + token.start_ = current_; + Char c = getNextChar(); + bool ok = true; + switch (c) { + case '{': + token.type_ = tokenObjectBegin; + break; + case '}': + token.type_ = tokenObjectEnd; + break; + case '[': + token.type_ = tokenArrayBegin; + break; + case ']': + token.type_ = tokenArrayEnd; + break; + case '"': + token.type_ = tokenString; + ok = readString(); + break; + case '/': + token.type_ = tokenComment; + ok = readComment(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + token.type_ = tokenNumber; + readNumber(); + break; + case 't': + token.type_ = tokenTrue; + ok = match("rue", 3); + break; + case 'f': + token.type_ = tokenFalse; + ok = match("alse", 4); + break; + case 'n': + token.type_ = tokenNull; + ok = match("ull", 3); + break; + case ',': + token.type_ = tokenArraySeparator; + break; + case ':': + token.type_ = tokenMemberSeparator; + break; + case 0: + token.type_ = tokenEndOfStream; + break; + default: + ok = false; + break; + } + if (!ok) + token.type_ = tokenError; + token.end_ = current_; + return true; +} + +void Reader::skipSpaces() { + while (current_ != end_) { + Char c = *current_; + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + ++current_; + else + break; + } +} + +bool Reader::match(Location pattern, int patternLength) { + if (end_ - current_ < patternLength) + return false; + int index = patternLength; + while (index--) + if (current_[index] != pattern[index]) + return false; + current_ += patternLength; + return true; +} + +bool Reader::readComment() { + Location commentBegin = current_ - 1; + Char c = getNextChar(); + bool successful = false; + if (c == '*') + successful = readCStyleComment(); + else if (c == '/') + successful = readCppStyleComment(); + if (!successful) + return false; + + if (collectComments_) { + CommentPlacement placement = commentBefore; + if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { + if (c != '*' || !containsNewLine(commentBegin, current_)) + placement = commentAfterOnSameLine; + } + + addComment(commentBegin, current_, placement); + } + return true; +} + +static std::string normalizeEOL(Reader::Location begin, Reader::Location end) { + std::string normalized; + normalized.reserve(end - begin); + Reader::Location current = begin; + while (current != end) { + char c = *current++; + if (c == '\r') { + if (current != end && *current == '\n') + // convert dos EOL + ++current; + // convert Mac EOL + normalized += '\n'; + } else { + normalized += c; + } + } + return normalized; +} + +void +Reader::addComment(Location begin, Location end, CommentPlacement placement) { + assert(collectComments_); + const std::string& normalized = normalizeEOL(begin, end); + if (placement == commentAfterOnSameLine) { + assert(lastValue_ != 0); + lastValue_->setComment(normalized, placement); + } else { + commentsBefore_ += normalized; + } +} + +bool Reader::readCStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '*' && *current_ == '/') + break; + } + return getNextChar() == '/'; +} + +bool Reader::readCppStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '\n') + break; + if (c == '\r') { + // Consume DOS EOL. It will be normalized in addComment. + if (current_ != end_ && *current_ == '\n') + getNextChar(); + // Break on Moc OS 9 EOL. + break; + } + } + return true; +} + +void Reader::readNumber() { + const char *p = current_; + char c = '0'; // stopgap for already consumed character + // integral part + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + // fractional part + if (c == '.') { + c = (current_ = p) < end_ ? *p++ : 0; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + } + // exponential part + if (c == 'e' || c == 'E') { + c = (current_ = p) < end_ ? *p++ : 0; + if (c == '+' || c == '-') + c = (current_ = p) < end_ ? *p++ : 0; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + } +} + +bool Reader::readString() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '"') + break; + } + return c == '"'; +} + +bool Reader::readObject(Token& /*tokenStart*/) { + Token tokenName; + std::string name; + Value init(objectValue); + currentValue().swapPayload(init); + while (readToken(tokenName)) { + bool initialTokenOk = true; + while (tokenName.type_ == tokenComment && initialTokenOk) + initialTokenOk = readToken(tokenName); + if (!initialTokenOk) + break; + if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object + return true; + name = ""; + if (tokenName.type_ == tokenString) { + if (!decodeString(tokenName, name)) + return recoverFromError(tokenObjectEnd); + } else { + break; + } + + Token colon; + if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { + return addErrorAndRecover( + "Missing ':' after object member name", colon, tokenObjectEnd); + } + Value& value = currentValue()[name]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenObjectEnd); + + Token comma; + if (!readToken(comma) || + (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && + comma.type_ != tokenComment)) { + return addErrorAndRecover( + "Missing ',' or '}' in object declaration", comma, tokenObjectEnd); + } + bool finalizeTokenOk = true; + while (comma.type_ == tokenComment && finalizeTokenOk) + finalizeTokenOk = readToken(comma); + if (comma.type_ == tokenObjectEnd) + return true; + } + return addErrorAndRecover( + "Missing '}' or object member name", tokenName, tokenObjectEnd); +} + +bool Reader::readArray(Token& /*tokenStart*/) { + Value init(arrayValue); + currentValue().swapPayload(init); + skipSpaces(); + if (*current_ == ']') // empty array + { + Token endArray; + readToken(endArray); + return true; + } + int index = 0; + for (;;) { + Value& value = currentValue()[index++]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenArrayEnd); + + Token token; + // Accept Comment after last item in the array. + ok = readToken(token); + while (token.type_ == tokenComment && ok) { + ok = readToken(token); + } + bool badTokenType = + (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd); + if (!ok || badTokenType) { + return addErrorAndRecover( + "Missing ',' or ']' in array declaration", token, tokenArrayEnd); + } + if (token.type_ == tokenArrayEnd) + break; + } + return true; +} + +bool Reader::decodeNumber(Token& token) { + Value decoded; + if (!decodeNumber(token, decoded)) + return false; + currentValue().swapPayload(decoded); + return true; +} + +bool Reader::decodeNumber(Token& token, Value& decoded) { + // Attempts to parse the number as an integer. If the number is + // larger than the maximum supported value of an integer then + // we decode the number as a double. + Location current = token.start_; + bool isNegative = *current == '-'; + if (isNegative) + ++current; + // TODO: Help the compiler do the div and mod at compile time or get rid of them. + Value::LargestUInt maxIntegerValue = + isNegative ? Value::LargestUInt(-Value::minLargestInt) + : Value::maxLargestUInt; + Value::LargestUInt threshold = maxIntegerValue / 10; + Value::LargestUInt value = 0; + while (current < token.end_) { + Char c = *current++; + if (c < '0' || c > '9') + return decodeDouble(token, decoded); + Value::UInt digit(c - '0'); + if (value >= threshold) { + // We've hit or exceeded the max value divided by 10 (rounded down). If + // a) we've only just touched the limit, b) this is the last digit, and + // c) it's small enough to fit in that rounding delta, we're okay. + // Otherwise treat this number as a double to avoid overflow. + if (value > threshold || current != token.end_ || + digit > maxIntegerValue % 10) { + return decodeDouble(token, decoded); + } + } + value = value * 10 + digit; + } + if (isNegative) + decoded = -Value::LargestInt(value); + else if (value <= Value::LargestUInt(Value::maxInt)) + decoded = Value::LargestInt(value); + else + decoded = value; + return true; +} + +bool Reader::decodeDouble(Token& token) { + Value decoded; + if (!decodeDouble(token, decoded)) + return false; + currentValue().swapPayload(decoded); + return true; +} + +bool Reader::decodeDouble(Token& token, Value& decoded) { + double value = 0; + std::string buffer(token.start_, token.end_); + std::istringstream is(buffer); + if (!(is >> value)) + return addError("'" + std::string(token.start_, token.end_) + + "' is not a number.", + token); + decoded = value; + return true; +} + +bool Reader::decodeString(Token& token) { + std::string decoded_string; + if (!decodeString(token, decoded_string)) + return false; + Value decoded(decoded_string); + currentValue().swapPayload(decoded); + return true; +} + +bool Reader::decodeString(Token& token, std::string& decoded) { + decoded.reserve(token.end_ - token.start_ - 2); + Location current = token.start_ + 1; // skip '"' + Location end = token.end_ - 1; // do not include '"' + while (current != end) { + Char c = *current++; + if (c == '"') + break; + else if (c == '\\') { + if (current == end) + return addError("Empty escape sequence in string", token, current); + Char escape = *current++; + switch (escape) { + case '"': + decoded += '"'; + break; + case '/': + decoded += '/'; + break; + case '\\': + decoded += '\\'; + break; + case 'b': + decoded += '\b'; + break; + case 'f': + decoded += '\f'; + break; + case 'n': + decoded += '\n'; + break; + case 'r': + decoded += '\r'; + break; + case 't': + decoded += '\t'; + break; + case 'u': { + unsigned int unicode; + if (!decodeUnicodeCodePoint(token, current, end, unicode)) + return false; + decoded += codePointToUTF8(unicode); + } break; + default: + return addError("Bad escape sequence in string", token, current); + } + } else { + decoded += c; + } + } + return true; +} + +bool Reader::decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode) { + + if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) + return false; + if (unicode >= 0xD800 && unicode <= 0xDBFF) { + // surrogate pairs + if (end - current < 6) + return addError( + "additional six characters expected to parse unicode surrogate pair.", + token, + current); + unsigned int surrogatePair; + if (*(current++) == '\\' && *(current++) == 'u') { + if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { + unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); + } else + return false; + } else + return addError("expecting another \\u token to begin the second half of " + "a unicode surrogate pair", + token, + current); + } + return true; +} + +bool Reader::decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& unicode) { + if (end - current < 4) + return addError( + "Bad unicode escape sequence in string: four digits expected.", + token, + current); + unicode = 0; + for (int index = 0; index < 4; ++index) { + Char c = *current++; + unicode *= 16; + if (c >= '0' && c <= '9') + unicode += c - '0'; + else if (c >= 'a' && c <= 'f') + unicode += c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + unicode += c - 'A' + 10; + else + return addError( + "Bad unicode escape sequence in string: hexadecimal digit expected.", + token, + current); + } + return true; +} + +bool +Reader::addError(const std::string& message, Token& token, Location extra) { + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = extra; + errors_.push_back(info); + return false; +} + +bool Reader::recoverFromError(TokenType skipUntilToken) { + int errorCount = int(errors_.size()); + Token skip; + for (;;) { + if (!readToken(skip)) + errors_.resize(errorCount); // discard errors caused by recovery + if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) + break; + } + errors_.resize(errorCount); + return false; +} + +bool Reader::addErrorAndRecover(const std::string& message, + Token& token, + TokenType skipUntilToken) { + addError(message, token); + return recoverFromError(skipUntilToken); +} + +Value& Reader::currentValue() { return *(nodes_.top()); } + +Reader::Char Reader::getNextChar() { + if (current_ == end_) + return 0; + return *current_++; +} + +void Reader::getLocationLineAndColumn(Location location, + int& line, + int& column) const { + Location current = begin_; + Location lastLineStart = current; + line = 0; + while (current < location && current != end_) { + Char c = *current++; + if (c == '\r') { + if (*current == '\n') + ++current; + lastLineStart = current; + ++line; + } else if (c == '\n') { + lastLineStart = current; + ++line; + } + } + // column & line start at 1 + column = int(location - lastLineStart) + 1; + ++line; +} + +std::string Reader::getLocationLineAndColumn(Location location) const { + int line, column; + getLocationLineAndColumn(location, line, column); + char buffer[18 + 16 + 16 + 1]; +#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) +#if defined(WINCE) + _snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); +#else + sprintf_s(buffer, sizeof(buffer), "Line %d, Column %d", line, column); +#endif +#else + snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); +#endif + return buffer; +} + +// Deprecated. Preserved for backward compatibility +std::string Reader::getFormatedErrorMessages() const { + return getFormattedErrorMessages(); +} + +std::string Reader::getFormattedErrorMessages() const { + std::string formattedMessage; + for (Errors::const_iterator itError = errors_.begin(); + itError != errors_.end(); + ++itError) { + const ErrorInfo& error = *itError; + formattedMessage += + "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; + formattedMessage += " " + error.message_ + "\n"; + if (error.extra_) + formattedMessage += + "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; + } + return formattedMessage; +} + +// Reader +///////////////////////// + +// exact copy of Features +class OurFeatures { +public: + static OurFeatures all(); + OurFeatures(); + bool allowComments_; + bool strictRoot_; + bool allowDroppedNullPlaceholders_; + bool allowNumericKeys_; + bool allowSingleQuotes_; + bool failIfExtra_; + bool rejectDupKeys_; + int stackLimit_; +}; // OurFeatures + +// exact copy of Implementation of class Features +// //////////////////////////////// + +OurFeatures::OurFeatures() + : allowComments_(true), strictRoot_(false) + , allowDroppedNullPlaceholders_(false), allowNumericKeys_(false) + , allowSingleQuotes_(false) + , failIfExtra_(false) +{ +} + +OurFeatures OurFeatures::all() { return OurFeatures(); } + +// Implementation of class Reader +// //////////////////////////////// + +// exact copy of Reader, renamed to OurReader +class OurReader { +public: + typedef char Char; + typedef const Char* Location; + struct StructuredError { + size_t offset_start; + size_t offset_limit; + std::string message; + }; + + OurReader(OurFeatures const& features); + bool parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments = true); + std::string getFormattedErrorMessages() const; + +private: + OurReader(OurReader const&); // no impl + void operator=(OurReader const&); // no impl + + enum TokenType { + tokenEndOfStream = 0, + tokenObjectBegin, + tokenObjectEnd, + tokenArrayBegin, + tokenArrayEnd, + tokenString, + tokenNumber, + tokenTrue, + tokenFalse, + tokenNull, + tokenArraySeparator, + tokenMemberSeparator, + tokenComment, + tokenError + }; + + class Token { + public: + TokenType type_; + Location start_; + Location end_; + }; + + class ErrorInfo { + public: + Token token_; + std::string message_; + Location extra_; + }; + + typedef std::deque Errors; + + bool readToken(Token& token); + void skipSpaces(); + bool match(Location pattern, int patternLength); + bool readComment(); + bool readCStyleComment(); + bool readCppStyleComment(); + bool readString(); + bool readStringSingleQuote(); + void readNumber(); + bool readValue(); + bool readObject(Token& token); + bool readArray(Token& token); + bool decodeNumber(Token& token); + bool decodeNumber(Token& token, Value& decoded); + bool decodeString(Token& token); + bool decodeString(Token& token, std::string& decoded); + bool decodeDouble(Token& token); + bool decodeDouble(Token& token, Value& decoded); + bool decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool addError(const std::string& message, Token& token, Location extra = 0); + bool recoverFromError(TokenType skipUntilToken); + bool addErrorAndRecover(const std::string& message, + Token& token, + TokenType skipUntilToken); + void skipUntilSpace(); + Value& currentValue(); + Char getNextChar(); + void + getLocationLineAndColumn(Location location, int& line, int& column) const; + std::string getLocationLineAndColumn(Location location) const; + void addComment(Location begin, Location end, CommentPlacement placement); + void skipCommentTokens(Token& token); + + typedef std::stack Nodes; + Nodes nodes_; + Errors errors_; + std::string document_; + Location begin_; + Location end_; + Location current_; + Location lastValueEnd_; + Value* lastValue_; + std::string commentsBefore_; + int stackDepth_; + + OurFeatures const features_; + bool collectComments_; +}; // OurReader + +// complete copy of Read impl, for OurReader + +OurReader::OurReader(OurFeatures const& features) + : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), + lastValue_(), commentsBefore_(), features_(features), collectComments_() { +} + +bool OurReader::parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments) { + if (!features_.allowComments_) { + collectComments = false; + } + + begin_ = beginDoc; + end_ = endDoc; + collectComments_ = collectComments; + current_ = begin_; + lastValueEnd_ = 0; + lastValue_ = 0; + commentsBefore_ = ""; + errors_.clear(); + while (!nodes_.empty()) + nodes_.pop(); + nodes_.push(&root); + + stackDepth_ = 0; + bool successful = readValue(); + Token token; + skipCommentTokens(token); + if (features_.failIfExtra_) { + if (token.type_ != tokenError && token.type_ != tokenEndOfStream) { + addError("Extra non-whitespace after JSON value.", token); + return false; + } + } + if (collectComments_ && !commentsBefore_.empty()) + root.setComment(commentsBefore_, commentAfter); + if (features_.strictRoot_) { + if (!root.isArray() && !root.isObject()) { + // Set error location to start of doc, ideally should be first token found + // in doc + token.type_ = tokenError; + token.start_ = beginDoc; + token.end_ = endDoc; + addError( + "A valid JSON document must be either an array or an object value.", + token); + return false; + } + } + return successful; +} + +bool OurReader::readValue() { + if (stackDepth_ >= features_.stackLimit_) throwRuntimeError("Exceeded stackLimit in readValue()."); + ++stackDepth_; + Token token; + skipCommentTokens(token); + bool successful = true; + + if (collectComments_ && !commentsBefore_.empty()) { + currentValue().setComment(commentsBefore_, commentBefore); + commentsBefore_ = ""; + } + + switch (token.type_) { + case tokenObjectBegin: + successful = readObject(token); + break; + case tokenArrayBegin: + successful = readArray(token); + break; + case tokenNumber: + successful = decodeNumber(token); + break; + case tokenString: + successful = decodeString(token); + break; + case tokenTrue: + { + Value v(true); + currentValue().swapPayload(v); + } + break; + case tokenFalse: + { + Value v(false); + currentValue().swapPayload(v); + } + break; + case tokenNull: + { + Value v; + currentValue().swapPayload(v); + } + break; + case tokenArraySeparator: + case tokenObjectEnd: + case tokenArrayEnd: + if (features_.allowDroppedNullPlaceholders_) { + // "Un-read" the current token and mark the current value as a null + // token. + current_--; + Value v; + currentValue().swapPayload(v); + break; + } // else, fall through ... + default: + return addError("Syntax error: value, object or array expected.", token); + } + + if (collectComments_) { + lastValueEnd_ = current_; + lastValue_ = ¤tValue(); + } + + --stackDepth_; + return successful; +} + +void OurReader::skipCommentTokens(Token& token) { + if (features_.allowComments_) { + do { + readToken(token); + } while (token.type_ == tokenComment); + } else { + readToken(token); + } +} + +bool OurReader::readToken(Token& token) { + skipSpaces(); + token.start_ = current_; + Char c = getNextChar(); + bool ok = true; + switch (c) { + case '{': + token.type_ = tokenObjectBegin; + break; + case '}': + token.type_ = tokenObjectEnd; + break; + case '[': + token.type_ = tokenArrayBegin; + break; + case ']': + token.type_ = tokenArrayEnd; + break; + case '"': + token.type_ = tokenString; + ok = readString(); + break; + case '\'': + if (features_.allowSingleQuotes_) { + token.type_ = tokenString; + ok = readStringSingleQuote(); + break; + } // else continue + case '/': + token.type_ = tokenComment; + ok = readComment(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + token.type_ = tokenNumber; + readNumber(); + break; + case 't': + token.type_ = tokenTrue; + ok = match("rue", 3); + break; + case 'f': + token.type_ = tokenFalse; + ok = match("alse", 4); + break; + case 'n': + token.type_ = tokenNull; + ok = match("ull", 3); + break; + case ',': + token.type_ = tokenArraySeparator; + break; + case ':': + token.type_ = tokenMemberSeparator; + break; + case 0: + token.type_ = tokenEndOfStream; + break; + default: + ok = false; + break; + } + if (!ok) + token.type_ = tokenError; + token.end_ = current_; + return true; +} + +void OurReader::skipSpaces() { + while (current_ != end_) { + Char c = *current_; + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + ++current_; + else + break; + } +} + +bool OurReader::match(Location pattern, int patternLength) { + if (end_ - current_ < patternLength) + return false; + int index = patternLength; + while (index--) + if (current_[index] != pattern[index]) + return false; + current_ += patternLength; + return true; +} + +bool OurReader::readComment() { + Location commentBegin = current_ - 1; + Char c = getNextChar(); + bool successful = false; + if (c == '*') + successful = readCStyleComment(); + else if (c == '/') + successful = readCppStyleComment(); + if (!successful) + return false; + + if (collectComments_) { + CommentPlacement placement = commentBefore; + if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { + if (c != '*' || !containsNewLine(commentBegin, current_)) + placement = commentAfterOnSameLine; + } + + addComment(commentBegin, current_, placement); + } + return true; +} + +void +OurReader::addComment(Location begin, Location end, CommentPlacement placement) { + assert(collectComments_); + const std::string& normalized = normalizeEOL(begin, end); + if (placement == commentAfterOnSameLine) { + assert(lastValue_ != 0); + lastValue_->setComment(normalized, placement); + } else { + commentsBefore_ += normalized; + } +} + +bool OurReader::readCStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '*' && *current_ == '/') + break; + } + return getNextChar() == '/'; +} + +bool OurReader::readCppStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '\n') + break; + if (c == '\r') { + // Consume DOS EOL. It will be normalized in addComment. + if (current_ != end_ && *current_ == '\n') + getNextChar(); + // Break on Moc OS 9 EOL. + break; + } + } + return true; +} + +void OurReader::readNumber() { + const char *p = current_; + char c = '0'; // stopgap for already consumed character + // integral part + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + // fractional part + if (c == '.') { + c = (current_ = p) < end_ ? *p++ : 0; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + } + // exponential part + if (c == 'e' || c == 'E') { + c = (current_ = p) < end_ ? *p++ : 0; + if (c == '+' || c == '-') + c = (current_ = p) < end_ ? *p++ : 0; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + } +} +bool OurReader::readString() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '"') + break; + } + return c == '"'; +} + + +bool OurReader::readStringSingleQuote() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '\'') + break; + } + return c == '\''; +} + +bool OurReader::readObject(Token& /*tokenStart*/) { + Token tokenName; + std::string name; + Value init(objectValue); + currentValue().swapPayload(init); + while (readToken(tokenName)) { + bool initialTokenOk = true; + while (tokenName.type_ == tokenComment && initialTokenOk) + initialTokenOk = readToken(tokenName); + if (!initialTokenOk) + break; + if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object + return true; + name = ""; + if (tokenName.type_ == tokenString) { + if (!decodeString(tokenName, name)) + return recoverFromError(tokenObjectEnd); + } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) { + Value numberName; + if (!decodeNumber(tokenName, numberName)) + return recoverFromError(tokenObjectEnd); + name = numberName.asString(); + } else { + break; + } + + Token colon; + if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { + return addErrorAndRecover( + "Missing ':' after object member name", colon, tokenObjectEnd); + } + if (name.length() >= (1U<<30)) throwRuntimeError("keylength >= 2^30"); + if (features_.rejectDupKeys_ && currentValue().isMember(name)) { + std::string msg = "Duplicate key: '" + name + "'"; + return addErrorAndRecover( + msg, tokenName, tokenObjectEnd); + } + Value& value = currentValue()[name]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenObjectEnd); + + Token comma; + if (!readToken(comma) || + (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && + comma.type_ != tokenComment)) { + return addErrorAndRecover( + "Missing ',' or '}' in object declaration", comma, tokenObjectEnd); + } + bool finalizeTokenOk = true; + while (comma.type_ == tokenComment && finalizeTokenOk) + finalizeTokenOk = readToken(comma); + if (comma.type_ == tokenObjectEnd) + return true; + } + return addErrorAndRecover( + "Missing '}' or object member name", tokenName, tokenObjectEnd); +} + +bool OurReader::readArray(Token& /*tokenStart*/) { + Value init(arrayValue); + currentValue().swapPayload(init); + skipSpaces(); + if (*current_ == ']') // empty array + { + Token endArray; + readToken(endArray); + return true; + } + int index = 0; + for (;;) { + Value& value = currentValue()[index++]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenArrayEnd); + + Token token; + // Accept Comment after last item in the array. + ok = readToken(token); + while (token.type_ == tokenComment && ok) { + ok = readToken(token); + } + bool badTokenType = + (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd); + if (!ok || badTokenType) { + return addErrorAndRecover( + "Missing ',' or ']' in array declaration", token, tokenArrayEnd); + } + if (token.type_ == tokenArrayEnd) + break; + } + return true; +} + +bool OurReader::decodeNumber(Token& token) { + Value decoded; + if (!decodeNumber(token, decoded)) + return false; + currentValue().swapPayload(decoded); + return true; +} + +bool OurReader::decodeNumber(Token& token, Value& decoded) { + // Attempts to parse the number as an integer. If the number is + // larger than the maximum supported value of an integer then + // we decode the number as a double. + Location current = token.start_; + bool isNegative = *current == '-'; + if (isNegative) + ++current; + // TODO: Help the compiler do the div and mod at compile time or get rid of them. + Value::LargestUInt maxIntegerValue = + isNegative ? Value::LargestUInt(-Value::minLargestInt) + : Value::maxLargestUInt; + Value::LargestUInt threshold = maxIntegerValue / 10; + Value::LargestUInt value = 0; + while (current < token.end_) { + Char c = *current++; + if (c < '0' || c > '9') + return decodeDouble(token, decoded); + Value::UInt digit(c - '0'); + if (value >= threshold) { + // We've hit or exceeded the max value divided by 10 (rounded down). If + // a) we've only just touched the limit, b) this is the last digit, and + // c) it's small enough to fit in that rounding delta, we're okay. + // Otherwise treat this number as a double to avoid overflow. + if (value > threshold || current != token.end_ || + digit > maxIntegerValue % 10) { + return decodeDouble(token, decoded); + } + } + value = value * 10 + digit; + } + if (isNegative) + decoded = -Value::LargestInt(value); + else if (value <= Value::LargestUInt(Value::maxInt)) + decoded = Value::LargestInt(value); + else + decoded = value; + return true; +} + +bool OurReader::decodeDouble(Token& token) { + Value decoded; + if (!decodeDouble(token, decoded)) + return false; + currentValue().swapPayload(decoded); + return true; +} + +bool OurReader::decodeDouble(Token& token, Value& decoded) { + double value = 0; + const int bufferSize = 32; + int count; + int length = int(token.end_ - token.start_); + + // Sanity check to avoid buffer overflow exploits. + if (length < 0) { + return addError("Unable to parse token length", token); + } + + // Avoid using a string constant for the format control string given to + // sscanf, as this can cause hard to debug crashes on OS X. See here for more + // info: + // + // http://developer.apple.com/library/mac/#DOCUMENTATION/DeveloperTools/gcc-4.0.1/gcc/Incompatibilities.html + char format[] = "%lf"; + + if (length <= bufferSize) { + Char buffer[bufferSize + 1]; + memcpy(buffer, token.start_, length); + buffer[length] = 0; + count = sscanf(buffer, format, &value); + } else { + std::string buffer(token.start_, token.end_); + count = sscanf(buffer.c_str(), format, &value); + } + + if (count != 1) + return addError("'" + std::string(token.start_, token.end_) + + "' is not a number.", + token); + decoded = value; + return true; +} + +bool OurReader::decodeString(Token& token) { + std::string decoded_string; + if (!decodeString(token, decoded_string)) + return false; + Value decoded(decoded_string); + currentValue().swapPayload(decoded); + return true; +} + +bool OurReader::decodeString(Token& token, std::string& decoded) { + decoded.reserve(token.end_ - token.start_ - 2); + Location current = token.start_ + 1; // skip '"' + Location end = token.end_ - 1; // do not include '"' + while (current != end) { + Char c = *current++; + if (c == '"') + break; + else if (c == '\\') { + if (current == end) + return addError("Empty escape sequence in string", token, current); + Char escape = *current++; + switch (escape) { + case '"': + decoded += '"'; + break; + case '/': + decoded += '/'; + break; + case '\\': + decoded += '\\'; + break; + case 'b': + decoded += '\b'; + break; + case 'f': + decoded += '\f'; + break; + case 'n': + decoded += '\n'; + break; + case 'r': + decoded += '\r'; + break; + case 't': + decoded += '\t'; + break; + case 'u': { + unsigned int unicode; + if (!decodeUnicodeCodePoint(token, current, end, unicode)) + return false; + decoded += codePointToUTF8(unicode); + } break; + default: + return addError("Bad escape sequence in string", token, current); + } + } else { + decoded += c; + } + } + return true; +} + +bool OurReader::decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode) { + + if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) + return false; + if (unicode >= 0xD800 && unicode <= 0xDBFF) { + // surrogate pairs + if (end - current < 6) + return addError( + "additional six characters expected to parse unicode surrogate pair.", + token, + current); + unsigned int surrogatePair; + if (*(current++) == '\\' && *(current++) == 'u') { + if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { + unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); + } else + return false; + } else + return addError("expecting another \\u token to begin the second half of " + "a unicode surrogate pair", + token, + current); + } + return true; +} + +bool OurReader::decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& unicode) { + if (end - current < 4) + return addError( + "Bad unicode escape sequence in string: four digits expected.", + token, + current); + unicode = 0; + for (int index = 0; index < 4; ++index) { + Char c = *current++; + unicode *= 16; + if (c >= '0' && c <= '9') + unicode += c - '0'; + else if (c >= 'a' && c <= 'f') + unicode += c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + unicode += c - 'A' + 10; + else + return addError( + "Bad unicode escape sequence in string: hexadecimal digit expected.", + token, + current); + } + return true; +} + +bool +OurReader::addError(const std::string& message, Token& token, Location extra) { + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = extra; + errors_.push_back(info); + return false; +} + +bool OurReader::recoverFromError(TokenType skipUntilToken) { + int errorCount = int(errors_.size()); + Token skip; + for (;;) { + if (!readToken(skip)) + errors_.resize(errorCount); // discard errors caused by recovery + if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) + break; + } + errors_.resize(errorCount); + return false; +} + +bool OurReader::addErrorAndRecover(const std::string& message, + Token& token, + TokenType skipUntilToken) { + addError(message, token); + return recoverFromError(skipUntilToken); +} + +Value& OurReader::currentValue() { return *(nodes_.top()); } + +OurReader::Char OurReader::getNextChar() { + if (current_ == end_) + return 0; + return *current_++; +} + +void OurReader::getLocationLineAndColumn(Location location, + int& line, + int& column) const { + Location current = begin_; + Location lastLineStart = current; + line = 0; + while (current < location && current != end_) { + Char c = *current++; + if (c == '\r') { + if (*current == '\n') + ++current; + lastLineStart = current; + ++line; + } else if (c == '\n') { + lastLineStart = current; + ++line; + } + } + // column & line start at 1 + column = int(location - lastLineStart) + 1; + ++line; +} + +std::string OurReader::getLocationLineAndColumn(Location location) const { + int line, column; + getLocationLineAndColumn(location, line, column); + char buffer[18 + 16 + 16 + 1]; +#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) +#if defined(WINCE) + _snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); +#else + sprintf_s(buffer, sizeof(buffer), "Line %d, Column %d", line, column); +#endif +#else + snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); +#endif + return buffer; +} + +std::string OurReader::getFormattedErrorMessages() const { + std::string formattedMessage; + for (Errors::const_iterator itError = errors_.begin(); + itError != errors_.end(); + ++itError) { + const ErrorInfo& error = *itError; + formattedMessage += + "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; + formattedMessage += " " + error.message_ + "\n"; + if (error.extra_) + formattedMessage += + "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; + } + return formattedMessage; +} + + +class OurCharReader : public CharReader { + bool const collectComments_; + OurReader reader_; +public: + OurCharReader( + bool collectComments, + OurFeatures const& features) + : collectComments_(collectComments) + , reader_(features) + {} + virtual bool parse( + char const* beginDoc, char const* endDoc, + Value* root, std::string* errs) { + bool ok = reader_.parse(beginDoc, endDoc, *root, collectComments_); + if (errs) { + *errs = reader_.getFormattedErrorMessages(); + } + return ok; + } +}; + +CharReaderBuilder::CharReaderBuilder() +{ + setDefaults(&settings_); +} +CharReaderBuilder::~CharReaderBuilder() +{} +CharReader* CharReaderBuilder::newCharReader() const +{ + bool collectComments = settings_["collectComments"].asBool(); + OurFeatures features = OurFeatures::all(); + features.allowComments_ = settings_["allowComments"].asBool(); + features.strictRoot_ = settings_["strictRoot"].asBool(); + features.allowDroppedNullPlaceholders_ = settings_["allowDroppedNullPlaceholders"].asBool(); + features.allowNumericKeys_ = settings_["allowNumericKeys"].asBool(); + features.allowSingleQuotes_ = settings_["allowSingleQuotes"].asBool(); + features.stackLimit_ = settings_["stackLimit"].asInt(); + features.failIfExtra_ = settings_["failIfExtra"].asBool(); + features.rejectDupKeys_ = settings_["rejectDupKeys"].asBool(); + return new OurCharReader(collectComments, features); +} +static void getValidReaderKeys(std::set* valid_keys) +{ + valid_keys->clear(); + valid_keys->insert("collectComments"); + valid_keys->insert("allowComments"); + valid_keys->insert("strictRoot"); + valid_keys->insert("allowDroppedNullPlaceholders"); + valid_keys->insert("allowNumericKeys"); + valid_keys->insert("allowSingleQuotes"); + valid_keys->insert("stackLimit"); + valid_keys->insert("failIfExtra"); + valid_keys->insert("rejectDupKeys"); +} +bool CharReaderBuilder::validate(Json::Value* invalid) const +{ + Json::Value my_invalid; + if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL + Json::Value& inv = *invalid; + std::set valid_keys; + getValidReaderKeys(&valid_keys); + Value::Members keys = settings_.getMemberNames(); + size_t n = keys.size(); + for (size_t i = 0; i < n; ++i) { + std::string const& key = keys[i]; + if (valid_keys.find(key) == valid_keys.end()) { + inv[key] = settings_[key]; + } + } + return 0u == inv.size(); +} +Value& CharReaderBuilder::operator[](std::string key) +{ + return settings_[key]; +} +// static +void CharReaderBuilder::strictMode(Json::Value* settings) +{ +//! [CharReaderBuilderStrictMode] + (*settings)["allowComments"] = false; + (*settings)["strictRoot"] = true; + (*settings)["allowDroppedNullPlaceholders"] = false; + (*settings)["allowNumericKeys"] = false; + (*settings)["allowSingleQuotes"] = false; + (*settings)["failIfExtra"] = true; + (*settings)["rejectDupKeys"] = true; +//! [CharReaderBuilderStrictMode] +} +// static +void CharReaderBuilder::setDefaults(Json::Value* settings) +{ +//! [CharReaderBuilderDefaults] + (*settings)["collectComments"] = true; + (*settings)["allowComments"] = true; + (*settings)["strictRoot"] = false; + (*settings)["allowDroppedNullPlaceholders"] = false; + (*settings)["allowNumericKeys"] = false; + (*settings)["allowSingleQuotes"] = false; + (*settings)["stackLimit"] = 1000; + (*settings)["failIfExtra"] = false; + (*settings)["rejectDupKeys"] = false; +//! [CharReaderBuilderDefaults] +} + +////////////////////////////////// +// global functions + +bool parseFromStream( + CharReader::Factory const& fact, std::istream& sin, + Value* root, std::string* errs) +{ + std::ostringstream ssin; + ssin << sin.rdbuf(); + std::string doc = ssin.str(); + char const* begin = doc.data(); + char const* end = begin + doc.size(); + // Note that we do not actually need a null-terminator. + CharReaderPtr const reader(fact.newCharReader()); + return reader->parse(begin, end, root, errs); +} + +std::istream& operator>>(std::istream& sin, Value& root) { + CharReaderBuilder b; + std::string errs; + bool ok = parseFromStream(b, sin, &root, &errs); + if (!ok) { + fprintf(stderr, + "Error from reader: %s", + errs.c_str()); + + throwRuntimeError("reader error"); + } + return sin; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_reader.cpp +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_valueiterator.inl +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +// included by json_value.cpp + +namespace Json { + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIteratorBase +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIteratorBase::ValueIteratorBase() + : current_(), isNull_(true) { +} + +ValueIteratorBase::ValueIteratorBase( + const Value::ObjectValues::iterator& current) + : current_(current), isNull_(false) {} + +Value& ValueIteratorBase::deref() const { + return current_->second; +} + +void ValueIteratorBase::increment() { + ++current_; +} + +void ValueIteratorBase::decrement() { + --current_; +} + +ValueIteratorBase::difference_type +ValueIteratorBase::computeDistance(const SelfType& other) const { +#ifdef JSON_USE_CPPTL_SMALLMAP + return other.current_ - current_; +#else + // Iterator for null value are initialized using the default + // constructor, which initialize current_ to the default + // std::map::iterator. As begin() and end() are two instance + // of the default std::map::iterator, they can not be compared. + // To allow this, we handle this comparison specifically. + if (isNull_ && other.isNull_) { + return 0; + } + + // Usage of std::distance is not portable (does not compile with Sun Studio 12 + // RogueWave STL, + // which is the one used by default). + // Using a portable hand-made version for non random iterator instead: + // return difference_type( std::distance( current_, other.current_ ) ); + difference_type myDistance = 0; + for (Value::ObjectValues::iterator it = current_; it != other.current_; + ++it) { + ++myDistance; + } + return myDistance; +#endif +} + +bool ValueIteratorBase::isEqual(const SelfType& other) const { + if (isNull_) { + return other.isNull_; + } + return current_ == other.current_; +} + +void ValueIteratorBase::copy(const SelfType& other) { + current_ = other.current_; + isNull_ = other.isNull_; +} + +Value ValueIteratorBase::key() const { + const Value::CZString czstring = (*current_).first; + if (czstring.data()) { + if (czstring.isStaticString()) + return Value(StaticString(czstring.data())); + return Value(czstring.data(), czstring.data() + czstring.length()); + } + return Value(czstring.index()); +} + +UInt ValueIteratorBase::index() const { + const Value::CZString czstring = (*current_).first; + if (!czstring.data()) + return czstring.index(); + return Value::UInt(-1); +} + +std::string ValueIteratorBase::name() const { + char const* keey; + char const* end; + keey = memberName(&end); + if (!keey) return std::string(); + return std::string(keey, end); +} + +char const* ValueIteratorBase::memberName() const { + const char* cname = (*current_).first.data(); + return cname ? cname : ""; +} + +char const* ValueIteratorBase::memberName(char const** end) const { + const char* cname = (*current_).first.data(); + if (!cname) { + *end = NULL; + return NULL; + } + *end = cname + (*current_).first.length(); + return cname; +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueConstIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueConstIterator::ValueConstIterator() {} + +ValueConstIterator::ValueConstIterator( + const Value::ObjectValues::iterator& current) + : ValueIteratorBase(current) {} + +ValueConstIterator& ValueConstIterator:: +operator=(const ValueIteratorBase& other) { + copy(other); + return *this; +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIterator::ValueIterator() {} + +ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current) + : ValueIteratorBase(current) {} + +ValueIterator::ValueIterator(const ValueConstIterator& other) + : ValueIteratorBase(other) {} + +ValueIterator::ValueIterator(const ValueIterator& other) + : ValueIteratorBase(other) {} + +ValueIterator& ValueIterator::operator=(const SelfType& other) { + copy(other); + return *this; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_valueiterator.inl +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_value.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2011 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#ifdef JSON_USE_CPPTL +#include +#endif +#include // size_t +#include // min() + +#define JSON_ASSERT_UNREACHABLE assert(false) + +namespace Json { + +// This is a walkaround to avoid the static initialization of Value::null. +// kNull must be word-aligned to avoid crashing on ARM. We use an alignment of +// 8 (instead of 4) as a bit of future-proofing. +#if defined(__ARMEL__) +#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) +#else +// This exists for binary compatibility only. Use nullRef. +const Value Value::null; +#define ALIGNAS(byte_alignment) +#endif +static const unsigned char ALIGNAS(8) kNull[sizeof(Value)] = { 0 }; +const unsigned char& kNullRef = kNull[0]; +const Value& Value::nullRef = reinterpret_cast(kNullRef); + +const Int Value::minInt = Int(~(UInt(-1) / 2)); +const Int Value::maxInt = Int(UInt(-1) / 2); +const UInt Value::maxUInt = UInt(-1); +#if defined(JSON_HAS_INT64) +const Int64 Value::minInt64 = Int64(~(UInt64(-1) / 2)); +const Int64 Value::maxInt64 = Int64(UInt64(-1) / 2); +const UInt64 Value::maxUInt64 = UInt64(-1); +// The constant is hard-coded because some compiler have trouble +// converting Value::maxUInt64 to a double correctly (AIX/xlC). +// Assumes that UInt64 is a 64 bits integer. +static const double maxUInt64AsDouble = 18446744073709551615.0; +#endif // defined(JSON_HAS_INT64) +const LargestInt Value::minLargestInt = LargestInt(~(LargestUInt(-1) / 2)); +const LargestInt Value::maxLargestInt = LargestInt(LargestUInt(-1) / 2); +const LargestUInt Value::maxLargestUInt = LargestUInt(-1); + +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) +template +static inline bool InRange(double d, T min, U max) { + return d >= min && d <= max; +} +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) +static inline double integerToDouble(Json::UInt64 value) { + return static_cast(Int64(value / 2)) * 2.0 + Int64(value & 1); +} + +template static inline double integerToDouble(T value) { + return static_cast(value); +} + +template +static inline bool InRange(double d, T min, U max) { + return d >= integerToDouble(min) && d <= integerToDouble(max); +} +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + +/** Duplicates the specified string value. + * @param value Pointer to the string to duplicate. Must be zero-terminated if + * length is "unknown". + * @param length Length of the value. if equals to unknown, then it will be + * computed using strlen(value). + * @return Pointer on the duplicate instance of string. + */ +static inline char* duplicateStringValue(const char* value, + size_t length) { + // Avoid an integer overflow in the call to malloc below by limiting length + // to a sane value. + if (length >= (size_t)Value::maxInt) + length = Value::maxInt - 1; + + char* newString = static_cast(malloc(length + 1)); + if (newString == NULL) { + throwRuntimeError( + "in Json::Value::duplicateStringValue(): " + "Failed to allocate string value buffer"); + } + memcpy(newString, value, length); + newString[length] = 0; + return newString; +} + +/* Record the length as a prefix. + */ +static inline char* duplicateAndPrefixStringValue( + const char* value, + unsigned int length) +{ + // Avoid an integer overflow in the call to malloc below by limiting length + // to a sane value. + JSON_ASSERT_MESSAGE(length <= (unsigned)Value::maxInt - sizeof(unsigned) - 1U, + "in Json::Value::duplicateAndPrefixStringValue(): " + "length too big for prefixing"); + unsigned actualLength = length + static_cast(sizeof(unsigned)) + 1U; + char* newString = static_cast(malloc(actualLength)); + if (newString == 0) { + throwRuntimeError( + "in Json::Value::duplicateAndPrefixStringValue(): " + "Failed to allocate string value buffer"); + } + *reinterpret_cast(newString) = length; + memcpy(newString + sizeof(unsigned), value, length); + newString[actualLength - 1U] = 0; // to avoid buffer over-run accidents by users later + return newString; +} +inline static void decodePrefixedString( + bool isPrefixed, char const* prefixed, + unsigned* length, char const** value) +{ + if (!isPrefixed) { + *length = static_cast(strlen(prefixed)); + *value = prefixed; + } else { + *length = *reinterpret_cast(prefixed); + *value = prefixed + sizeof(unsigned); + } +} +/** Free the string duplicated by duplicateStringValue()/duplicateAndPrefixStringValue(). + */ +static inline void releaseStringValue(char* value) { free(value); } + +} // namespace Json + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ValueInternals... +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +#if !defined(JSON_IS_AMALGAMATION) + +#include "json_valueiterator.inl" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +Exception::Exception(std::string const& msg) + : msg_(msg) +{} +Exception::~Exception() throw() +{} +char const* Exception::what() const throw() +{ + return msg_.c_str(); +} +RuntimeError::RuntimeError(std::string const& msg) + : Exception(msg) +{} +LogicError::LogicError(std::string const& msg) + : Exception(msg) +{} +void throwRuntimeError(std::string const& msg) +{ + throw RuntimeError(msg); +} +void throwLogicError(std::string const& msg) +{ + throw LogicError(msg); +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CommentInfo +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +Value::CommentInfo::CommentInfo() : comment_(0) {} + +Value::CommentInfo::~CommentInfo() { + if (comment_) + releaseStringValue(comment_); +} + +void Value::CommentInfo::setComment(const char* text, size_t len) { + if (comment_) { + releaseStringValue(comment_); + comment_ = 0; + } + JSON_ASSERT(text != 0); + JSON_ASSERT_MESSAGE( + text[0] == '\0' || text[0] == '/', + "in Json::Value::setComment(): Comments must start with /"); + // It seems that /**/ style comments are acceptable as well. + comment_ = duplicateStringValue(text, len); +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CZString +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +// Notes: policy_ indicates if the string was allocated when +// a string is stored. + +Value::CZString::CZString(ArrayIndex aindex) : cstr_(0), index_(aindex) {} + +Value::CZString::CZString(char const* str, unsigned ulength, DuplicationPolicy allocate) + : cstr_(str) +{ + // allocate != duplicate + storage_.policy_ = allocate & 0x3; + storage_.length_ = ulength & 0x3FFFFFFF; +} + +Value::CZString::CZString(const CZString& other) + : cstr_(other.storage_.policy_ != noDuplication && other.cstr_ != 0 + ? duplicateStringValue(other.cstr_, other.storage_.length_) + : other.cstr_) +{ + storage_.policy_ = (other.cstr_ + ? (static_cast(other.storage_.policy_) == noDuplication + ? noDuplication : duplicate) + : static_cast(other.storage_.policy_)); + storage_.length_ = other.storage_.length_; +} + +Value::CZString::~CZString() { + if (cstr_ && storage_.policy_ == duplicate) + releaseStringValue(const_cast(cstr_)); +} + +void Value::CZString::swap(CZString& other) { + std::swap(cstr_, other.cstr_); + std::swap(index_, other.index_); +} + +Value::CZString& Value::CZString::operator=(CZString other) { + swap(other); + return *this; +} + +bool Value::CZString::operator<(const CZString& other) const { + if (!cstr_) return index_ < other.index_; + //return strcmp(cstr_, other.cstr_) < 0; + // Assume both are strings. + unsigned this_len = this->storage_.length_; + unsigned other_len = other.storage_.length_; + unsigned min_len = std::min(this_len, other_len); + int comp = memcmp(this->cstr_, other.cstr_, min_len); + if (comp < 0) return true; + if (comp > 0) return false; + return (this_len < other_len); +} + +bool Value::CZString::operator==(const CZString& other) const { + if (!cstr_) return index_ == other.index_; + //return strcmp(cstr_, other.cstr_) == 0; + // Assume both are strings. + unsigned this_len = this->storage_.length_; + unsigned other_len = other.storage_.length_; + if (this_len != other_len) return false; + int comp = memcmp(this->cstr_, other.cstr_, this_len); + return comp == 0; +} + +ArrayIndex Value::CZString::index() const { return index_; } + +//const char* Value::CZString::c_str() const { return cstr_; } +const char* Value::CZString::data() const { return cstr_; } +unsigned Value::CZString::length() const { return storage_.length_; } +bool Value::CZString::isStaticString() const { return storage_.policy_ == noDuplication; } + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::Value +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +/*! \internal Default constructor initialization must be equivalent to: + * memset( this, 0, sizeof(Value) ) + * This optimization is used in ValueInternalMap fast allocator. + */ +Value::Value(ValueType vtype) { + initBasic(vtype); + switch (vtype) { + case nullValue: + break; + case intValue: + case uintValue: + value_.int_ = 0; + break; + case realValue: + value_.real_ = 0.0; + break; + case stringValue: + value_.string_ = 0; + break; + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(); + break; + case booleanValue: + value_.bool_ = false; + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + +Value::Value(Int value) { + initBasic(intValue); + value_.int_ = value; +} + +Value::Value(UInt value) { + initBasic(uintValue); + value_.uint_ = value; +} +#if defined(JSON_HAS_INT64) +Value::Value(Int64 value) { + initBasic(intValue); + value_.int_ = value; +} +Value::Value(UInt64 value) { + initBasic(uintValue); + value_.uint_ = value; +} +#endif // defined(JSON_HAS_INT64) + +Value::Value(double value) { + initBasic(realValue); + value_.real_ = value; +} + +Value::Value(const char* value) { + initBasic(stringValue, true); + value_.string_ = duplicateAndPrefixStringValue(value, static_cast(strlen(value))); +} + +Value::Value(const char* beginValue, const char* endValue) { + initBasic(stringValue, true); + value_.string_ = + duplicateAndPrefixStringValue(beginValue, static_cast(endValue - beginValue)); +} + +Value::Value(const std::string& value) { + initBasic(stringValue, true); + value_.string_ = + duplicateAndPrefixStringValue(value.data(), static_cast(value.length())); +} + +Value::Value(const StaticString& value) { + initBasic(stringValue); + value_.string_ = const_cast(value.c_str()); +} + +#ifdef JSON_USE_CPPTL +Value::Value(const CppTL::ConstString& value) { + initBasic(stringValue, true); + value_.string_ = duplicateAndPrefixStringValue(value, static_cast(value.length())); +} +#endif + +Value::Value(bool value) { + initBasic(booleanValue); + value_.bool_ = value; +} + +Value::Value(Value const& other) + : type_(other.type_), allocated_(false) + , + comments_(0) +{ + switch (type_) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + value_ = other.value_; + break; + case stringValue: + if (other.value_.string_ && other.allocated_) { + unsigned len; + char const* str; + decodePrefixedString(other.allocated_, other.value_.string_, + &len, &str); + value_.string_ = duplicateAndPrefixStringValue(str, len); + allocated_ = true; + } else { + value_.string_ = other.value_.string_; + allocated_ = false; + } + break; + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(*other.value_.map_); + break; + default: + JSON_ASSERT_UNREACHABLE; + } + if (other.comments_) { + comments_ = new CommentInfo[numberOfCommentPlacement]; + for (int comment = 0; comment < numberOfCommentPlacement; ++comment) { + const CommentInfo& otherComment = other.comments_[comment]; + if (otherComment.comment_) + comments_[comment].setComment( + otherComment.comment_, strlen(otherComment.comment_)); + } + } +} + +Value::~Value() { + switch (type_) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + break; + case stringValue: + if (allocated_) + releaseStringValue(value_.string_); + break; + case arrayValue: + case objectValue: + delete value_.map_; + break; + default: + JSON_ASSERT_UNREACHABLE; + } + + if (comments_) + delete[] comments_; +} + +Value &Value::operator=(const Value &other) { + Value temp(other); + swap(temp); + return *this; +} + +void Value::swapPayload(Value& other) { + ValueType temp = type_; + type_ = other.type_; + other.type_ = temp; + std::swap(value_, other.value_); + int temp2 = allocated_; + allocated_ = other.allocated_; + other.allocated_ = temp2 & 0x1; +} + +void Value::swap(Value& other) { + swapPayload(other); + std::swap(comments_, other.comments_); +} + +ValueType Value::type() const { return type_; } + +int Value::compare(const Value& other) const { + if (*this < other) + return -1; + if (*this > other) + return 1; + return 0; +} + +bool Value::operator<(const Value& other) const { + int typeDelta = type_ - other.type_; + if (typeDelta) + return typeDelta < 0 ? true : false; + switch (type_) { + case nullValue: + return false; + case intValue: + return value_.int_ < other.value_.int_; + case uintValue: + return value_.uint_ < other.value_.uint_; + case realValue: + return value_.real_ < other.value_.real_; + case booleanValue: + return value_.bool_ < other.value_.bool_; + case stringValue: + { + if ((value_.string_ == 0) || (other.value_.string_ == 0)) { + if (other.value_.string_) return true; + else return false; + } + unsigned this_len; + unsigned other_len; + char const* this_str; + char const* other_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str); + unsigned min_len = std::min(this_len, other_len); + int comp = memcmp(this_str, other_str, min_len); + if (comp < 0) return true; + if (comp > 0) return false; + return (this_len < other_len); + } + case arrayValue: + case objectValue: { + int delta = int(value_.map_->size() - other.value_.map_->size()); + if (delta) + return delta < 0; + return (*value_.map_) < (*other.value_.map_); + } + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable +} + +bool Value::operator<=(const Value& other) const { return !(other < *this); } + +bool Value::operator>=(const Value& other) const { return !(*this < other); } + +bool Value::operator>(const Value& other) const { return other < *this; } + +bool Value::operator==(const Value& other) const { + // if ( type_ != other.type_ ) + // GCC 2.95.3 says: + // attempt to take address of bit-field structure member `Json::Value::type_' + // Beats me, but a temp solves the problem. + int temp = other.type_; + if (type_ != temp) + return false; + switch (type_) { + case nullValue: + return true; + case intValue: + return value_.int_ == other.value_.int_; + case uintValue: + return value_.uint_ == other.value_.uint_; + case realValue: + return value_.real_ == other.value_.real_; + case booleanValue: + return value_.bool_ == other.value_.bool_; + case stringValue: + { + if ((value_.string_ == 0) || (other.value_.string_ == 0)) { + return (value_.string_ == other.value_.string_); + } + unsigned this_len; + unsigned other_len; + char const* this_str; + char const* other_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str); + if (this_len != other_len) return false; + int comp = memcmp(this_str, other_str, this_len); + return comp == 0; + } + case arrayValue: + case objectValue: + return value_.map_->size() == other.value_.map_->size() && + (*value_.map_) == (*other.value_.map_); + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable +} + +bool Value::operator!=(const Value& other) const { return !(*this == other); } + +const char* Value::asCString() const { + JSON_ASSERT_MESSAGE(type_ == stringValue, + "in Json::Value::asCString(): requires stringValue"); + if (value_.string_ == 0) return 0; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + return this_str; +} + +bool Value::getString(char const** str, char const** cend) const { + if (type_ != stringValue) return false; + if (value_.string_ == 0) return false; + unsigned length; + decodePrefixedString(this->allocated_, this->value_.string_, &length, str); + *cend = *str + length; + return true; +} + +std::string Value::asString() const { + switch (type_) { + case nullValue: + return ""; + case stringValue: + { + if (value_.string_ == 0) return ""; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + return std::string(this_str, this_len); + } + case booleanValue: + return value_.bool_ ? "true" : "false"; + case intValue: + return valueToString(value_.int_); + case uintValue: + return valueToString(value_.uint_); + case realValue: + return valueToString(value_.real_); + default: + JSON_FAIL_MESSAGE("Type is not convertible to string"); + } +} + +#ifdef JSON_USE_CPPTL +CppTL::ConstString Value::asConstString() const { + unsigned len; + char const* str; + decodePrefixedString(allocated_, value_.string_, + &len, &str); + return CppTL::ConstString(str, len); +} +#endif + +Value::Int Value::asInt() const { + switch (type_) { + case intValue: + JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range"); + return Int(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isInt(), "LargestUInt out of Int range"); + return Int(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt, maxInt), + "double out of Int range"); + return Int(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to Int."); +} + +Value::UInt Value::asUInt() const { + switch (type_) { + case intValue: + JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range"); + return UInt(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isUInt(), "LargestUInt out of UInt range"); + return UInt(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt), + "double out of UInt range"); + return UInt(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to UInt."); +} + +#if defined(JSON_HAS_INT64) + +Value::Int64 Value::asInt64() const { + switch (type_) { + case intValue: + return Int64(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isInt64(), "LargestUInt out of Int64 range"); + return Int64(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt64, maxInt64), + "double out of Int64 range"); + return Int64(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to Int64."); +} + +Value::UInt64 Value::asUInt64() const { + switch (type_) { + case intValue: + JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range"); + return UInt64(value_.int_); + case uintValue: + return UInt64(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt64), + "double out of UInt64 range"); + return UInt64(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to UInt64."); +} +#endif // if defined(JSON_HAS_INT64) + +LargestInt Value::asLargestInt() const { +#if defined(JSON_NO_INT64) + return asInt(); +#else + return asInt64(); +#endif +} + +LargestUInt Value::asLargestUInt() const { +#if defined(JSON_NO_INT64) + return asUInt(); +#else + return asUInt64(); +#endif +} + +double Value::asDouble() const { + switch (type_) { + case intValue: + return static_cast(value_.int_); + case uintValue: +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return static_cast(value_.uint_); +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return integerToDouble(value_.uint_); +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + case realValue: + return value_.real_; + case nullValue: + return 0.0; + case booleanValue: + return value_.bool_ ? 1.0 : 0.0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to double."); +} + +float Value::asFloat() const { + switch (type_) { + case intValue: + return static_cast(value_.int_); + case uintValue: +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return static_cast(value_.uint_); +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return integerToDouble(value_.uint_); +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + case realValue: + return static_cast(value_.real_); + case nullValue: + return 0.0; + case booleanValue: + return value_.bool_ ? 1.0f : 0.0f; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to float."); +} + +bool Value::asBool() const { + switch (type_) { + case booleanValue: + return value_.bool_; + case nullValue: + return false; + case intValue: + return value_.int_ ? true : false; + case uintValue: + return value_.uint_ ? true : false; + case realValue: + // This is kind of strange. Not recommended. + return (value_.real_ != 0.0) ? true : false; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to bool."); +} + +bool Value::isConvertibleTo(ValueType other) const { + switch (other) { + case nullValue: + return (isNumeric() && asDouble() == 0.0) || + (type_ == booleanValue && value_.bool_ == false) || + (type_ == stringValue && asString() == "") || + (type_ == arrayValue && value_.map_->size() == 0) || + (type_ == objectValue && value_.map_->size() == 0) || + type_ == nullValue; + case intValue: + return isInt() || + (type_ == realValue && InRange(value_.real_, minInt, maxInt)) || + type_ == booleanValue || type_ == nullValue; + case uintValue: + return isUInt() || + (type_ == realValue && InRange(value_.real_, 0, maxUInt)) || + type_ == booleanValue || type_ == nullValue; + case realValue: + return isNumeric() || type_ == booleanValue || type_ == nullValue; + case booleanValue: + return isNumeric() || type_ == booleanValue || type_ == nullValue; + case stringValue: + return isNumeric() || type_ == booleanValue || type_ == stringValue || + type_ == nullValue; + case arrayValue: + return type_ == arrayValue || type_ == nullValue; + case objectValue: + return type_ == objectValue || type_ == nullValue; + } + JSON_ASSERT_UNREACHABLE; + return false; +} + +/// Number of values in array or object +ArrayIndex Value::size() const { + switch (type_) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + case stringValue: + return 0; + case arrayValue: // size of the array is highest index + 1 + if (!value_.map_->empty()) { + ObjectValues::const_iterator itLast = value_.map_->end(); + --itLast; + return (*itLast).first.index() + 1; + } + return 0; + case objectValue: + return ArrayIndex(value_.map_->size()); + } + JSON_ASSERT_UNREACHABLE; + return 0; // unreachable; +} + +bool Value::empty() const { + if (isNull() || isArray() || isObject()) + return size() == 0u; + else + return false; +} + +bool Value::operator!() const { return isNull(); } + +void Value::clear() { + JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue || + type_ == objectValue, + "in Json::Value::clear(): requires complex value"); + switch (type_) { + case arrayValue: + case objectValue: + value_.map_->clear(); + break; + default: + break; + } +} + +void Value::resize(ArrayIndex newSize) { + JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue, + "in Json::Value::resize(): requires arrayValue"); + if (type_ == nullValue) + *this = Value(arrayValue); + ArrayIndex oldSize = size(); + if (newSize == 0) + clear(); + else if (newSize > oldSize) + (*this)[newSize - 1]; + else { + for (ArrayIndex index = newSize; index < oldSize; ++index) { + value_.map_->erase(index); + } + assert(size() == newSize); + } +} + +Value& Value::operator[](ArrayIndex index) { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == arrayValue, + "in Json::Value::operator[](ArrayIndex): requires arrayValue"); + if (type_ == nullValue) + *this = Value(arrayValue); + CZString key(index); + ObjectValues::iterator it = value_.map_->lower_bound(key); + if (it != value_.map_->end() && (*it).first == key) + return (*it).second; + + ObjectValues::value_type defaultValue(key, nullRef); + it = value_.map_->insert(it, defaultValue); + return (*it).second; +} + +Value& Value::operator[](int index) { + JSON_ASSERT_MESSAGE( + index >= 0, + "in Json::Value::operator[](int index): index cannot be negative"); + return (*this)[ArrayIndex(index)]; +} + +const Value& Value::operator[](ArrayIndex index) const { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == arrayValue, + "in Json::Value::operator[](ArrayIndex)const: requires arrayValue"); + if (type_ == nullValue) + return nullRef; + CZString key(index); + ObjectValues::const_iterator it = value_.map_->find(key); + if (it == value_.map_->end()) + return nullRef; + return (*it).second; +} + +const Value& Value::operator[](int index) const { + JSON_ASSERT_MESSAGE( + index >= 0, + "in Json::Value::operator[](int index) const: index cannot be negative"); + return (*this)[ArrayIndex(index)]; +} + +void Value::initBasic(ValueType vtype, bool allocated) { + type_ = vtype; + allocated_ = allocated; + comments_ = 0; +} + +// Access an object value by name, create a null member if it does not exist. +// @pre Type of '*this' is object or null. +// @param key is null-terminated. +Value& Value::resolveReference(const char* key) { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::resolveReference(): requires objectValue"); + if (type_ == nullValue) + *this = Value(objectValue); + CZString actualKey( + key, static_cast(strlen(key)), CZString::noDuplication); // NOTE! + ObjectValues::iterator it = value_.map_->lower_bound(actualKey); + if (it != value_.map_->end() && (*it).first == actualKey) + return (*it).second; + + ObjectValues::value_type defaultValue(actualKey, nullRef); + it = value_.map_->insert(it, defaultValue); + Value& value = (*it).second; + return value; +} + +// @param key is not null-terminated. +Value& Value::resolveReference(char const* key, char const* cend) +{ + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::resolveReference(key, end): requires objectValue"); + if (type_ == nullValue) + *this = Value(objectValue); + CZString actualKey( + key, static_cast(cend-key), CZString::duplicateOnCopy); + ObjectValues::iterator it = value_.map_->lower_bound(actualKey); + if (it != value_.map_->end() && (*it).first == actualKey) + return (*it).second; + + ObjectValues::value_type defaultValue(actualKey, nullRef); + it = value_.map_->insert(it, defaultValue); + Value& value = (*it).second; + return value; +} + +Value Value::get(ArrayIndex index, const Value& defaultValue) const { + const Value* value = &((*this)[index]); + return value == &nullRef ? defaultValue : *value; +} + +bool Value::isValidIndex(ArrayIndex index) const { return index < size(); } + +Value const* Value::find(char const* key, char const* cend) const +{ + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::find(key, end, found): requires objectValue or nullValue"); + if (type_ == nullValue) return NULL; + CZString actualKey(key, static_cast(cend-key), CZString::noDuplication); + ObjectValues::const_iterator it = value_.map_->find(actualKey); + if (it == value_.map_->end()) return NULL; + return &(*it).second; +} +const Value& Value::operator[](const char* key) const +{ + Value const* found = find(key, key + strlen(key)); + if (!found) return nullRef; + return *found; +} +Value const& Value::operator[](std::string const& key) const +{ + Value const* found = find(key.data(), key.data() + key.length()); + if (!found) return nullRef; + return *found; +} + +Value& Value::operator[](const char* key) { + return resolveReference(key, key + strlen(key)); +} + +Value& Value::operator[](const std::string& key) { + return resolveReference(key.data(), key.data() + key.length()); +} + +Value& Value::operator[](const StaticString& key) { + return resolveReference(key.c_str()); +} + +#ifdef JSON_USE_CPPTL +Value& Value::operator[](const CppTL::ConstString& key) { + return resolveReference(key.c_str(), key.end_c_str()); +} +Value const& Value::operator[](CppTL::ConstString const& key) const +{ + Value const* found = find(key.c_str(), key.end_c_str()); + if (!found) return nullRef; + return *found; +} +#endif + +Value& Value::append(const Value& value) { return (*this)[size()] = value; } + +Value Value::get(char const* key, char const* cend, Value const& defaultValue) const +{ + Value const* found = find(key, cend); + return !found ? defaultValue : *found; +} +Value Value::get(char const* key, Value const& defaultValue) const +{ + return get(key, key + strlen(key), defaultValue); +} +Value Value::get(std::string const& key, Value const& defaultValue) const +{ + return get(key.data(), key.data() + key.length(), defaultValue); +} + + +bool Value::removeMember(const char* key, const char* cend, Value* removed) +{ + if (type_ != objectValue) { + return false; + } + CZString actualKey(key, static_cast(cend-key), CZString::noDuplication); + ObjectValues::iterator it = value_.map_->find(actualKey); + if (it == value_.map_->end()) + return false; + *removed = it->second; + value_.map_->erase(it); + return true; +} +bool Value::removeMember(const char* key, Value* removed) +{ + return removeMember(key, key + strlen(key), removed); +} +bool Value::removeMember(std::string const& key, Value* removed) +{ + return removeMember(key.data(), key.data() + key.length(), removed); +} +Value Value::removeMember(const char* key) +{ + JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == objectValue, + "in Json::Value::removeMember(): requires objectValue"); + if (type_ == nullValue) + return nullRef; + + Value removed; // null + removeMember(key, key + strlen(key), &removed); + return removed; // still null if removeMember() did nothing +} +Value Value::removeMember(const std::string& key) +{ + return removeMember(key.c_str()); +} + +bool Value::removeIndex(ArrayIndex index, Value* removed) { + if (type_ != arrayValue) { + return false; + } + CZString key(index); + ObjectValues::iterator it = value_.map_->find(key); + if (it == value_.map_->end()) { + return false; + } + *removed = it->second; + ArrayIndex oldSize = size(); + // shift left all items left, into the place of the "removed" + for (ArrayIndex i = index; i < (oldSize - 1); ++i){ + CZString keey(i); + (*value_.map_)[keey] = (*this)[i + 1]; + } + // erase the last one ("leftover") + CZString keyLast(oldSize - 1); + ObjectValues::iterator itLast = value_.map_->find(keyLast); + value_.map_->erase(itLast); + return true; +} + +#ifdef JSON_USE_CPPTL +Value Value::get(const CppTL::ConstString& key, + const Value& defaultValue) const { + return get(key.c_str(), key.end_c_str(), defaultValue); +} +#endif + +bool Value::isMember(char const* key, char const* cend) const +{ + Value const* value = find(key, cend); + return NULL != value; +} +bool Value::isMember(char const* key) const +{ + return isMember(key, key + strlen(key)); +} +bool Value::isMember(std::string const& key) const +{ + return isMember(key.data(), key.data() + key.length()); +} + +#ifdef JSON_USE_CPPTL +bool Value::isMember(const CppTL::ConstString& key) const { + return isMember(key.c_str(), key.end_c_str()); +} +#endif + +Value::Members Value::getMemberNames() const { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::getMemberNames(), value must be objectValue"); + if (type_ == nullValue) + return Value::Members(); + Members members; + members.reserve(value_.map_->size()); + ObjectValues::const_iterator it = value_.map_->begin(); + ObjectValues::const_iterator itEnd = value_.map_->end(); + for (; it != itEnd; ++it) { + members.push_back(std::string((*it).first.data(), + (*it).first.length())); + } + return members; +} +// +//# ifdef JSON_USE_CPPTL +// EnumMemberNames +// Value::enumMemberNames() const +//{ +// if ( type_ == objectValue ) +// { +// return CppTL::Enum::any( CppTL::Enum::transform( +// CppTL::Enum::keys( *(value_.map_), CppTL::Type() ), +// MemberNamesTransform() ) ); +// } +// return EnumMemberNames(); +//} +// +// +// EnumValues +// Value::enumValues() const +//{ +// if ( type_ == objectValue || type_ == arrayValue ) +// return CppTL::Enum::anyValues( *(value_.map_), +// CppTL::Type() ); +// return EnumValues(); +//} +// +//# endif + +static bool IsIntegral(double d) { + double integral_part; + return modf(d, &integral_part) == 0.0; +} + +bool Value::isNull() const { return type_ == nullValue; } + +bool Value::isBool() const { return type_ == booleanValue; } + +bool Value::isInt() const { + switch (type_) { + case intValue: + return value_.int_ >= minInt && value_.int_ <= maxInt; + case uintValue: + return value_.uint_ <= UInt(maxInt); + case realValue: + return value_.real_ >= minInt && value_.real_ <= maxInt && + IsIntegral(value_.real_); + default: + break; + } + return false; +} + +bool Value::isUInt() const { + switch (type_) { + case intValue: + return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt); + case uintValue: + return value_.uint_ <= maxUInt; + case realValue: + return value_.real_ >= 0 && value_.real_ <= maxUInt && + IsIntegral(value_.real_); + default: + break; + } + return false; +} + +bool Value::isInt64() const { +#if defined(JSON_HAS_INT64) + switch (type_) { + case intValue: + return true; + case uintValue: + return value_.uint_ <= UInt64(maxInt64); + case realValue: + // Note that maxInt64 (= 2^63 - 1) is not exactly representable as a + // double, so double(maxInt64) will be rounded up to 2^63. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= double(minInt64) && + value_.real_ < double(maxInt64) && IsIntegral(value_.real_); + default: + break; + } +#endif // JSON_HAS_INT64 + return false; +} + +bool Value::isUInt64() const { +#if defined(JSON_HAS_INT64) + switch (type_) { + case intValue: + return value_.int_ >= 0; + case uintValue: + return true; + case realValue: + // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a + // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= 0 && value_.real_ < maxUInt64AsDouble && + IsIntegral(value_.real_); + default: + break; + } +#endif // JSON_HAS_INT64 + return false; +} + +bool Value::isIntegral() const { +#if defined(JSON_HAS_INT64) + return isInt64() || isUInt64(); +#else + return isInt() || isUInt(); +#endif +} + +bool Value::isDouble() const { return type_ == realValue || isIntegral(); } + +bool Value::isNumeric() const { return isIntegral() || isDouble(); } + +bool Value::isString() const { return type_ == stringValue; } + +bool Value::isArray() const { return type_ == arrayValue; } + +bool Value::isObject() const { return type_ == objectValue; } + +void Value::setComment(const char* comment, size_t len, CommentPlacement placement) { + if (!comments_) + comments_ = new CommentInfo[numberOfCommentPlacement]; + if ((len > 0) && (comment[len-1] == '\n')) { + // Always discard trailing newline, to aid indentation. + len -= 1; + } + comments_[placement].setComment(comment, len); +} + +void Value::setComment(const char* comment, CommentPlacement placement) { + setComment(comment, strlen(comment), placement); +} + +void Value::setComment(const std::string& comment, CommentPlacement placement) { + setComment(comment.c_str(), comment.length(), placement); +} + +bool Value::hasComment(CommentPlacement placement) const { + return comments_ != 0 && comments_[placement].comment_ != 0; +} + +std::string Value::getComment(CommentPlacement placement) const { + if (hasComment(placement)) + return comments_[placement].comment_; + return ""; +} + +std::string Value::toStyledString() const { + StyledWriter writer; + return writer.write(*this); +} + +Value::const_iterator Value::begin() const { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return const_iterator(value_.map_->begin()); + break; + default: + break; + } + return const_iterator(); +} + +Value::const_iterator Value::end() const { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return const_iterator(value_.map_->end()); + break; + default: + break; + } + return const_iterator(); +} + +Value::iterator Value::begin() { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return iterator(value_.map_->begin()); + break; + default: + break; + } + return iterator(); +} + +Value::iterator Value::end() { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return iterator(value_.map_->end()); + break; + default: + break; + } + return iterator(); +} + +// class PathArgument +// ////////////////////////////////////////////////////////////////// + +PathArgument::PathArgument() : key_(), index_(), kind_(kindNone) {} + +PathArgument::PathArgument(ArrayIndex index) + : key_(), index_(index), kind_(kindIndex) {} + +PathArgument::PathArgument(const char* key) + : key_(key), index_(), kind_(kindKey) {} + +PathArgument::PathArgument(const std::string& key) + : key_(key.c_str()), index_(), kind_(kindKey) {} + +// class Path +// ////////////////////////////////////////////////////////////////// + +Path::Path(const std::string& path, + const PathArgument& a1, + const PathArgument& a2, + const PathArgument& a3, + const PathArgument& a4, + const PathArgument& a5) { + InArgs in; + in.push_back(&a1); + in.push_back(&a2); + in.push_back(&a3); + in.push_back(&a4); + in.push_back(&a5); + makePath(path, in); +} + +void Path::makePath(const std::string& path, const InArgs& in) { + const char* current = path.c_str(); + const char* end = current + path.length(); + InArgs::const_iterator itInArg = in.begin(); + while (current != end) { + if (*current == '[') { + ++current; + if (*current == '%') + addPathInArg(path, in, itInArg, PathArgument::kindIndex); + else { + ArrayIndex index = 0; + for (; current != end && *current >= '0' && *current <= '9'; ++current) + index = index * 10 + ArrayIndex(*current - '0'); + args_.push_back(index); + } + if (current == end || *current++ != ']') + invalidPath(path, int(current - path.c_str())); + } else if (*current == '%') { + addPathInArg(path, in, itInArg, PathArgument::kindKey); + ++current; + } else if (*current == '.') { + ++current; + } else { + const char* beginName = current; + while (current != end && !strchr("[.", *current)) + ++current; + args_.push_back(std::string(beginName, current)); + } + } +} + +void Path::addPathInArg(const std::string& /*path*/, + const InArgs& in, + InArgs::const_iterator& itInArg, + PathArgument::Kind kind) { + if (itInArg == in.end()) { + // Error: missing argument %d + } else if ((*itInArg)->kind_ != kind) { + // Error: bad argument type + } else { + args_.push_back(**itInArg); + } +} + +void Path::invalidPath(const std::string& /*path*/, int /*location*/) { + // Error: invalid path. +} + +const Value& Path::resolve(const Value& root) const { + const Value* node = &root; + for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { + const PathArgument& arg = *it; + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray() || !node->isValidIndex(arg.index_)) { + // Error: unable to resolve path (array value expected at position... + } + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) { + // Error: unable to resolve path (object value expected at position...) + } + node = &((*node)[arg.key_]); + if (node == &Value::nullRef) { + // Error: unable to resolve path (object has no member named '' at + // position...) + } + } + } + return *node; +} + +Value Path::resolve(const Value& root, const Value& defaultValue) const { + const Value* node = &root; + for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { + const PathArgument& arg = *it; + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray() || !node->isValidIndex(arg.index_)) + return defaultValue; + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) + return defaultValue; + node = &((*node)[arg.key_]); + if (node == &Value::nullRef) + return defaultValue; + } + } + return *node; +} + +Value& Path::make(Value& root) const { + Value* node = &root; + for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { + const PathArgument& arg = *it; + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray()) { + // Error: node is not an array at position ... + } + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) { + // Error: node is not an object at position... + } + node = &((*node)[arg.key_]); + } + } + return *node; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_value.cpp +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_writer.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2011 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include +#include "json_tool.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) && _MSC_VER >= 1200 && _MSC_VER < 1800 // Between VC++ 6.0 and VC++ 11.0 +#include +#define isfinite _finite +#elif defined(__sun) && defined(__SVR4) //Solaris +#include +#define isfinite finite +#else +#include +#define isfinite std::isfinite +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1500 // VC++ 8.0 and below +#define snprintf _snprintf +#elif defined(__ANDROID__) +#define snprintf snprintf +#elif __cplusplus >= 201103L +#define snprintf std::snprintf +#endif + +#if defined(__BORLANDC__) +#include +#define isfinite _finite +#define snprintf _snprintf +#endif + +#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 +// Disable warning about strdup being deprecated. +#pragma warning(disable : 4996) +#endif + +namespace Json { + +typedef std::auto_ptr StreamWriterPtr; + +static bool containsControlCharacter(const char* str) { + while (*str) { + if (isControlCharacter(*(str++))) + return true; + } + return false; +} + +static bool containsControlCharacter0(const char* str, unsigned len) { + char const* end = str + len; + while (end != str) { + if (isControlCharacter(*str) || 0==*str) + return true; + ++str; + } + return false; +} + +std::string valueToString(LargestInt value) { + UIntToStringBuffer buffer; + char* current = buffer + sizeof(buffer); + bool isNegative = value < 0; + if (isNegative) + value = -value; + uintToString(LargestUInt(value), current); + if (isNegative) + *--current = '-'; + assert(current >= buffer); + return current; +} + +std::string valueToString(LargestUInt value) { + UIntToStringBuffer buffer; + char* current = buffer + sizeof(buffer); + uintToString(value, current); + assert(current >= buffer); + return current; +} + +#if defined(JSON_HAS_INT64) + +std::string valueToString(Int value) { + return valueToString(LargestInt(value)); +} + +std::string valueToString(UInt value) { + return valueToString(LargestUInt(value)); +} + +#endif // # if defined(JSON_HAS_INT64) + +std::string valueToString(double value) { + // Allocate a buffer that is more than large enough to store the 16 digits of + // precision requested below. + char buffer[32]; + int len = -1; + +// Print into the buffer. We need not request the alternative representation +// that always has a decimal point because JSON doesn't distingish the +// concepts of reals and integers. +#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with + // visual studio 2005 to + // avoid warning. +#if defined(WINCE) + len = _snprintf(buffer, sizeof(buffer), "%.17g", value); +#else + len = sprintf_s(buffer, sizeof(buffer), "%.17g", value); +#endif +#else + if (isfinite(value)) { + len = snprintf(buffer, sizeof(buffer), "%.17g", value); + } else { + // IEEE standard states that NaN values will not compare to themselves + if (value != value) { + len = snprintf(buffer, sizeof(buffer), "null"); + } else if (value < 0) { + len = snprintf(buffer, sizeof(buffer), "-1e+9999"); + } else { + len = snprintf(buffer, sizeof(buffer), "1e+9999"); + } + // For those, we do not need to call fixNumLoc, but it is fast. + } +#endif + assert(len >= 0); + fixNumericLocale(buffer, buffer + len); + return buffer; +} + +std::string valueToString(bool value) { return value ? "true" : "false"; } + +std::string valueToQuotedString(const char* value) { + if (value == NULL) + return ""; + // Not sure how to handle unicode... + if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && + !containsControlCharacter(value)) + return std::string("\"") + value + "\""; + // We have to walk value and escape any special characters. + // Appending to std::string is not efficient, but this should be rare. + // (Note: forward slashes are *not* rare, but I am not escaping them.) + std::string::size_type maxsize = + strlen(value) * 2 + 3; // allescaped+quotes+NULL + std::string result; + result.reserve(maxsize); // to avoid lots of mallocs + result += "\""; + for (const char* c = value; *c != 0; ++c) { + switch (*c) { + case '\"': + result += "\\\""; + break; + case '\\': + result += "\\\\"; + break; + case '\b': + result += "\\b"; + break; + case '\f': + result += "\\f"; + break; + case '\n': + result += "\\n"; + break; + case '\r': + result += "\\r"; + break; + case '\t': + result += "\\t"; + break; + // case '/': + // Even though \/ is considered a legal escape in JSON, a bare + // slash is also legal, so I see no reason to escape it. + // (I hope I am not misunderstanding something. + // blep notes: actually escaping \/ may be useful in javascript to avoid (*c); + result += oss.str(); + } else { + result += *c; + } + break; + } + } + result += "\""; + return result; +} + +// https://github.com/upcaste/upcaste/blob/master/src/upcore/src/cstring/strnpbrk.cpp +static char const* strnpbrk(char const* s, char const* accept, size_t n) { + assert((s || !n) && accept); + + char const* const end = s + n; + for (char const* cur = s; cur < end; ++cur) { + int const c = *cur; + for (char const* a = accept; *a; ++a) { + if (*a == c) { + return cur; + } + } + } + return NULL; +} +static std::string valueToQuotedStringN(const char* value, unsigned length) { + if (value == NULL) + return ""; + // Not sure how to handle unicode... + if (strnpbrk(value, "\"\\\b\f\n\r\t", length) == NULL && + !containsControlCharacter0(value, length)) + return std::string("\"") + value + "\""; + // We have to walk value and escape any special characters. + // Appending to std::string is not efficient, but this should be rare. + // (Note: forward slashes are *not* rare, but I am not escaping them.) + std::string::size_type maxsize = + length * 2 + 3; // allescaped+quotes+NULL + std::string result; + result.reserve(maxsize); // to avoid lots of mallocs + result += "\""; + char const* end = value + length; + for (const char* c = value; c != end; ++c) { + switch (*c) { + case '\"': + result += "\\\""; + break; + case '\\': + result += "\\\\"; + break; + case '\b': + result += "\\b"; + break; + case '\f': + result += "\\f"; + break; + case '\n': + result += "\\n"; + break; + case '\r': + result += "\\r"; + break; + case '\t': + result += "\\t"; + break; + // case '/': + // Even though \/ is considered a legal escape in JSON, a bare + // slash is also legal, so I see no reason to escape it. + // (I hope I am not misunderstanding something.) + // blep notes: actually escaping \/ may be useful in javascript to avoid (*c); + result += oss.str(); + } else { + result += *c; + } + break; + } + } + result += "\""; + return result; +} + +// Class Writer +// ////////////////////////////////////////////////////////////////// +Writer::~Writer() {} + +// Class FastWriter +// ////////////////////////////////////////////////////////////////// + +FastWriter::FastWriter() + : yamlCompatiblityEnabled_(false) {} + +void FastWriter::enableYAMLCompatibility() { yamlCompatiblityEnabled_ = true; } + +std::string FastWriter::write(const Value& root) { + document_ = ""; + writeValue(root); + document_ += "\n"; + return document_; +} + +void FastWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + document_ += "null"; + break; + case intValue: + document_ += valueToString(value.asLargestInt()); + break; + case uintValue: + document_ += valueToString(value.asLargestUInt()); + break; + case realValue: + document_ += valueToString(value.asDouble()); + break; + case stringValue: + { + // Is NULL possible for value.string_? + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) document_ += valueToQuotedStringN(str, static_cast(end-str)); + break; + } + case booleanValue: + document_ += valueToString(value.asBool()); + break; + case arrayValue: { + document_ += '['; + int size = value.size(); + for (int index = 0; index < size; ++index) { + if (index > 0) + document_ += ','; + writeValue(value[index]); + } + document_ += ']'; + } break; + case objectValue: { + Value::Members members(value.getMemberNames()); + document_ += '{'; + for (Value::Members::iterator it = members.begin(); it != members.end(); + ++it) { + const std::string& name = *it; + if (it != members.begin()) + document_ += ','; + document_ += valueToQuotedStringN(name.data(), static_cast(name.length())); + document_ += yamlCompatiblityEnabled_ ? ": " : ":"; + writeValue(value[name]); + } + document_ += '}'; + } break; + } +} + +// Class StyledWriter +// ////////////////////////////////////////////////////////////////// + +StyledWriter::StyledWriter() + : rightMargin_(74), indentSize_(3), addChildValues_() {} + +std::string StyledWriter::write(const Value& root) { + document_ = ""; + addChildValues_ = false; + indentString_ = ""; + writeCommentBeforeValue(root); + writeValue(root); + writeCommentAfterValueOnSameLine(root); + document_ += "\n"; + return document_; +} + +void StyledWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + pushValue("null"); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble())); + break; + case stringValue: + { + // Is NULL possible for value.string_? + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) pushValue(valueToQuotedStringN(str, static_cast(end-str))); + else pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + Value::Members::iterator it = members.begin(); + for (;;) { + const std::string& name = *it; + const Value& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedString(name.c_str())); + document_ += " : "; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + document_ += ','; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void StyledWriter::writeArrayValue(const Value& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isArrayMultiLine = isMultineArray(value); + if (isArrayMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + const Value& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + writeIndent(); + writeValue(childValue); + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + document_ += ','; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + document_ += "[ "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + document_ += ", "; + document_ += childValues_[index]; + } + document_ += " ]"; + } + } +} + +bool StyledWriter::isMultineArray(const Value& value) { + int size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (int index = 0; index < size && !isMultiLine; ++index) { + const Value& childValue = value[index]; + isMultiLine = + isMultiLine || ((childValue.isArray() || childValue.isObject()) && + childValue.size() > 0); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + int lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (int index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += int(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void StyledWriter::pushValue(const std::string& value) { + if (addChildValues_) + childValues_.push_back(value); + else + document_ += value; +} + +void StyledWriter::writeIndent() { + if (!document_.empty()) { + char last = document_[document_.length() - 1]; + if (last == ' ') // already indented + return; + if (last != '\n') // Comments may add new-line + document_ += '\n'; + } + document_ += indentString_; +} + +void StyledWriter::writeWithIndent(const std::string& value) { + writeIndent(); + document_ += value; +} + +void StyledWriter::indent() { indentString_ += std::string(indentSize_, ' '); } + +void StyledWriter::unindent() { + assert(int(indentString_.size()) >= indentSize_); + indentString_.resize(indentString_.size() - indentSize_); +} + +void StyledWriter::writeCommentBeforeValue(const Value& root) { + if (!root.hasComment(commentBefore)) + return; + + document_ += "\n"; + writeIndent(); + const std::string& comment = root.getComment(commentBefore); + std::string::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + document_ += *iter; + if (*iter == '\n' && + (iter != comment.end() && *(iter + 1) == '/')) + writeIndent(); + ++iter; + } + + // Comments are stripped of trailing newlines, so add one here + document_ += "\n"; +} + +void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) { + if (root.hasComment(commentAfterOnSameLine)) + document_ += " " + root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + document_ += "\n"; + document_ += root.getComment(commentAfter); + document_ += "\n"; + } +} + +bool StyledWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +// Class StyledStreamWriter +// ////////////////////////////////////////////////////////////////// + +StyledStreamWriter::StyledStreamWriter(std::string indentation) + : document_(NULL), rightMargin_(74), indentation_(indentation), + addChildValues_() {} + +void StyledStreamWriter::write(std::ostream& out, const Value& root) { + document_ = &out; + addChildValues_ = false; + indentString_ = ""; + indented_ = true; + writeCommentBeforeValue(root); + if (!indented_) writeIndent(); + indented_ = true; + writeValue(root); + writeCommentAfterValueOnSameLine(root); + *document_ << "\n"; + document_ = NULL; // Forget the stream, for safety. +} + +void StyledStreamWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + pushValue("null"); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble())); + break; + case stringValue: + { + // Is NULL possible for value.string_? + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) pushValue(valueToQuotedStringN(str, static_cast(end-str))); + else pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + Value::Members::iterator it = members.begin(); + for (;;) { + const std::string& name = *it; + const Value& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedString(name.c_str())); + *document_ << " : "; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void StyledStreamWriter::writeArrayValue(const Value& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isArrayMultiLine = isMultineArray(value); + if (isArrayMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + const Value& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + if (!indented_) writeIndent(); + indented_ = true; + writeValue(childValue); + indented_ = false; + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + *document_ << "[ "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + *document_ << ", "; + *document_ << childValues_[index]; + } + *document_ << " ]"; + } + } +} + +bool StyledStreamWriter::isMultineArray(const Value& value) { + int size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (int index = 0; index < size && !isMultiLine; ++index) { + const Value& childValue = value[index]; + isMultiLine = + isMultiLine || ((childValue.isArray() || childValue.isObject()) && + childValue.size() > 0); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + int lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (int index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += int(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void StyledStreamWriter::pushValue(const std::string& value) { + if (addChildValues_) + childValues_.push_back(value); + else + *document_ << value; +} + +void StyledStreamWriter::writeIndent() { + // blep intended this to look at the so-far-written string + // to determine whether we are already indented, but + // with a stream we cannot do that. So we rely on some saved state. + // The caller checks indented_. + *document_ << '\n' << indentString_; +} + +void StyledStreamWriter::writeWithIndent(const std::string& value) { + if (!indented_) writeIndent(); + *document_ << value; + indented_ = false; +} + +void StyledStreamWriter::indent() { indentString_ += indentation_; } + +void StyledStreamWriter::unindent() { + assert(indentString_.size() >= indentation_.size()); + indentString_.resize(indentString_.size() - indentation_.size()); +} + +void StyledStreamWriter::writeCommentBeforeValue(const Value& root) { + if (!root.hasComment(commentBefore)) + return; + + if (!indented_) writeIndent(); + const std::string& comment = root.getComment(commentBefore); + std::string::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + *document_ << *iter; + if (*iter == '\n' && + (iter != comment.end() && *(iter + 1) == '/')) + // writeIndent(); // would include newline + *document_ << indentString_; + ++iter; + } + indented_ = false; +} + +void StyledStreamWriter::writeCommentAfterValueOnSameLine(const Value& root) { + if (root.hasComment(commentAfterOnSameLine)) + *document_ << ' ' << root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + writeIndent(); + *document_ << root.getComment(commentAfter); + } + indented_ = false; +} + +bool StyledStreamWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +////////////////////////// +// BuiltStyledStreamWriter + +/// Scoped enums are not available until C++11. +struct CommentStyle { + /// Decide whether to write comments. + enum Enum { + None, ///< Drop all comments. + Most, ///< Recover odd behavior of previous versions (not implemented yet). + All ///< Keep all comments. + }; +}; + +struct BuiltStyledStreamWriter : public StreamWriter +{ + BuiltStyledStreamWriter( + std::string const& indentation, + CommentStyle::Enum cs, + std::string const& colonSymbol, + std::string const& nullSymbol, + std::string const& endingLineFeedSymbol); + virtual int write(Value const& root, std::ostream* sout); +private: + void writeValue(Value const& value); + void writeArrayValue(Value const& value); + bool isMultineArray(Value const& value); + void pushValue(std::string const& value); + void writeIndent(); + void writeWithIndent(std::string const& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(Value const& root); + void writeCommentAfterValueOnSameLine(Value const& root); + static bool hasCommentForValue(const Value& value); + + typedef std::vector ChildValues; + + ChildValues childValues_; + std::string indentString_; + int rightMargin_; + std::string indentation_; + CommentStyle::Enum cs_; + std::string colonSymbol_; + std::string nullSymbol_; + std::string endingLineFeedSymbol_; + bool addChildValues_ : 1; + bool indented_ : 1; +}; +BuiltStyledStreamWriter::BuiltStyledStreamWriter( + std::string const& indentation, + CommentStyle::Enum cs, + std::string const& colonSymbol, + std::string const& nullSymbol, + std::string const& endingLineFeedSymbol) + : rightMargin_(74) + , indentation_(indentation) + , cs_(cs) + , colonSymbol_(colonSymbol) + , nullSymbol_(nullSymbol) + , endingLineFeedSymbol_(endingLineFeedSymbol) + , addChildValues_(false) + , indented_(false) +{ +} +int BuiltStyledStreamWriter::write(Value const& root, std::ostream* sout) +{ + sout_ = sout; + addChildValues_ = false; + indented_ = true; + indentString_ = ""; + writeCommentBeforeValue(root); + if (!indented_) writeIndent(); + indented_ = true; + writeValue(root); + writeCommentAfterValueOnSameLine(root); + *sout_ << endingLineFeedSymbol_; + sout_ = NULL; + return 0; +} +void BuiltStyledStreamWriter::writeValue(Value const& value) { + switch (value.type()) { + case nullValue: + pushValue(nullSymbol_); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble())); + break; + case stringValue: + { + // Is NULL is possible for value.string_? + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) pushValue(valueToQuotedStringN(str, static_cast(end-str))); + else pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + Value::Members::iterator it = members.begin(); + for (;;) { + std::string const& name = *it; + Value const& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedStringN(name.data(), static_cast(name.length()))); + *sout_ << colonSymbol_; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *sout_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void BuiltStyledStreamWriter::writeArrayValue(Value const& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isMultiLine = (cs_ == CommentStyle::All) || isMultineArray(value); + if (isMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + Value const& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + if (!indented_) writeIndent(); + indented_ = true; + writeValue(childValue); + indented_ = false; + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *sout_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + *sout_ << "["; + if (!indentation_.empty()) *sout_ << " "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + *sout_ << ", "; + *sout_ << childValues_[index]; + } + if (!indentation_.empty()) *sout_ << " "; + *sout_ << "]"; + } + } +} + +bool BuiltStyledStreamWriter::isMultineArray(Value const& value) { + int size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (int index = 0; index < size && !isMultiLine; ++index) { + Value const& childValue = value[index]; + isMultiLine = + isMultiLine || ((childValue.isArray() || childValue.isObject()) && + childValue.size() > 0); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + int lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (int index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += int(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void BuiltStyledStreamWriter::pushValue(std::string const& value) { + if (addChildValues_) + childValues_.push_back(value); + else + *sout_ << value; +} + +void BuiltStyledStreamWriter::writeIndent() { + // blep intended this to look at the so-far-written string + // to determine whether we are already indented, but + // with a stream we cannot do that. So we rely on some saved state. + // The caller checks indented_. + + if (!indentation_.empty()) { + // In this case, drop newlines too. + *sout_ << '\n' << indentString_; + } +} + +void BuiltStyledStreamWriter::writeWithIndent(std::string const& value) { + if (!indented_) writeIndent(); + *sout_ << value; + indented_ = false; +} + +void BuiltStyledStreamWriter::indent() { indentString_ += indentation_; } + +void BuiltStyledStreamWriter::unindent() { + assert(indentString_.size() >= indentation_.size()); + indentString_.resize(indentString_.size() - indentation_.size()); +} + +void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) { + if (cs_ == CommentStyle::None) return; + if (!root.hasComment(commentBefore)) + return; + + if (!indented_) writeIndent(); + const std::string& comment = root.getComment(commentBefore); + std::string::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + *sout_ << *iter; + if (*iter == '\n' && + (iter != comment.end() && *(iter + 1) == '/')) + // writeIndent(); // would write extra newline + *sout_ << indentString_; + ++iter; + } + indented_ = false; +} + +void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine(Value const& root) { + if (cs_ == CommentStyle::None) return; + if (root.hasComment(commentAfterOnSameLine)) + *sout_ << " " + root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + writeIndent(); + *sout_ << root.getComment(commentAfter); + } +} + +// static +bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +/////////////// +// StreamWriter + +StreamWriter::StreamWriter() + : sout_(NULL) +{ +} +StreamWriter::~StreamWriter() +{ +} +StreamWriter::Factory::~Factory() +{} +StreamWriterBuilder::StreamWriterBuilder() +{ + setDefaults(&settings_); +} +StreamWriterBuilder::~StreamWriterBuilder() +{} +StreamWriter* StreamWriterBuilder::newStreamWriter() const +{ + std::string indentation = settings_["indentation"].asString(); + std::string cs_str = settings_["commentStyle"].asString(); + bool eyc = settings_["enableYAMLCompatibility"].asBool(); + bool dnp = settings_["dropNullPlaceholders"].asBool(); + CommentStyle::Enum cs = CommentStyle::All; + if (cs_str == "All") { + cs = CommentStyle::All; + } else if (cs_str == "None") { + cs = CommentStyle::None; + } else { + throwRuntimeError("commentStyle must be 'All' or 'None'"); + } + std::string colonSymbol = " : "; + if (eyc) { + colonSymbol = ": "; + } else if (indentation.empty()) { + colonSymbol = ":"; + } + std::string nullSymbol = "null"; + if (dnp) { + nullSymbol = ""; + } + std::string endingLineFeedSymbol = ""; + return new BuiltStyledStreamWriter( + indentation, cs, + colonSymbol, nullSymbol, endingLineFeedSymbol); +} +static void getValidWriterKeys(std::set* valid_keys) +{ + valid_keys->clear(); + valid_keys->insert("indentation"); + valid_keys->insert("commentStyle"); + valid_keys->insert("enableYAMLCompatibility"); + valid_keys->insert("dropNullPlaceholders"); +} +bool StreamWriterBuilder::validate(Json::Value* invalid) const +{ + Json::Value my_invalid; + if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL + Json::Value& inv = *invalid; + std::set valid_keys; + getValidWriterKeys(&valid_keys); + Value::Members keys = settings_.getMemberNames(); + size_t n = keys.size(); + for (size_t i = 0; i < n; ++i) { + std::string const& key = keys[i]; + if (valid_keys.find(key) == valid_keys.end()) { + inv[key] = settings_[key]; + } + } + return 0u == inv.size(); +} +Value& StreamWriterBuilder::operator[](std::string key) +{ + return settings_[key]; +} +// static +void StreamWriterBuilder::setDefaults(Json::Value* settings) +{ + //! [StreamWriterBuilderDefaults] + (*settings)["commentStyle"] = "All"; + (*settings)["indentation"] = "\t"; + (*settings)["enableYAMLCompatibility"] = false; + (*settings)["dropNullPlaceholders"] = false; + //! [StreamWriterBuilderDefaults] +} + +std::string writeString(StreamWriter::Factory const& builder, Value const& root) { + std::ostringstream sout; + StreamWriterPtr const writer(builder.newStreamWriter()); + writer->write(root, &sout); + return sout.str(); +} + +std::ostream& operator<<(std::ostream& sout, Value const& root) { + StreamWriterBuilder builder; + StreamWriterPtr const writer(builder.newStreamWriter()); + writer->write(root, &sout); + return sout; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_writer.cpp +// ////////////////////////////////////////////////////////////////////// + + + + + diff --git a/vendor/jsoncpp-0.10.5/dist/jsoncpp.o b/vendor/jsoncpp-0.10.5/dist/jsoncpp.o new file mode 100644 index 0000000000000000000000000000000000000000..435026f5422945a89f5ce890528d3df27feaff77 GIT binary patch literal 2178952 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∓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�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

x(PYXAVzCA=r7Ms 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 z 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 n^kiAZ%E&z|B~-aOTIe4 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

CQ+Eho(B2j+^ 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

qFhW2OJRz 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 QN9n&`W*J1r{J6R27D!}V!bP0qYU&l0^i9@ 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

49G=4Cc^D7i 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 literal 0 HcmV?d00001 From c4b6f00da175771101beea02499c2f1ff2468d44 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 14 Aug 2015 00:35:13 -0400 Subject: [PATCH 015/212] add simple unit test that uses JSON parsing to GET tests --- test/test_restclient_get.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/test_restclient_get.cpp b/test/test_restclient_get.cpp index 94101859..9f08124c 100644 --- a/test/test_restclient_get.cpp +++ b/test/test_restclient_get.cpp @@ -1,5 +1,7 @@ #include "restclient-cpp/restclient.h" +#include "restclient-cpp/meta.h" #include +#include #include class RestClientGetTest : public ::testing::Test @@ -37,6 +39,16 @@ TEST_F(RestClientGetTest, TestRestClientGETCode) RestClient::response res = RestClient::get(url); EXPECT_EQ(200, res.code); } +TEST_F(RestClientGetTest, TestRestClientGETBodyCode) +{ + RestClient::response res = RestClient::get(url); + Json::Value root; + std::istringstream str(res.body); + str >> root; + + EXPECT_EQ("http://httpbin.org/get", root.get("url", "no url set").asString()); + EXPECT_EQ("restclient-cpp/" VERSION, root["headers"].get("User-Agent", "no url set").asString()); +} // check for failure TEST_F(RestClientGetTest, TestRestClientFailureCode) { From 2621e15e6abd4986b71ea7124cf3dec16013dcbb Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 14 Aug 2015 00:45:30 -0400 Subject: [PATCH 016/212] update all unit test suites to add a body parse test this adds a test case to each suite that uses json-cpp to parse the response body and make sure we get the correct response back. Now there is an easy to use example for future tests in each suite. this fixes #23 --- test/test_restclient_delete.cpp | 12 ++++++++++++ test/test_restclient_post.cpp | 12 ++++++++++++ test/test_restclient_put.cpp | 12 ++++++++++++ 3 files changed, 36 insertions(+) diff --git a/test/test_restclient_delete.cpp b/test/test_restclient_delete.cpp index b96eab98..3db9a2f6 100644 --- a/test/test_restclient_delete.cpp +++ b/test/test_restclient_delete.cpp @@ -1,5 +1,7 @@ #include "restclient-cpp/restclient.h" +#include "restclient-cpp/meta.h" #include +#include #include class RestClientDeleteTest : public ::testing::Test @@ -37,6 +39,16 @@ TEST_F(RestClientDeleteTest, TestRestClientDeleteCode) RestClient::response res = RestClient::del(url); EXPECT_EQ(200, res.code); } +TEST_F(RestClientDeleteTest, TestRestClientDeleteBody) +{ + RestClient::response res = RestClient::del(url); + Json::Value root; + std::istringstream str(res.body); + str >> root; + + EXPECT_EQ("http://httpbin.org/delete", root.get("url", "no url set").asString()); + EXPECT_EQ("restclient-cpp/" VERSION, root["headers"].get("User-Agent", "no url set").asString()); +} // check for failure TEST_F(RestClientDeleteTest, TestRestClientFailureCode) { diff --git a/test/test_restclient_post.cpp b/test/test_restclient_post.cpp index f7da3104..74b3a73f 100644 --- a/test/test_restclient_post.cpp +++ b/test/test_restclient_post.cpp @@ -1,5 +1,7 @@ #include "restclient-cpp/restclient.h" +#include "restclient-cpp/meta.h" #include +#include #include class RestClientPostTest : public ::testing::Test @@ -37,6 +39,16 @@ TEST_F(RestClientPostTest, TestRestClientPOSTCode) RestClient::response res = RestClient::post(url, ctype, data); EXPECT_EQ(200, res.code); } +TEST_F(RestClientPostTest, TestRestClientPostBody) +{ + RestClient::response res = RestClient::post(url, ctype, data); + Json::Value root; + std::istringstream str(res.body); + str >> root; + + EXPECT_EQ("http://httpbin.org/post", root.get("url", "no url set").asString()); + EXPECT_EQ("restclient-cpp/" VERSION, root["headers"].get("User-Agent", "no url set").asString()); +} // check for failure TEST_F(RestClientPostTest, TestRestClientFailureCode) { diff --git a/test/test_restclient_put.cpp b/test/test_restclient_put.cpp index 34fae336..5084df76 100644 --- a/test/test_restclient_put.cpp +++ b/test/test_restclient_put.cpp @@ -1,5 +1,7 @@ #include "restclient-cpp/restclient.h" +#include "restclient-cpp/meta.h" #include +#include #include class RestClientPutTest : public ::testing::Test @@ -37,6 +39,16 @@ TEST_F(RestClientPutTest, TestRestClientPUTCode) RestClient::response res = RestClient::put(url, ctype, data); EXPECT_EQ(200, res.code); } +TEST_F(RestClientPutTest, TestRestClientPutBody) +{ + RestClient::response res = RestClient::put(url, ctype, data); + Json::Value root; + std::istringstream str(res.body); + str >> root; + + EXPECT_EQ("http://httpbin.org/put", root.get("url", "no url set").asString()); + EXPECT_EQ("restclient-cpp/" VERSION, root["headers"].get("User-Agent", "no url set").asString()); +} // check for failure TEST_F(RestClientPutTest, TestRestClientFailureCode) { From 3473f199cfa8311f76b6b3af7dc43dcda4a1be80 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 14 Aug 2015 00:54:16 -0400 Subject: [PATCH 017/212] update CONTRIBUTING.md with how to run tests --- CONTRIBUTING.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e5c155da..993d4fa8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,3 +6,9 @@ - Commit, do not mess with version - If you add functionality, document it in the README - Send me a pull request. Bonus points for topic branches. + +## How to run tests + +1. build vendorized gtest: `./utils/build_gtest.sh` +2. build restclient-cpp: `./autogen.sh && ./configure && make check` +3. run the unit test suite: `./test-program` From b746561b4d8735c53be37cf49e9a718dba4bcf0c Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 14 Aug 2015 00:57:29 -0400 Subject: [PATCH 018/212] add Contributing section to README --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 298dbe92..e274e0be 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,6 @@ The response is of type RestClient::response and has three attributes: ## Dependencies - [libcurl][] -- [gtest][] for development ## Installation There are some packages available for Linux on [packagecloud][packagecloud]. @@ -38,8 +37,15 @@ Otherwise you can do the regular autotools dance: make install ``` +## Contribute +All contributions are highly appreciated. This includes filing issues, +updating documentation and writing code. Please take a look at the +[contributing guidelines][contributing] before so your contribution can be +merged as fast as possible. + [libcurl]: http://curl.haxx.se/libcurl/ [ruby rest-client]: http://github.com/archiloque/rest-client [gtest]: http://code.google.com/p/googletest/ [packagecloud]: https://packagecloud.io/mrtazz/restclient-cpp +[contributing]: https://github.com/mrtazz/restclient-cpp/blob/master/CONTRIBUTING.md From 01df853ef95962be2010c9b61c33d3a78b686b35 Mon Sep 17 00:00:00 2001 From: Islam Yasar Date: Fri, 14 Aug 2015 10:40:48 +0300 Subject: [PATCH 019/212] timeout unit tests are disabled for put, post, delete operation --- test/test_restclient_post.cpp | 4 ++-- test/test_restclient_put.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/test_restclient_post.cpp b/test/test_restclient_post.cpp index 421b6f7d..bfa3c7b9 100644 --- a/test/test_restclient_post.cpp +++ b/test/test_restclient_post.cpp @@ -69,10 +69,10 @@ TEST_F(RestClientPostTest, TestRestClientPOSTHeaders) EXPECT_EQ("keep-alive", res.headers["Connection"]); } -TEST_F(RestClientPostTest, TestRestClientPOSTTimeout) +/*TEST_F(RestClientPostTest, TestRestClientPOSTTimeout) { std::string u = "http://httpbin.org/delay/10"; RestClient::response res = RestClient::post(u, ctype, data, 5); EXPECT_EQ(28, res.code); -} +}*/ diff --git a/test/test_restclient_put.cpp b/test/test_restclient_put.cpp index 252fe8d7..d069a866 100644 --- a/test/test_restclient_put.cpp +++ b/test/test_restclient_put.cpp @@ -67,9 +67,9 @@ TEST_F(RestClientPutTest, TestRestClientPUTHeaders) EXPECT_EQ("keep-alive", res.headers["Connection"]); } -TEST_F(RestClientPutTest, TestRestClientPUTTimeout) +/*TEST_F(RestClientPutTest, TestRestClientPUTTimeout) { std::string u = "http://httpbin.org/delay/10"; RestClient::response res = RestClient::put(u, ctype, data, 5); EXPECT_EQ(28, res.code); -} +}*/ From fa129a8b9b3d6ed6d7875634f4c8583d1273a6c9 Mon Sep 17 00:00:00 2001 From: Islam Yasar Date: Fri, 14 Aug 2015 12:14:29 +0300 Subject: [PATCH 020/212] disable delete op.- saving issue --- test/test_restclient_delete.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_restclient_delete.cpp b/test/test_restclient_delete.cpp index 33fcc804..d098327a 100644 --- a/test/test_restclient_delete.cpp +++ b/test/test_restclient_delete.cpp @@ -55,10 +55,10 @@ TEST_F(RestClientDeleteTest, TestRestClientDeleteHeaders) EXPECT_EQ("keep-alive", res.headers["Connection"]); } -TEST_F(RestClientDeleteTest, TestRestClientDeleteTimeout) +/*TEST_F(RestClientDeleteTest, TestRestClientDeleteTimeout) { std::string u = "http://httpbin.org/delay/10"; RestClient::response res = RestClient::del(u, 5); EXPECT_EQ(28, res.code); -} +}*/ From 85d7dd33e3e7ea919c0d85cf223250359c791307 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 14 Aug 2015 07:57:14 -0400 Subject: [PATCH 021/212] update usage in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e274e0be..cb724f2d 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ I tried to keep usage close to the [ruby rest-client][]. So the basic usage is: Examples: - #include "restclient.h" + #include "restclient-cpp/restclient.h" RestClient::response r = RestClient::get("http://url.com") RestClient::response r = RestClient::post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}") From 67a0ff44cd64be723c4e9426576b98cd77d34141 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 15 Aug 2015 21:22:10 -0400 Subject: [PATCH 022/212] change code blocks in README for syntax highlighting This looks nice on github so let's make it nicer. --- README.md | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index cb724f2d..f9a3e964 100644 --- a/README.md +++ b/README.md @@ -6,23 +6,28 @@ This is a simple REST client for C++. It wraps libcurl for HTTP requests. ## Usage I tried to keep usage close to the [ruby rest-client][]. So the basic usage is: - RestClient::method(url, content-type, params); +```cpp +RestClient::method(url, content-type, params); +``` Examples: - #include "restclient-cpp/restclient.h" +```cpp +#include "restclient-cpp/restclient.h" - RestClient::response r = RestClient::get("http://url.com") - RestClient::response r = RestClient::post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}") - RestClient::response r = RestClient::put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}") - RestClient::response r = RestClient::del("http://url.com/delete") +RestClient::response r = RestClient::get("http://url.com") +RestClient::response r = RestClient::post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}") +RestClient::response r = RestClient::put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}") +RestClient::response r = RestClient::del("http://url.com/delete") +``` The response is of type RestClient::response and has three attributes: - RestClient::response.code // HTTP response code - RestClient::response.body // HTTP response body - RestClient::response.headers // HTTP response headers - +```cpp +RestClient::response.code // HTTP response code +RestClient::response.body // HTTP response body +RestClient::response.headers // HTTP response headers +``` ## Dependencies - [libcurl][] @@ -31,7 +36,7 @@ The response is of type RestClient::response and has three attributes: There are some packages available for Linux on [packagecloud][packagecloud]. Otherwise you can do the regular autotools dance: -``` +```bash ./autogen.sh ./configure make install From 34894cd0edb11a83e0bebee6f426ec28b3c8537b Mon Sep 17 00:00:00 2001 From: Karol Samborski Date: Mon, 31 Aug 2015 12:16:47 +0200 Subject: [PATCH 023/212] Allow for setting additional HTTP headers --- include/restclient-cpp/restclient.h | 6 ++ source/restclient.cpp | 120 +++++++++++++++++++++++++--- 2 files changed, 117 insertions(+), 9 deletions(-) diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index 59c1258c..ba0098dc 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -42,14 +42,20 @@ class RestClient static void setAuth(const std::string& user,const std::string& password); // HTTP GET static response get(const std::string& url); + static response get(const std::string& url, const headermap& headers); // HTTP POST static response post(const std::string& url, const std::string& ctype, const std::string& data); + static response post(const std::string& url, const std::string& ctype, + const std::string& data, const headermap& headers); // HTTP PUT static response put(const std::string& url, const std::string& ctype, const std::string& data); + static response put(const std::string& url, const std::string& ctype, + const std::string& data, const headermap& headers); // HTTP DELETE static response del(const std::string& url); + static response del(const std::string& url, const headermap& headers); private: // writedata callback function diff --git a/source/restclient.cpp b/source/restclient.cpp index f2efd4c6..6e85b109 100644 --- a/source/restclient.cpp +++ b/source/restclient.cpp @@ -36,6 +36,20 @@ void RestClient::setAuth(const std::string& user,const std::string& password){ * @return response struct */ RestClient::response RestClient::get(const std::string& url) +{ + headermap emptyMap; + return RestClient::get(url, emptyMap); +} + +/** + * @brief HTTP GET method + * + * @param url to query + * @param headers HTTP headers + * + * @return response struct + */ +RestClient::response RestClient::get(const std::string& url, const headermap& headers) { /** create return struct */ RestClient::response ret = {}; @@ -43,6 +57,7 @@ RestClient::response RestClient::get(const std::string& url) // use libcurl CURL *curl = NULL; CURLcode res = CURLE_OK; + std::string header; curl = curl_easy_init(); if (curl) @@ -64,6 +79,15 @@ RestClient::response RestClient::get(const std::string& url) curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, RestClient::header_callback); /** callback object for headers */ curl_easy_setopt(curl, CURLOPT_HEADERDATA, &ret); + /** set http headers */ + curl_slist* hlist = NULL; + for (std::map::const_iterator it = headers.begin(); it != headers.end(); ++it) { + header = it->first; + header += ':'; + header += it->second; + hlist = curl_slist_append(hlist, header.c_str()); + } + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hlist); /** perform the actual query */ res = curl_easy_perform(curl); if (res != CURLE_OK) @@ -76,6 +100,7 @@ RestClient::response RestClient::get(const std::string& url) curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); ret.code = static_cast(http_code); + curl_slist_free_all(hlist); curl_easy_cleanup(curl); curl_global_cleanup(); } @@ -94,11 +119,31 @@ RestClient::response RestClient::get(const std::string& url) RestClient::response RestClient::post(const std::string& url, const std::string& ctype, const std::string& data) +{ + headermap emptyMap; + return RestClient::post(url, ctype, data, emptyMap); +} + +/** + * @brief HTTP POST method + * + * @param url to query + * @param ctype content type as string + * @param data HTTP POST body + * @param headers HTTP headers + * + * @return response struct + */ +RestClient::response RestClient::post(const std::string& url, + const std::string& ctype, + const std::string& data, + const headermap& headers) { /** create return struct */ RestClient::response ret = {}; /** build content-type header string */ std::string ctype_header = "Content-Type: " + ctype; + std::string header; // use libcurl CURL *curl = NULL; @@ -130,9 +175,15 @@ RestClient::response RestClient::post(const std::string& url, /** callback object for headers */ curl_easy_setopt(curl, CURLOPT_HEADERDATA, &ret); /** set content-type header */ - curl_slist* header = NULL; - header = curl_slist_append(header, ctype_header.c_str()); - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header); + curl_slist* hlist = NULL; + hlist = curl_slist_append(hlist, ctype_header.c_str()); + for (std::map::const_iterator it = headers.begin(); it != headers.end(); ++it) { + header = it->first; + header += ':'; + header += it->second; + hlist = curl_slist_append(hlist, header.c_str()); + } + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hlist); /** perform the actual query */ res = curl_easy_perform(curl); if (res != CURLE_OK) @@ -145,7 +196,7 @@ RestClient::response RestClient::post(const std::string& url, curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); ret.code = static_cast(http_code); - curl_slist_free_all(header); + curl_slist_free_all(hlist); curl_easy_cleanup(curl); curl_global_cleanup(); } @@ -164,11 +215,31 @@ RestClient::response RestClient::post(const std::string& url, RestClient::response RestClient::put(const std::string& url, const std::string& ctype, const std::string& data) +{ + headermap emptyMap; + return RestClient::put(url, ctype, data, emptyMap); +} + +/** + * @brief HTTP PUT method + * + * @param url to query + * @param ctype content type as string + * @param data HTTP PUT body + * @param headers HTTP headers + * + * @return response struct + */ +RestClient::response RestClient::put(const std::string& url, + const std::string& ctype, + const std::string& data, + const headermap& headers) { /** create return struct */ RestClient::response ret = {}; /** build content-type header string */ std::string ctype_header = "Content-Type: " + ctype; + std::string header; /** initialize upload object */ RestClient::upload_object up_obj; @@ -211,9 +282,15 @@ RestClient::response RestClient::put(const std::string& url, static_cast(up_obj.length)); /** set content-type header */ - curl_slist* header = NULL; - header = curl_slist_append(header, ctype_header.c_str()); - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header); + curl_slist* hlist = NULL; + hlist = curl_slist_append(hlist, ctype_header.c_str()); + for (std::map::const_iterator it = headers.begin(); it != headers.end(); ++it) { + header = it->first; + header += ':'; + header += it->second; + hlist = curl_slist_append(hlist, header.c_str()); + } + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hlist); /** perform the actual query */ res = curl_easy_perform(curl); if (res != CURLE_OK) @@ -226,7 +303,7 @@ RestClient::response RestClient::put(const std::string& url, curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); ret.code = static_cast(http_code); - curl_slist_free_all(header); + curl_slist_free_all(hlist); curl_easy_cleanup(curl); curl_global_cleanup(); } @@ -241,6 +318,20 @@ RestClient::response RestClient::put(const std::string& url, * @return response struct */ RestClient::response RestClient::del(const std::string& url) +{ + headermap emptyMap; + return RestClient::del(url, emptyMap); +} + +/** + * @brief HTTP DELETE method + * + * @param url to query + * @param headers HTTP headers + * + * @return response struct + */ +RestClient::response RestClient::del(const std::string& url, const headermap& headers) { /** create return struct */ RestClient::response ret = {}; @@ -251,6 +342,7 @@ RestClient::response RestClient::del(const std::string& url) // use libcurl CURL *curl = NULL; CURLcode res = CURLE_OK; + std::string header; curl = curl_easy_init(); if (curl) @@ -274,6 +366,15 @@ RestClient::response RestClient::del(const std::string& url) curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, RestClient::header_callback); /** callback object for headers */ curl_easy_setopt(curl, CURLOPT_HEADERDATA, &ret); + /** set http headers */ + curl_slist* hlist = NULL; + for (std::map::const_iterator it = headers.begin(); it != headers.end(); ++it) { + header = it->first; + header += ':'; + header += it->second; + hlist = curl_slist_append(hlist, header.c_str()); + } + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hlist); /** perform the actual query */ res = curl_easy_perform(curl); if (res != CURLE_OK) @@ -286,6 +387,7 @@ RestClient::response RestClient::del(const std::string& url) curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); ret.code = static_cast(http_code); + curl_slist_free_all(hlist); curl_easy_cleanup(curl); curl_global_cleanup(); } @@ -333,7 +435,7 @@ size_t RestClient::header_callback(void *data, size_t size, size_t nmemb, //roll with non seperated headers... trim(header); if ( 0 == header.length() ){ - return (size * nmemb); //blank line; + return (size * nmemb); //blank line; } r->headers[header] = "present"; } else { From 0b168b953fa940e30ec8515ae1948e5fe1bfa1be Mon Sep 17 00:00:00 2001 From: Karol Samborski Date: Mon, 31 Aug 2015 12:20:46 +0200 Subject: [PATCH 024/212] Added extra space after ':' at header's name --- source/restclient.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/restclient.cpp b/source/restclient.cpp index 6e85b109..873e9457 100644 --- a/source/restclient.cpp +++ b/source/restclient.cpp @@ -83,7 +83,7 @@ RestClient::response RestClient::get(const std::string& url, const headermap& he curl_slist* hlist = NULL; for (std::map::const_iterator it = headers.begin(); it != headers.end(); ++it) { header = it->first; - header += ':'; + header += ": "; header += it->second; hlist = curl_slist_append(hlist, header.c_str()); } @@ -179,7 +179,7 @@ RestClient::response RestClient::post(const std::string& url, hlist = curl_slist_append(hlist, ctype_header.c_str()); for (std::map::const_iterator it = headers.begin(); it != headers.end(); ++it) { header = it->first; - header += ':'; + header += ": "; header += it->second; hlist = curl_slist_append(hlist, header.c_str()); } @@ -286,7 +286,7 @@ RestClient::response RestClient::put(const std::string& url, hlist = curl_slist_append(hlist, ctype_header.c_str()); for (std::map::const_iterator it = headers.begin(); it != headers.end(); ++it) { header = it->first; - header += ':'; + header += ": "; header += it->second; hlist = curl_slist_append(hlist, header.c_str()); } @@ -370,7 +370,7 @@ RestClient::response RestClient::del(const std::string& url, const headermap& he curl_slist* hlist = NULL; for (std::map::const_iterator it = headers.begin(); it != headers.end(); ++it) { header = it->first; - header += ':'; + header += ": "; header += it->second; hlist = curl_slist_append(hlist, header.c_str()); } From 86be6cc698fe88a91dc15534eafc9f8e0ba5123c Mon Sep 17 00:00:00 2001 From: Karol Samborski Date: Mon, 31 Aug 2015 12:26:29 +0200 Subject: [PATCH 025/212] Fixed bad indentation --- source/restclient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/restclient.cpp b/source/restclient.cpp index 873e9457..2539fece 100644 --- a/source/restclient.cpp +++ b/source/restclient.cpp @@ -435,7 +435,7 @@ size_t RestClient::header_callback(void *data, size_t size, size_t nmemb, //roll with non seperated headers... trim(header); if ( 0 == header.length() ){ - return (size * nmemb); //blank line; + return (size * nmemb); //blank line; } r->headers[header] = "present"; } else { From 285d266b95be5ca8b012ad49cbaa536fc26d644f Mon Sep 17 00:00:00 2001 From: Karol Samborski Date: Mon, 31 Aug 2015 12:52:06 +0200 Subject: [PATCH 026/212] Fixed indentation, added test and some description --- README.md | 12 ++++++++++ source/restclient.cpp | 46 ++++++++++++++++++------------------ test/test_restclient_get.cpp | 8 +++++++ 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index f9a3e964..d3c60ca5 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ I tried to keep usage close to the [ruby rest-client][]. So the basic usage is: ```cpp RestClient::method(url, content-type, params); +// or +RestClient::method(url, content-type, params, headers); ``` Examples: @@ -19,6 +21,16 @@ RestClient::response r = RestClient::get("http://url.com") RestClient::response r = RestClient::post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}") RestClient::response r = RestClient::put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}") RestClient::response r = RestClient::del("http://url.com/delete") + +// add some headers + +RestClient::headermap headers; +headers["Accept"] = "application/json"; + +RestClient::response r = RestClient::get("http://url.com", headers) +RestClient::response r = RestClient::post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}", headers) +RestClient::response r = RestClient::put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}", headers) +RestClient::response r = RestClient::del("http://url.com/delete", headers) ``` The response is of type RestClient::response and has three attributes: diff --git a/source/restclient.cpp b/source/restclient.cpp index 2539fece..5d57e83a 100644 --- a/source/restclient.cpp +++ b/source/restclient.cpp @@ -37,8 +37,8 @@ void RestClient::setAuth(const std::string& user,const std::string& password){ */ RestClient::response RestClient::get(const std::string& url) { - headermap emptyMap; - return RestClient::get(url, emptyMap); + headermap emptyMap; + return RestClient::get(url, emptyMap); } /** @@ -81,11 +81,11 @@ RestClient::response RestClient::get(const std::string& url, const headermap& he curl_easy_setopt(curl, CURLOPT_HEADERDATA, &ret); /** set http headers */ curl_slist* hlist = NULL; - for (std::map::const_iterator it = headers.begin(); it != headers.end(); ++it) { - header = it->first; - header += ": "; - header += it->second; - hlist = curl_slist_append(hlist, header.c_str()); + for (headermap::const_iterator it = headers.begin(); it != headers.end(); ++it) { + header = it->first; + header += ": "; + header += it->second; + hlist = curl_slist_append(hlist, header.c_str()); } curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hlist); /** perform the actual query */ @@ -177,11 +177,11 @@ RestClient::response RestClient::post(const std::string& url, /** set content-type header */ curl_slist* hlist = NULL; hlist = curl_slist_append(hlist, ctype_header.c_str()); - for (std::map::const_iterator it = headers.begin(); it != headers.end(); ++it) { - header = it->first; - header += ": "; - header += it->second; - hlist = curl_slist_append(hlist, header.c_str()); + for (headermap::const_iterator it = headers.begin(); it != headers.end(); ++it) { + header = it->first; + header += ": "; + header += it->second; + hlist = curl_slist_append(hlist, header.c_str()); } curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hlist); /** perform the actual query */ @@ -284,11 +284,11 @@ RestClient::response RestClient::put(const std::string& url, /** set content-type header */ curl_slist* hlist = NULL; hlist = curl_slist_append(hlist, ctype_header.c_str()); - for (std::map::const_iterator it = headers.begin(); it != headers.end(); ++it) { - header = it->first; - header += ": "; - header += it->second; - hlist = curl_slist_append(hlist, header.c_str()); + for (headermap::const_iterator it = headers.begin(); it != headers.end(); ++it) { + header = it->first; + header += ": "; + header += it->second; + hlist = curl_slist_append(hlist, header.c_str()); } curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hlist); /** perform the actual query */ @@ -368,11 +368,11 @@ RestClient::response RestClient::del(const std::string& url, const headermap& he curl_easy_setopt(curl, CURLOPT_HEADERDATA, &ret); /** set http headers */ curl_slist* hlist = NULL; - for (std::map::const_iterator it = headers.begin(); it != headers.end(); ++it) { - header = it->first; - header += ": "; - header += it->second; - hlist = curl_slist_append(hlist, header.c_str()); + for (headermap::const_iterator it = headers.begin(); it != headers.end(); ++it) { + header = it->first; + header += ": "; + header += it->second; + hlist = curl_slist_append(hlist, header.c_str()); } curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hlist); /** perform the actual query */ @@ -435,7 +435,7 @@ size_t RestClient::header_callback(void *data, size_t size, size_t nmemb, //roll with non seperated headers... trim(header); if ( 0 == header.length() ){ - return (size * nmemb); //blank line; + return (size * nmemb); //blank line; } r->headers[header] = "present"; } else { diff --git a/test/test_restclient_get.cpp b/test/test_restclient_get.cpp index 9f08124c..77a84c0a 100644 --- a/test/test_restclient_get.cpp +++ b/test/test_restclient_get.cpp @@ -49,6 +49,14 @@ TEST_F(RestClientGetTest, TestRestClientGETBodyCode) EXPECT_EQ("http://httpbin.org/get", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" VERSION, root["headers"].get("User-Agent", "no url set").asString()); } +//check if additional http headers were sent +TEST_F(RestClientGetTest, TestRestClientGETAdditionalHeaders) +{ + RestClient::headermap headers; + headers["If-Modified-Since"] = "Sat, 29 Oct 1994 19:43:31 GMT"; + RestClient::response res = RestClient::get("http://httpbin.org/cache", headers); + EXPECT_EQ(304, res.code); +} // check for failure TEST_F(RestClientGetTest, TestRestClientFailureCode) { From 529cb451176e9fd128017716c59400d1e3d481f6 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Thu, 3 Sep 2015 15:14:42 -0400 Subject: [PATCH 027/212] add simple target to run tests --- Makefile.am | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile.am b/Makefile.am index 8973b1b8..aa7738df 100644 --- a/Makefile.am +++ b/Makefile.am @@ -11,3 +11,6 @@ lib_LTLIBRARIES=librestclient-cpp.la librestclient_cpp_la_SOURCES=source/restclient.cpp librestclient_cpp_la_CXXFLAGS=-fPIC librestclient_cpp_la_LDFLAGS=-version-info 1:0:1 + +test: check + ./test-program From d1830b30cbffb2b53b1b1061a8492809192050a7 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Thu, 3 Sep 2015 15:15:43 -0400 Subject: [PATCH 028/212] use make test on travis and document in CONTRIBUTING.md --- .travis.yml | 2 +- CONTRIBUTING.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index f87f7034..d022031c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: cpp # command to install dependencies -script: ./autogen.sh && ./configure && make check && ./test-program +script: ./autogen.sh && ./configure && make test before_script: - ./utils/build_gtest.sh sudo: false diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 993d4fa8..a78f2fe8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,4 +11,4 @@ 1. build vendorized gtest: `./utils/build_gtest.sh` 2. build restclient-cpp: `./autogen.sh && ./configure && make check` -3. run the unit test suite: `./test-program` +3. run the unit test suite: `make test` From d2e1316e3750f3dd04ea6c4fb002b72fa194d60b Mon Sep 17 00:00:00 2001 From: Karol Samborski Date: Fri, 4 Sep 2015 08:52:25 +0200 Subject: [PATCH 029/212] Changed test to use httpbin.org/headers instead of httpbin.org/cache --- test/test_restclient_get.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/test/test_restclient_get.cpp b/test/test_restclient_get.cpp index 77a84c0a..6de3b2ae 100644 --- a/test/test_restclient_get.cpp +++ b/test/test_restclient_get.cpp @@ -53,9 +53,24 @@ TEST_F(RestClientGetTest, TestRestClientGETBodyCode) TEST_F(RestClientGetTest, TestRestClientGETAdditionalHeaders) { RestClient::headermap headers; - headers["If-Modified-Since"] = "Sat, 29 Oct 1994 19:43:31 GMT"; - RestClient::response res = RestClient::get("http://httpbin.org/cache", headers); - EXPECT_EQ(304, res.code); + + headers["Accept"] = "text/json"; + headers["Accept-Charset"] = "iso8859-2"; + headers["Accept-Language"] = "en-US"; + headers["User-Agent"] = "restclient-cpp"; + + RestClient::response res = RestClient::get("http://httpbin.org/headers", headers); + + EXPECT_EQ(200, res.code); + + Json::Value root; + std::istringstream str(res.body); + str >> root; + + const Json::Value r_headers = root["headers"]; + for ( RestClient::headermap::const_iterator it = headers.begin(); it != headers.end(); ++it) { + EXPECT_EQ(it->second, r_headers.get(it->first, "Header " + it->first + " not found").asString()); + } } // check for failure TEST_F(RestClientGetTest, TestRestClientFailureCode) From f0f0ca312869ae03d65514fc80a3b92d04af8dff Mon Sep 17 00:00:00 2001 From: Karol Samborski Date: Sun, 6 Sep 2015 14:01:31 +0200 Subject: [PATCH 030/212] Added lost line. --- source/restclient.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/source/restclient.cpp b/source/restclient.cpp index b0281497..7d5a3135 100644 --- a/source/restclient.cpp +++ b/source/restclient.cpp @@ -240,6 +240,7 @@ RestClient::response RestClient::post(const std::string& url, * * @return response struct */ +RestClient::response RestClient::put(const std::string& url, const std::string& ctype, const std::string& data, const size_t timeout) From 72b4ae71ff6b1e3dbc611f2571d171af4596b9df Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 6 Sep 2015 16:20:54 -0400 Subject: [PATCH 031/212] remove accidentally commited jsoncpp.o file --- vendor/jsoncpp-0.10.5/dist/jsoncpp.o | Bin 2178952 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 vendor/jsoncpp-0.10.5/dist/jsoncpp.o diff --git a/vendor/jsoncpp-0.10.5/dist/jsoncpp.o b/vendor/jsoncpp-0.10.5/dist/jsoncpp.o deleted file mode 100644 index 435026f5422945a89f5ce890528d3df27feaff77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2178952 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∓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�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

x(PYXAVzCA=r7Ms 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 z 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 n^kiAZ%E&z|B~-aOTIe4 z3D{4Ev*A3r9DWF0_Ab3Ej`kl_f1Et^IlP2^q~Kg+hFLimxnU)EgYCQ|v;Ql|Q=dcq z+&qZxGU|x;b0d9`=SL{dQBnF+R`pHK&s9&<{N;HU%5%StKKuwTu*|QbrN0U6mkrs^ zhUg>@q2x20`??=zJN~ObX8$*(BQWb;b6pead{?5|t@MTBq`!kXJqb6#eU|w})z@BV zD(VCugU>)+Z&LMbLi(4wMx$Q@zp&&pn?Ag*`V!XuZR|dPlZo@1C00hk&x$!IUu1n^4vF7{b zJ7z+AVYq-xt#V+GQrbe9wVf)7jvIbov@&2=lN^Q(@1EqJc^le!L3UmohJ3-5v>;A}V#ehI&Z zMd(9GOFteVj>L2M*ZqvueuE``ck+K4O1(OM;T6mqc7y$3y!5q0`j`1Vhd$o(tHvA~ zTIM;LenmYORg&m$Kk*7$?5A4tS<1fHr${FIu=B9>Q{EHx)O*J@Uz@)c_!$nxPip#6 zAKn4=`F)dfwFw@Cf5Ld_SBLZ;HUA#eJs^qo|I9hbzS30M9R2`x{r%XV1mA(n5g0F{saLQuR$j z`j>P19QxI8lO>-n^r0t=YCrH(Q{m(AN%$-r4aY*=k9ga=;<@tF`9;+~v(9+9bG_lX z&kWE1+%ONU0?n@fXT0p6CyyC$7W5;T)f<+4|0Hi$zGD9lep*wv)NhLyRxi3-s-I!= z6Z;>@Pv)_Z`gDHhn*LAnmioUTZ>eABf3E3MGPkh#N7ZLn{(p1yC#wIb`l$V1M84ag zJZ}{&?}u|uzbs<@QS}>@|I+lu)}N^Uqw1sfU(S71&S?YK4C?1s-ly{Zl=qc9?{YqD zpC9s`PpW-$-Zyi|??L)+i&qQ%o#XEx3Our2ZIwGJRp}d&ALC zM`_D`XSfP}Zqe6O`UPC)+o(O8Yn{(k4*e1Qr2f*_r-hrLjuNYWO+^1LeS7@%gG1pM z_#%7>>Uv~<3HO)6m2fqbJhXk(ex%-HJY<0hur<{F4-#MWHP8*V=&$<9c=!vB-)ydr z!R%Yibsks^)`mmjXsGiUto*Nc_>Z^!7EAoCy#{-sBk5nc?lLw#PF zZ8bZ?;V3u;YJHh)W~U461|NW0fAKeF=Px*Gx4GT~Z`@<96X5;uS(y0;b3X^{|D(Bn z9GWZt&j-ITYl-Lb?^~KxtoENe;y1Wjb zNx!1bFZDO3;-sFZGo9}=&ixbLn!LC0-b&9r8^d<+c{m5&!8z;%U*w!kvYfY!#F2O| z|N8vIYJaCA{xnsej{g?+`(gU;j3OJ1m;S4e{$+lJh#&9y{lFZLSmt>ZbJypfJNrMt zqp%`=nn5`)LOC~cL&kIY*Yl`I9`!8w#j1~W9@5XK{gZyV<|Xf?q@I`L&M((4Gl8S< z0-nd}us!Sy=fY3m0_M5|zR5Xy$8w$qsCX{_`h3J{zu6K0Lsg%SU!3>#?XV9V4CAH0 zHKc!;-wWvDJ-?KEZ^~l%{?v=P>vOP-{o^nb=bs-%QzTYLNd~M(7JD{tx(@b(dZ2rBu9tS7GAK(F~ z=f76@%ZKhNcs&&V@wP8Q{!)*Q-_Q~NVeDUnAHgr6&Nr$0u_67-e57Bld7RJtTF$A? zw;lDn{G`H<%l>uz?Sfk0nf=G0=$FMwe~kC+*FTxa#}677`^B&$>;?zI2{84qMwbEZ zgnOa6>;KuFI1G&7#Gdne5TX-*wm%emJ|1!Tm=;J-VT)&x$ ziosg29@O=&w495~oQH035F7`WKsi4`IY&ph?~3R0ukF7e-=Cnik5wP*e59XI`zQU1 zI=_Rw50ZMG&UC)r4wwlg^4==R96P`V;Q%-pE`^OaS1sW&c%J2aZ&LAG{`L8Z)xIos zO1(P%TdF=Ce-QSI;0E{&jF*0DNdGdwgXrTuzp~7+hGm{Pn72L$?bv?;z5tiP9Z=4T zP|i)(knvpp^*jm_w+htuvFc-;hx9XQ|D<28dC7a}Sw8R1^?ZNeefo;Z*Y^3j7~O>Z zW|FmjHk=E8gGXU?-bZzyo_`_yh`*lLJpxBV@gHyd{*L%F9r4#=pAKDqSOV&NldAuP zI4=J(AL*BC9=9uS(k`F}p8;<^0$mSz>J{r8Ue`&4~8ent9pAAAB1hw;)k z3+Z3xHwAsX=huZf4uCJh$(H%%;T-65aVPsL;aBh=%z{5TKSDW2^+U#U`PcI)O8n|j z+sCSpbw1M1sQr_EMV((xo{yxSr!$@J%0JD7W*jjb$n*O)Tn)c~f57a_dnSAxCUDN0 zTh3bv;z&G~e|>&pwSU49|3d1J`gHuSu)ml-Tm>t@cwgZW|^93Eb#}E#}t*1j=vrI z4CqS0vM^ryqr`FfmwDOx=bBF&=G4nFuh*z6>fBq#=nqx2LNhs%Prp150kon%=@c-CZ z^8b4p^PJ^NYxp%hKb^VG4@*IP-m;)is=e6N$IpGl8EuJI9bH&`1?qbbJE?CA{(pgG z(wlm9eRJ5)e7?D#16G7u|0(+Y@E4ddnf2-Lp8?w9jUb;((7EbagKkm=Q~wPY7*2-o zz-4eHTn|%ZH2QQ<_p2m+#s34?+5E@b{t-+3{^aqZ%16iFhsdNUix2%&5-$SbokGCmi%|%`5ORbzP9aNx+5E@b{zB@J`Xqh{@~EZq(ec}2 zKN8M@3t_zU148%5Lo|0P+>ymdVdxgYf$9L6rHzZuwlZLx1_$)^|lV!tSv z>}~zG^=~ZifjKa$z1ZD-p_$K3JWt|B_g8ekqA!BJ7S#G#=stm;!JlAq>33WFFT2Rp z`8E6&{snbD@zNj0{}D&Ln%vJoKiBdc{$zO{{6U?0u#0Lha||2rvuvh+v$Gq%cB$b- zISdQK60jj`1}DN9Q1|;9{EGi?9sc8O|CA;EKJrLQ-cqlQzYY7WmzaKB1uMXK>5mh~ zWkyIAAAbGd*D;Nhh{^apV;4`?5A1s zJJ zl=xZb%jNJ!DEU0ZwXJ`#<`b)Z^PJ}UPVroZpTH8i&2>#!7j}g`;8M5}>Uq7T{HH`` z^B-^f3#doxllU3Qqmar+$8U}Oa5xjrhw;+)3+Z3xW$T}7K3`GqA*k~&&3@FmZ%m@U zC$L*$v9D^$r#bs#|3Wg^@8svCV^I2U>t7kp`!(=7SR3kom&{|Hvy_(^PKK%Sn(JIJ zKdcGs!jW(s)c&7Q{x>@O$J_oJOZ*+=aYW^#$HG#QekB z%N#z#e-Gx_8|wLp?kM`gyeAr4-d9oe$MM^M_^t7~2)5>V><4vzVt<*k?`g^JT+^2# zZ>fKxs$bW8uIVdA%s;CB7Uh4wqd!soN7YB|e{b>~59K^RWI500ntou!{G;keEC2V? z7h8X#`j4uQ+JAX&dvH$Wy(QnH3R6#G%e>=d-%Q0{Mql;&Lv)g_=)&e3t9>`}l=wTz z^B}y0K1n`x9Q}(mpIGf5xYB&jsdtrO!(xW7!&UH8_$xdDYZN#7o1vc9X61hnb~gX< zwl6_lQlG?sjyz_le02Q&*w2R_!!KdH^bJuUN`N57(; zi{?r6mjSzK7W?-t`D|rh?DHg(eb{-}`ni^$!?wU!{fVDph0VEW&+{jK^?6-{?mM^- zHY#H5wSF1*zf$^I7X4=yeNOZRVTJ#g{k7y<4c3U5e^`5&!zBFIW}de|Js;71jQ)4t z6NPv`#H#-Uzxjw?0>4kf5gpD7yU)t&jO1lv%U!ai#p=1=l+zErk+}*45z{+a0T20e}>nT zHu~$KuD>*X#s9Es*Gr?$R5WWN7gZjJ-CGV7F z%yTpVz6`bg9rRzrZ{c4sx%7wef5Z{5N?B7!HCPkg1QTFmsPm1ty(^w8Pn};>{mOEt zAFJV~@N>8oZihNvyzO1_TzTsJqUwj2H~r{X!SJ%H4g0_m@J09@{19GT(daLMI-g&a z{|4CE{KwnA7IjH|62B#RJfQN?@yB5Q3ET+}zpX z!J%**)cuH;el-5aI^s3s{#3XEehhVf`G3m(?^X>s5>AC$Uz`0q;k~e*MKAv4zRUlm z%AZT0a-Yfna(EBy26g_)t(QF7sXY2x@+r=K4Ok1_V$s)UKLJXe4_fr1lYB(?utmRu z{x9JEI{2qWU$2sR9-f60;dH3`e`iGfDD>l$-(wd4KUX&SRJ+cw25bR!K69%W-2%80 zu7g^?xw_GR3wOZ_Z!r6@>cvlH{AGvLEdHbF#m|lSs{^}R{72P`pC0(@4_~qPkE&mW zpO4{I_>IMXiW+7v=fhkuFVyqu$NoS#6pn<`;7pj@_O5u6=MYPtI=|%BuOyF6uu3h{ z|A{a|ZF8Lk-VG1KRCSma)cK!n|B~+`I|dyqh*ZtjjIgiC)HOu)-F8d23#*3F;`n`ka`PQ1|`5Xvc&v#kQ z!5iei10J)~qvKt2qluRvCU^X+iSs(#%5$(2>hpN#Ii_zIF`uaQ+Vt{X*Zr~0Q~GP0 zr+hv{JwI|z4{~1D(hrHF^V9mj&N2O-i21ncJ-~BYiSsOd&TV;LN7X-L@n1yz-(;TW zoX|CocUArI_WyQB|8fpfIP#bCuHSdIdZX&=6Td%v621&|KW+N45%o6zweS-*pDGdc zYte6jd*BgR`DSyTnm}E@==Y*O0DptmV|T+DvUkO^<*DlxKf2yn?PKkCto9c%2R+wL zmia{0=TQDzaBcG+FMUVi+!HaLoNHTtQR|PYPow(f%EzYfjURnpKVp9!{2m^LRc|rR zcT=eCMZX9AK6nt`fL+ZqWbcY+%Tw1YessOD+UtIAqE9-08%w`pwZ8lJaf5c+1zeo1)lk=;iv4U#ce6vEhWi=dMasU)8M2qUZ1HS)O1-)tQT0jf zpTw8^ZT&uCnPa^4_cNzoV47Rac_|2WfBK@E2N%G%pw>6Q&)aYf+-vbK`scVm434nq z)73NiW`GyLd{E~TFMWr=`u_tPxib1uIXIbY&WDDS-jmiM2_e=7Wne|>)5w&b^keX-AG zIsdWR>-oIIdq?IW_33`w`l0>RRQ{%M&W^xX{TGO{|22G`B{jca8=KG5YE2A#H8&gv zN5NO&hL-03uTYk~h^zF6%gPF3oAk#jQ5a$bs}3#)${KTF{Ua1GoFw?kc@ws+}W zakT%adg;rr!5y9I0mAAmYuy!2h-#HKEEo#DxAw!mh;(H*%!gC z9Mt*8OJ5TIWg^DY_38Xv{m}aNBKA|;%iLY_=u4f$;4J8x&#&Z{qM3QmY=L{A&L=PX z`C(yL6qbe+VRGBM;<@tF`9;;&pw63Neb@xHg||Z;PusinVdLCwi5IK=Sp2>OC&6iO zHk=1_z45kp#dGDU^NXraL!Dp3EIfDe9?|}P;(3$j%cVbr-%5PGRO5Zx5NiL)t;0Vm+wynKqYCxQ&y_NV)|PoBxBk|1ET5?L%Fp5Qb5;TRSk}_dr0VC=rv-2k zEJB>3j(B44(u+>V(e;TR{rtvi|0KV!cmb|}^7DY4@1B?gtLa1Q(su7#W74w&zDW8Vut568gOa6SAE{s?vbdmZ(cr*5fV*Q@K1{3;Qz zI;;h|LCODI&!?}dU+OCsvL4&H%F4NF&AHHhb)BOn*vb5bwsY_e`RaZrSAO#y`K`3% z(=CbpnB<5z{Tzvxkv#Q#hf+^n2Gi6@lz@}HLT88yCqUI^uLL*nc6@l442=Aje6Lh*lq z`)As}J})ovUX}AA{j>E~+t*R{A9Kzxr@pZMBz{uu!^TV5!F(S`3$wzUP|qVD`-Nd~ zSSn6>o8R&l|55dc_~{7mg%4Z&Csp4Jf34wdurs_L>i$YRv3Kc3r{n1Q#E*^_tNrWL z@eX_+uCmk@Rj>Vihu^e!m~(qR%m{UTHv1p(vmgFu$=9Zn_&T1{y&ZoI$?FqKerwRJ zgVU0zUxMBH5$$K8e;vLF7eQU0&Nr&P)aSC3dUSkkFL~PZ(pQ@B$F9&`O8e5jMTehQ|z&s<*&b-qKCzh2s2 z8AR2uQ~9~_NveJWakjx7@I2~HXQ^M}iM>lNIvq#)FZGEZ)xH$5+Q)nT%b9;&RORQ&C#m{2#OVk- z!-CXZ#8SV+6ML6lbUKdoU+NP-x_`0S$9w*Aj%sqAR@0|1Ed45jF0B4JKKJB%L4D4b zd@tC;wR}$9*x8)xCQ$cptn&AhvX51tsPc2=lT>{R;ys-=C2kLtEVt*O>0m?pBeSXP9=*TCj`YZ8Y23`Yi zAznR8{Sr^?U3$^!IMRRVxA@Whi`72XdG}K93)lN+E9avl{j{C0+v)FozAt_Vx552T z_d~yLqvj{?=j6(-CGYpv@HW^3>U!d(?-nQjlINTFlh5Ued>@eSHS)c?8uLzoy1qy8 zBmSoIo)-I9_5H|8@^j^rRQ+Sbc@~a@wW<4NOZ^g0>|J`%={UMR@uT|}t9`uZ-|BAj zd2&1K2s^>a56nbu{nEMNs>Xs$YShZ(x7kvs2(!cns=z zt1R}9IrM8(Je&R)?*m)?w)`dEiF_`+0T04d_nUL3>v@~!RDN&Jp6674Zq=Uy(zjoz zNBdi${N0OAKIdZ9cU1Yg@=2<`GjV#resDMS{Aj6P;)%UWFFGAZ`Y-i~AKkxL?c+WF zAJqAk_j1_trJr{>@5kx4Jg>I%{t@SWbI9|*BboA*@2&C9w-WC~`CeCV6mG{U`puWG-SKt3E&eBtKU^N!1r3 zPDxl6&ZX`*E%i%0v3Kc3r{n1Q#EQO8 z0ZxX~pzepZcj;YmwEw93n&i0zcIjrmhYWmxCf>tPFhDi zv3Kc3r{n1Q#E+hTtoAdhOXjtSYg<1nQukb#y@#1=d8qTd8{M;T7@Q50OFtd|uQ=jm ze8A*i2EGC-KX~f%T3G47;Cc)E8h#ITeX-hqieFn?9WSb0=O^~(S^6RUnonNK;3`Y~ z((g;Tuj7e7TfE%LPIR_;+4RM!ryLAxp9}rvumHRY>i+BaQSGHZmz~t3<7<1#)25gC z=;xu9r9Q2HhWUimS4ZE%;$QZ=bN}s!%yanz?81BJSEn9^1q8b?}Oc757-wDhPobY@6x;CX#Y|57m%mSQTIXnU*YJl z_|yHh_4DmG`+JT#zXLbIolw^kRsSA-K2v^wwfIk}emVYD!8LFX+zWL*5>M=1deP}P zx<2uvE~!T5zd1;pOW;wEW94p zw9KO}`w6faY#ArL&2L+a|EPM&|8D&Ch664Bi?Sb9FMdX0Hx|BT@t;)v6Zm@?4uvnl z2~f{l;)%UWFFGAZ*C&2-yjblI_chPgQJA8ixjqkG2s1$)U)#I%t~lC%RQ(e2+yK9V zyDj;PemVD7!L@KJ+zxeq+TNwN#nJhSA001N`@H?le6NC~;MGvai>lXt6Y={Hd>Hnz z#IxDAK;H&-u-Myl5?|LRbyvsVXYeQZGyD^}>^Gs?2ETxwJ&==`<4F#t*(chkRq zPnz@a64dovhg~=LAnXCPegykRVO#u49Gm`A^q;{EQ0v9-HIJISYjLjcgL~oMa69K> zzvX1R{rPuuH$MAc7M`ML5D{T%ET!gpbR>Uh*rkG6N|ZE>WZ zlCSvD{fN~*-t&}mF`v2S9Bker1)=KK_ZmEbK<_d~xAqvj{?&*aMQW8S}O;d;0m>U!d( z|29tkCC`G)T|PGt@_8-aL*#qs7(O4STRy*kAusW#?R7t*>OUbb$e2Qty)BN;SN!OH#A+Y!c}|dX0W&>rp5LNS=Re~N>0c$z68JvMO`F7~CqHC#&^ zt-p_Rug|-!|5A_mm;On=j?=e``Mj?O+gd*V&*yu){2t{k=Dr>3&vl7g)>3~qtNdK~h<-VCYvAXwD0P&u)T8ZPdRrXnr{pVsbU$LXkM}&AtMe(JvvOYK{VeCz zb$;~wM9yqR3CBK)GpBv=&oHB>MIoB6h-q#QC zy-fURdwm|G>hI_I_wsY(Bl-ui>jxi&si`Bar5V9Z@m);de`;V%hN}ZL-_rhmPeK}xpSRU$l z_h8o#J_?6Io4yP8AAmjKV{kBZ*}L?%I67bPqvOSDzm_`I!;Nq=+zEF>9benK^sYGC ze^h-V^85ql=3ErCoDVryVfFR#b3c3*j+UHC?RiV6p*5D@%b!LK6e+x_f!|?M0d<`yyI-jNNe*jm*PvIAE4|LhP^sYGC ze^mXgdLFj^*NL;g&+(UKm|Xg%_;2Bemu;lUza%UR>q4Dhy!5p#{xi|X zOJF`&z|!AwV@&=N;4C-?>ij=qe=YnBZiL(6x6ozp(!1hl|55eXUoiETf!DwqQ2Q5s z9`5IdSHjA$Ds9fvH^jp#GfV%jV!{zTPlzwPn+I2;0>w#2j9--Et0e86IF(@A{Y zPpP{F{=S8O!N1}8FP{4RX!||r_rYJ_pU@RQs=egvvXgprd~Gjz+VpQy$477t{M1sP z=-=Z0Vz?B32*sbyPusint~lDip5JWpam`!K^+<=lIp?M|>VH@~8_3VKQ+u}$+C13HQBmOEWd!27o{Q#ApD<9Dh!tNRPJnT*#4_WHb_Ab3Gj`UOV6+gNk zvD(Lbo_90PnQ$ZL{1}w?U|!}d@4-tg{p_LqWx!7Cbw8r&H>>lyY#j=(oe}({OEqfY9H@;%DMQ0xlX1}b1eOOA6-~|D&`=c!*B82ZilP+oRZIx zd{fN(u@uz(%cT5$qU>YUFIM@v@)7-V?AE}~VG-&mYN-i_(geXt;(m*t?YXC?N3!sg08R{b%RpDQ2HpGO`S!fdb@b(FN!qwQUKTO8@9 zUzLf6~^1by+=3No$`m*Ck{9VEK5wVX|pOU;J zKUY4YPmf(@m;;ugj5v%xB+J992OZZs~Tk*YTBK!&-fjXYezNbS!LB+cReK%;c7rR%n z7rT2b@#d-eI;l9io}s)q_50G+e_Q?1uP6DQ_#)g4_gcO`UdQKrA6SRa`7Tg@FO<1` zOr5%(o0Y#C(aHDTSoL*Pey)5(pNL&6*d8t?zYi_-XnU957DxIi`HCOik67*FJ=9@BHQW{PKHH`Ms|E zUg{P;mt+n@IM*YgK3~)MeU$jCuk2&hkLUT9{9O5neiC-G;A`+1>KJONN87vfwm3Rp z@uT|@t9`uZxtYHQ-2>C}_b&4L1UZktTHgOpO*g;Kcn*$$W8fq>73zLydzao7NBfVe zuR)&g!MQU`eILND;0~zceTm&R_yhb2YJGbATn-DuvKIfMzli%;VGdXX7KOHWV(-$6 zPRG&tiXR;>R(t8g)zniNcCplF)87dJ2ii+|CV<$gt288(5Q~I%+RicT2X%fQp#K_v3;%-2r9X`SBaV0tsG~p3 zH_Oyh5>|pYK%H-kbHu(Kd31#j!eXi(TmEA2(u?kH6-W0^{OEYG+UvO_Qr{i$Cs=>B znWK)c?L~iaM16*k`lIBN&Z3w2zbl>1zpl41eyhRS&{n^;FOI$pyc$-4x_`0SOTMnS zQjd~DtK;ZFD?`~$k|U3ym>?LVsieEM=R%mpvA^s6Lw z$@h{k(EVo7=LtD4@u%nI@}EAL{lAR=PvKtpC)E9qs^5U0-O6to&a?I}`c3G!!5#1z zOcB!FrMJb=`Feg-!m--R_h9{e%XxXkasG0@X5M@GU{P2Cs&rG-VZRk@2Rl3Tw{kxL zHi7NoozNCf>|J`%={P!H@uTC#YTu1I9)!JMKllWE66*Nc-lccN(f*_A-yzRW;Ae1$ zCI6)A-^1SuxC(v&H$h#G#1ng$UUWK+u21~vc(K|arH;ShMX#IZFDEPlOF$i8?9wW` z%Pso!>`R>dTuU77e)cRHE_rqUcM(mSIpAP>Spe^18?(c`ci2e;z zm(DL<`g9im>)HPj?ts5q^n(_fJZHgq@MEa+|7wxZABUH|W3DfU@zNg%>3<=*tB8LS zY-P!(?%O8cjxefy*%Bgj1mI-wV|7Ax!hG$v-3fujnU4%>TctmpQ$$*vx6c zdxmM28tQpfSYq}o!)mZ5tP2~#kk!I`4w_!EW$j_z2YT;%)DW=gL#( z7gc{Ab?WCnkLCH7{rkDU1D4|)>U`>RU-a406;Eb;5&Rd87%ww=TRqiOJyG@P9R44` z{~M~W-LTXBO>X@F@|Xszk;k2ue4^?{<99r4ir+RC|55d?;#c~4AAW89Om4mONAi(= z+VV;6`9}3Gd4E7(d(zKgmU*44`lTxW$Inv!(#Q4WBYhlg$tMS&^SNO@SP+(grJ;Ub z#M|B#&y}anFRK1F>b(Aa^F5~BrFv*7D+A^aR}h6R=xKaao{-~>1o&W5Ytr*H?{ z1CPLz%Z=ZPuqu2M4uQHKt5kiu9?7=~ac+b+!H1!(p0gbs)Rp&q3sw+~-pI(1t$fbNVd%qu_W;zoOO~ zwLW>?gtq6dJo!mI{Vn;vM4w&rS&VL2$a%~~CwU5O`DXf$=C_c%x5DBp%zLjY)X!s7 z{So|LfWKO>DeMUcLme+xdx?9gihGA8UR3?X_!0jtxwiQ~vOoL3C1(HGuplfC1NEO{ z`kTq~4)_2ZWXbUd|{ zJ|}tQgIB@9Q1YJ2wa&jc`~8&uC5v8k;$L(VEqaN&i~E^=GyS|4>U@%_|5*7i=J20f z`nSnrIm}5O1uXfTYx;HME%Pc*-nMxqw_fHX`IK_x6ZQNo!rv!w4?F_(`4rt|rOSTE zoa-Dg4?NfGZFv^A25>69DaU|+CM~Iec|Kq zZ76wv&9$!ob@t~e{YHykbmCuhn=N{Yd&yxlk81EPsPjpx{wVRqe@ln|2ny z$Rp8`PgH#h{766Bac%2oa_gm!l8^M=mQU3A4x_#?Z~^=l9)Q0?eV$^q|3CJ=1U`x) z`+u5n1VkpRh*41jL`lR06onDQ1QO_m89-6M17%h4z=JgtK{+Lf(vG8eyW+a2>xwrX zi{P1nkbsK80}nhv6bXX@q7X#M|NE_eHJLQFBpe>UKmAG9>u=YqdaqvHM^Cie2X*|F zPB}hGs9WBi;y+8`&lft@L!M5b<{$9~^B0MoYO9aA)v@PQLQ90cCDd)-;U4^Nc<|RX z{{1AL6rp=7{Qf^V>2{}YvE<)}Le~r3F0{7#{Za8B=CWH@@I;~R^aecm$9VA9HU3nO z_`UR*BK$={qe6ALbnE|!_&+Cfj?kBdy7|5I@rwT|S2?I_cy~FfYxvhZ%AZ&Hsw@8? zQV&iMnkBT4(7r;0Lf!VfNZ#Kl^gf|4?BiFax}uKusVn~!SNzZH#Qt@SzpngsEf0@u zbK2qOg}(Q*gSQFo^^1f12;HIl$@_@Vbwam#@Q?T4U+=*`)PvtE{{DN2KWqE1_fKwn zJ+~8kdFkU7e~QG{Md-hT&J^mle})JD3=jTf4}P5vcl<9&xp-A*UBkQWRonQy%3odW z`HtxQlTdBfY!CayJor!c;4k&yAFzk`!xE1!2ipZFdDNFy@?O{5X@Vc{;P33ge}@Nu z3lDy;_#5mY{;xgs(RTK-kC%L}_`LFSPsOk6gU&y#pKf1u`PTaB_SCDr__N3NfYgtN zh3;v6|LXByF8xe_&>2EEd-Ol~9{h{s{R*L9|HZ;rh`t+yZmOgHwGID7mD8^;7W$6R zFNM1Mzf50C^(rj%CZYEW{k{2TiQFYZKM?wj(6vI>33cnI_0BV#bUj_qp(R4y{F-l! z@J|x@oY3E!e~HN5F0`5GeT;|xe|G*f(K|zEhd*h0?hw5m5~|BhZS&uqU$u?zP$|bd z3-48aD@EUyNlrQMC3KijxBh>1{@W#8_X?dY^h==|gl-n-$IXpC$U_3mxmBpSGvwAMpqC7l~bKtIu4~ce&8@LX#Uf`Qpxx|KIrM)zLn6Xz3{-VYOcq0lixuM;|6s5`uV|A6>EEOd_0 zmxaD6)Ez!8+0oMyY74CrI=8Xoe{vIt{$Andx#YhsdaMw7oal4BP%r&DOFZuMJtptn z>3L4x?@WHWhdp$>I}5M%cgx@1{7CjlZ*BAQED5j6!J%UB!LD-fqeuGpcKEAB?hQg` z2wgAqd!b(XUEz_wlO=ub{OILMznA>4M6Nr$j#t~yE4gYdA=xCu233cnAA@BRT z_^0e4{$&!+iTgWxnL=+B>eff|ALHV`&V#>F;y=X2fA${Y|48EbROlw5n?2&MEB^t_ z9J?GLG$6FQP`7qbzeM5*3r$UN3kLK@EOa98{PW-jyUnlXd7rI&KPePLp zaN=ty)UBU8{Lc7yCdVCrUHKmrz1xbu_X&N-L;pKH_#gA&4-5ZTq2q-X39V~hhHn{_(^Cz4}HD(w7uN+sVl#>cWamZx_IcL z`46lmzm8YukB;|bkNE4#?^PZymH0;s&GV4AyW#&W@%~5XvqE3+kauHCr<_NG&J_BT zP3oR6C3w859DDT$_HBz1M$wGIRzvID9d;y{Tg z{-^86|ELH5v4=YP_Yyi;XrWNI{(GBW>(N`}4-gvm(5J5a<0T$#ulcOK%DhuWsMuKd^6G5+gXIrgNTEjwJzK(^ z_a_an_0;LTM)dCQp|6|2pYVC{>-cVzcyAZ_u+XQ477JY=bfeI%LYs=51B4za^cbO8 zLf!eJ<=-OlX!(x|*78dQYxzG2*7E%lzm}irlHbQeer@G05qY~RSLcH}{qFqI_VCKD z!IBPlxxK(6eVaY%%Onr}JNGibuD_E-PF>|)F5#XQ{SR*K)cZC<-S&OBjpIL{twV1X zx>0DycFz0tLfzpz2wzvBrqH0!M1f70+;Po4hzMQ?Zd|LLK>JN(_k=f$t%e^TVU zD6~}QyFyn9)%MSlc>4%FOXzT+R|~yXXhf(xzqI`4C4Mb`iA(-km;7E5pO$~FU@bpi zu$F(jhy2>g)%M?2xjG-*>38RswuhFd?d_F+4@$b+<@za)^tKQ?>hg87V7I*a9^s#@ zW&PY+;cMGIc*%cR+MzO`IzD&$fAL8FbF~cLINfQd-1&W-ye|}bm(YKD@TW@qsrA+E z=WuC1z4Y%Y@tHy&_K5!_iRX2pZwUQZs9XP(G$&o$;@9!_l6Z#-y-?_Aq2q*V`LhJS zD0Gp~a-m-etq{6RsN0@eeqZs|@-GvtxIv?EWcjuS3hnA<)>y>}aBwg-uo9dC?`{eyLq4ke)%2&3~vpYEWWufOD z~KU7dxx^{*?xwud{NmwBZ38hL-M&?!Q1{EP6v zyp!^x?NQtGJ-L(kyvpC7CH`HlKeg3=ir8mY>!S{rE9Ko1I?$v1d+`nS;15W*=p{lg z7wXPm-9GB}OUu{wWoPoj(mw0)(9ZbJI@W0)FA+LX=-ooy`aK};pA!1M&@Vjr#~kOx zKThbqLjNVy9sl5t4*x|$!$PkW>gK;q-hU!=qtMDd#GiJ&qfe&L9zur*b?bAEy#Kq< zBBB4SBmV<+Ei^3Dt^eNU*Ls{J@=q0dk%vBY<-c6wai?>vNBlR+ z`+H7ocyh={)Ky){~vXX|FRPu{SQ0Ip@W6q*2Tf@^0`&`8wy`bp@#_V zE8+V8NyBSBb$UmN-aS0@b@O)TAsGISN`25>2jCre|e<0zSvQhuknK2@}Bny z|6nca=iUlm+xEdr{u9y;%@L~ObEp4XkMuuO%kW!0!e4fZ(|(18774Y5y30qhw4YjE z-F^;~_R~xM42iF+&^tWhe_Y~uM(7Jd7YTLi;|nsg~8urkquKeRA9(Ou#^@#rgdH+{_I7w( zo<9*icBao~!neVtci2P!Vrf5oQor2w*j*nsNc)^B?MVk$z1~y&P3joG=0C2M`ur&A zXee^(8osvaAJ)TZpRN@8?5Pg^pHR2G_BOxPBTw}CP-v#;bG*>UJoIyi|L;!tb^NPD zPNmQ!36~=DP@!7>K*2+VUMh67&?!P~q0@!B?WyIjb;)lc{91ln!CL+x!CL<1g0=i2 z!CL-9g5C19-0wubmfKADwcJd>yDC@bgIm5kzqCEHJe}UhJoJBB-n+}~91s4dvYhh$ znoy&sgBu8S>$kW0wI1_DpZ3{~KGzDJB6O=zw|?&Mn|H#m<3B<8Ore8>4i`E~sFpuN z@S{TK3N04;uF#K##)P`{)$&gke=YxP!CL;+g0=jI1#9`Q2-fmH5Uk~YFW4<#%k3fl zTJCv*wcKk3@2Xs#4{rJH{L=Q&@^pH)dg#Ah-n+|fvPb#7N#4hV{vfndFQ=UK&2i`x zLW8{>e49|W{_jcnH9`jn-;h6uU+baMw?*_ym-M;yuPeW{hdZ5Td!%=yyuVcF)k4So zMfjf(`)PZ+%Zs*0ZPR!EPU7<_e}9(vceVc1R{yKTKD$~Ub+{9yya$A4d6a)IzTO`E znbI!kd|H(2v=5D?JU0`n%Z0nXH57l%-&}Bx(B0*)t3KU!Gd;T-es}HJ*h7CW`wx_S zy;kV&9sV7cT;0zYQjY2iZ7S4V9zK%r%Z09V#pmXqEB09^^gW@=h5p|BT7PYKo&HT8 z`qY)*%f4Rmm$>Yw_0jg9A@y>mNBz7<^65dL&k3FFk$>)Tr{#4K{;P%RdaUKYJ{MUK# zZ;|*9a`B(NhxivtJcpT%{vCy0Ak?k@8sTr^;_tbK`0ti@eiWK)IeHBc>eff|f9v8u z*@J(M@O|RqKV%Q_KP~b2`#O533O!BeW&ND@ZwkFU!S{Lrj+-ygbw#8|6Y6}J@_qY7j!;V1fBLFQ_AzPLUp-t*S90ZU-Neo ze38)I<*%zg=j>*Bb~pU)+B4Hbe=qxwmVEuE(BC`!dY4??&$N+plrHpWq3-ffDdD#X zH6;By9d7=Q#ecQXO+vQ`{k{3M{#sw1{sVTB-rDke+1D%nl^*$_?O!bQvdp7?z9@Q^ z2z^)RGLQ7Q%biaD5aGXFsIJFa{yGo&=L!GCLdOanFVvmCx_#8`mzJ;V%g*E#O8czG zLp$UDSAVB{d|K$n0S^9As9V3i&9C)%Ui3Lg^te>$)j}&g^mB(_y%T;Ne>>spDzul- zfkMv_s^w1;e2>t_gw7H=Pv|0{%Z0k_spTIf{#t%t!CL+Wg0=iR1Z(+E3fA%$2-fny z6zrC-cP>$kW0wH`^QIeJ_ybgs~OLIWQ9xx=3%d|v!I{yd3ys?a-x&Jg;9P%VFj;BSO( z73vdte-nDJ&<;Y~_SEvPlki&peS)?8=LBo{s|0KLKMU6K4|K^t-b22YJ5j=Gxeo}| za<%<;Rj$qlclzD=rR|~R>GXQ#Uk^!_yWE-{>1{m7DOagNj}_Wms9V4O@_v}mLZP>M z@E>x96aR%mUl6)ls5}0>&EHPs4ix&T(9b;dsVjfB#A6CwBJ=}~`0L7lhQy=oxl*u~ zJ@+=hwvX0F+tW**y`8^xjsJ)G_ zo$=2T{-r`c6Ivnk7opb|UJ&u-myL!Z5SAMPM zeiGl|LXYx@U+bym+#!5F{=xhoh#hB&9xr(4qxrP{i-qsKJ;d*2p960-B3w4*zz0LoK z=<~SH|A-!sdFZ40o)Lb{_p}H9eBmn-I$QW&{)70n-b+Ovt@j%q`e;6#Uz*P=zjl>> zv*@Gaukg@kneb`;MZ&i;{uL5#qeuAnB%ZH!65n_`U40xB0alv_9GnUi#EE zfA)6$(|TX+vg2vzIPHVGJ@~8h?y&nDmuHXUO}b{_Y-5_!;v4t~Cv^G0Dt2(sH0`g~@U3!2P9x49l07*4%bMl08pTBSu-ehmCpKgRxtw>IK%0izn6umq>*(%LRPiCyK zrX#aU>!-`>PQ|(Y*;ONP9qVshNPnMc&$l8C%}CaozLD`AGt5YzRI^*3wD3V@)HFIjHigs_9yB&KRi;C5<7la}grKiN2n@eK}FRiLKtZ48ss9P1ZSDW@Hq8-rYpuJX5 z<&L@{fbw*!n~?u!3^MKaoXodMdyBHYlO1Inl4w)s_-A*^-dt*g8wMlel4D8M()FfY z5;V3#Q>E5CC2MmMILyd7DX}Ev0{l$-^Pv5cD7k^g)TY!)bgSoY?bGFR&_L7PW=2#a zf})aY+WVOW#aX7^Yiuw&E=Btk6sO=-iWwa@Py|WBBPTKmX2HVbxR8SRWAW@5i<(rB z!?G7@W5xE)&_OEx1=*)B0Nw|08hEZLeA zZe)&HYME7w%}BpAGm@8KW-c}Z-{&LMPN`Jyl%E6+REEztjg96@CD$i4YSyajXwxn; zw|r@qtZfjCbpOyCHP13LOM;_Tb`9E%*75Z&61yzthp~uV z^efGgSuh{9eh;>1j7@~@q&;K(-)2S|u-7o{Bxswg0wRKV9bg;kiqGFVtGfNzo$wsL zp#LgZm!d~6`5y)CFO?3KU1~*IqyNvp;B^!FiDL7iWEy%a1xH?gVOQUFv$R(h7<^_V z_ai(ftLM@rMbM{Mc55|$@R>!$=*q$kExVx=>0(7DI*GNadZ!={I-2%J=u=YS?c}c{ z{MXt8j=zwCR12MG@EjWT&9Nrht}K!2(3MUd0ysR(FG;qOZa&F^GV5Qmcnjs@JXgYCcS+$BS0ri*QSr zb&W1O)$y5;31ucy+d#?DV+f8mUG{bQAyD6RBtJ?G3 zEdRT!A6gU7`d6z|y6m;bO0Dm{kc+b@`Pf{F6N@hnvtYnWcV5@ zGQL&DoLP90-7cq9azSNU$o?h2{($JwUHV7sx9b@xY&Q*_m=EM52PVwnd?m=CTkb3; z#WGyOYr$wzt*)=7QG{JuwRCFkGYq3V{jcRd)6;fhM4_4!jO5M=8QXLGuc4Z3$G|#h zZ**cQD$YL$8glw#M!P3P!bxcbOPun@d#(yau1pTXfSF6trZ-?S{Z;nsR3QJ5*h$ta60A{8 zHa3!n0 zONXDO0B)k7DD60$86$xpU2m!T4sg|G%w@^g~v%wJZ8q;2d3#s0b!l-4_P z_lr-q8i>?X(-^yR262J(0n`t2`}V@^Z&y$XvlrezQF zh3pY%GjmZtb1|-YBbBD|SGQ^^AFAPekNSiuYknCG_KFN*nm}`9x?tuej#{kO_3*~> zKl24w3IeOHi5t;j&c#@011$)aQgiN^&eeccJjpbQ&A>;dzb6uW1*+o}C}A-jH)8Cx z$h1)gi!j=GLuy=V?ATxDMd5esrH4(bER86}$myJ5H2pK$GGzQ5K1kKG{4&SXtOice zx1#5MfeJSP!>k{}Sn|UBI20Y9jsX_OLs+HxPK7|3N1e_8Dq(;XYZ9`*k%5)UplJOp zG=gQwws}DtHPRVijhwcV@fGUJuZ^$J#xj#teMuO5v1h{gF>$r@ln z47%ITR4fA|!`lABH(BtI`N7EXk-o`xsJx`2o*jDMRlm@^g^D)kM8;)=JLlTJWS4wf zFOvIyc3?razvqHrF2VNvRqN|*cLf~E8fp*Ra88&Nv!3_X*q!j<#{O6NsyWU zTxNse{Hb9vs0XfBoN zMHi!%As5O_I~7AuRFRKjtvU2F?H;CG89PAx;XPI-g)ebXJ0F8hXT6j5F$3HEclJ*8 z7haAPRd@Qa3^V!KRG+_S06fh|HkPtd%)nw~Leab7?vt-e^@R_Kb&khpMzBr;pX2D0 zpSdtQ)i48<{yVc$7xq+-roAx#@rrtkEYK<36)Q0nbC?qVr<;+}P^FJI?SCMS&0(Ym zYd{of_jG6=ISk){$uUeoxF*z`qCoo!8)i6U2is879-SOR>K0>>(nbtTO#3wWGNNRv zvJjoJk_S&jQs0p=5S(NK4b($hWcNkv*~zifR0Mc1O}iu1!rOm^p1WR&-)VRU9$*OJlRxJUh}mqhLi+L8Xyjb2fr_)H)N2xi_=! zn)H0wj5N&UfUVfHzYk}c5m=*Wk!34*2z+Ylk43^J@X!CzjP^_pA&@_JUNC~EMaVhi zhlPom8DS2hq?BXP*0z#k&4YGhhzR@?vdggA7|Bky?8=;*PEW-$W4I?oBA*y!B8<@m z%eeMw%CODNNV9lWGn0^gkb~SfE#;>EsZ;x=T7eBgf6lzz!gu|Jv#?|jh5Ut&s)t44 z1G8CPhs{s4KYF5w2`R=+15?A<2v#%|#TBK;0IySms!J>cvBaWi*jGC=&@9}`vL2+`$0erCQp;$tn?3B0+qo#

CQ+Eho(B2j+^ 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

qFhW2OJRz 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 QN9n&`W*J1r{J6R27D!}V!bP0qYU&l0^i9@ z_$V*L!MQ2QNAEMC%lf%#A2#I$l6wldB_$;;=shQNS=*ZAoaEbUu*>URk;^FV+^a#K z@(mXC_I%>7KX`*LK>74IVCPdgipN0k)l$COF7(kl8UsE{8L_XldEa%ij$(+vtniOF z>vfplMDTS`zC<&h!+K8zpJzGIm(l%HSxmx4<@?C2&tczM0e{CUpO@{t)Fk8c8Tl&$ z`cGC8J2LWX4ESQ-fG-hzOO!98c~1pjxbo3_@Z}_rl*M6Z+8gk-0AFM#{Zc=n;0sf} zboa%k^ASw6JjFb1RDOC-3tiTW8T*ywyzwWhs`!=O-$Ix5N#^UO5RymH+9KCq#L~q% z>7Ru^LCQz(ccIJL$F#pVS>n*e|9+OjA6p!0{-Ak} zgZ?Dt3sFAn29tjM9F_F0fL^bbqPK_g8+x@)exdp5t9^?O?sW!oeKSy0MS2} zrSQjQw?jTDi<_9f%2(0Mr*#_N3fK{%d|S2M`mxClhkQB)dQ+4?qjee$zRSvY#N5B? zBR`bHc)~xE@#t$8@O=|g|4#hij+=s_ZAGq?S-(SkjDdbX<)io6&}F@4I$t}9+ntcJ zb`kybo*S0iF)7oyT>-noyNcXE5wp*agI$H-pOeZ*@4;dH2Tb~%j5`(j1A2=7DQ5i+ z=jgIX`g@fRM+doVaiUd<*B0PQP`;_!Zp4$;X`YV3-deq+UwUs2UDgem+ZzM@@qI+j zRUDH3vKZG%<FY-A{W`=q%~xbUv5(%zLzgvc=Ht2z{r&?)uBV9E^*h8-XZSZ#`RIK;bXjjrOdF?8 z;(Gzb#|Y7X#Aesb$!X=B#NQZvC>szaa-q_lQ@fr*|3>Ab_x#Xh-E7itvWw#J8hz+H zPV}!OA-Zhy=@8%Ub+I2QUq6hLMM3;53$zCV^m<9du6GYBc zeABpgg72jAWfXtcz!$508O5LbC)gj~K%Y1G!ry=|5PW?z>6iA4vo!z8*PNV$%epus zZQMBA&!&PuMEU7AxXi!Y#P9HZTbi%%2=S+(KZj`^9Q1bvf0Xi<7WEcuZWF(@ll?Sb z>G)ro>~Y|abKs}Yq|5ry#IN>H9!my)tlC5GFQUtO)x_T_{qM2MlK-d5xaqw{EO*p2 z4kzoy!w>myrpTpxJ|$`_WLE_A-%~z%?-5cd~9~D*SkK>pUUrQJ(1pM z==C?-JIuLW;!kwoZ-hEs)*i0;-Tg4Xs^8%6i?8e@4D`VxI@*BkGXw)BBz1dXs*h zqMr`&B1i8%;>)%#nEIi7TeczQ^N8^4d!X$5h>DZ_E6ASjg)c_itvgKPc8Jq4(Cc+n z`1SozPW48EZ`yI;OLsmn*~{?+{=O%Kf1cW5_|bHKMEvduqRYxp?~&rmg+F-x!+&A= ze0Qa?TOXR%zv=k}^%IPKl2k4;zY~8l`bjt=;|RC)bJ*06L;gMs{a$BI(-K9$zfHe+{v7-o3jU4C|D}!prO6(LxDITL zcv60SFIKv^CVR(#FaDC)k?wh_o=b@@8hj^}4@*og+q`O(_|AeaMfrlY-59^tDSjKl zPqluLe(AkgbXfbDS4589OU0M1ABTB~BYUn2AHAO{4WAQx>X5&$3qQTDiZ1I_)49MTNAXe?K@z6F zm!|hT@ny5e34b8?mpqVuGUF#dCBm+~`u-St&lFwO8yVY0avm7J<$uzTz6KuOYslQc zPhp?+vB+iQ-;zxcPs;Zu{#^lk0{%AncSpwKApb_7AFD-=L2uySo#3yK<<0oXPt`GA ze|OIe@DZvq6LNDh|8HKyG-kz`nd)nQ*I@%=X;BOC%!?UpPZxVLgubcRt?DtPGo@pva??vM)gY_JWeyl~LALBl1gQ*{f zyc7-o3d;YZ&92oZeuw=ik>*4BZTo=rs)=9qke}RPgpJ?NrvHqIU+v-e2md|QKi0;7 zz{GFz6UhZb&bO$Ho8G@hm-T{4&NPpdzXMyMzhWZyfTi%q=3j?>Z4CI5^mvFz{Bqg& zv>I{D&C)Ha#b=CSDDWNB`vKnub_Kq6v-o_ZbziL)RQw$eLc3(K_*@1q1K)mN!K{{2 z%YY<5PjLpYIqIXeJ_Ps?>fM0&O=jKCfn-N(r8fbR9rb`D=d11S0ZHyHAjx@XdlulQ zXn*p(^m`vj^#mZv9|MxyP9VvBr}S@tRnR^bNcIj_>T z766j{SMh*~Y&C-wb0ZD!h@Cxd4f#pyi2Ye0rkxCz+^bSgI z0(=F!pVDh8y}Z(k0sjTPfYNg+{a?JVne;ydz6AXQkjB*kNaJn=BzqbFY5X5){R71^ zz#eEX0c-*E1oj46fz8}3b=`muF@I0?yIJsEtGda+%Aj8ZzJ+!36R->FCxK+geqc5? zOQ~%@>UX2!3dKku`MZfIp!=Tk8=(J0S6Y0xV#$_*4g`g8wZb^_Le&{>-6h0h0VvyuY1rDUjqR0!cm$Nb?^A zB>7H2nzum3nn3bL6(ISeJdpGh0g~Td>=3`*1=4)&R_qF-{M8Of`KuL>@>dfe<*!qC zQPdj99|A5z9L!W~0=$9x+-=g{9Z31B9gx=DFuaGK^!5Y(2|e9`q_-3B3NR2@3H0k& zT<-(t0OO&rzhWcBlr5s?F7PhoZU9NoW#Ap)k3bstDIkse2$1^U1*HBr1F8RLAjz!+ zQvVBp#5YB86p;8sfaHgMK;rKXBtLWll6`)_+o)I9dPU%M)c^fX=qD5p0&#XOwOZ>7 zfyCEW>s^31P%jN!5C6Ueq&$!fNcvynWtHTg$-qsZ_XW~CGzXF$?<$_$Eb<$H_@^0s zmI0U3yZ}iq0!aMhfyvPO36T7q3rOR4Q~Hx{-7LR>Zx4|2Yb22DnFvgRTnixaHw2Qs zwUk~SNaH99j7ED9I;H+v14&;YAnCgf<7l3K2GTs81CqYOin|pTDb5Cxo&i9zBM3Xnu5u6O|dZUyPvuDA(E@>7BM%*SUmko+GCBz@h1q~|XThU~ftB>D4-`xVzK z&QlzxI8d>(qQ7EoAjMG?Adai0DgY^tN&|7ME>&FVo=VTD^ejq$x=!RD04Z*70ZINE zkm5E0NOm3rLd0hmkj4`Y{1x<-K#H3Vz<$7wfy7@0Nd9;mNbA1QvENPuQXGXTy(f_7wY6eRZLb6*x!Y@HzV`tWkheAf$RML_)@2T~jz0@8T418F=Pfz;0+Alcm&Nd0{Qr1-C@_1r+>%L*hv zKL1AS{TYam@;MHq{cj(T_P-H8S~s5qss9FwK8l4Evnck756-etXE0Fa6u~PC` z60imMe+AO{VF8f%dI3Wq*AX}k?S9%`2uSkTfMnlyE8HwIKyLvY2doClPsKZ^Y(ASPe-1RRGes3j?X&)TKiINwJ<{9w5zc79gh3 z=l&Am`$2IIkmhj`kj`hLfuy%F5L=5+5nw)?BdkEO(*h*>o-dYoN(NFq-2{^T@rrvC zwjM;9RZ zqdk!HHv^L0en8S+8%X-A0!e=*rI!ZMK3!bt1%b3r=K_+R)UO3ofTZs(ko<51Nct`V z$qy%iGvSAWK#GePAnl9mfHaN|fpb7F2_%1I15zAaixk`sB>Ba_*}&;Q+84(INiGyf z{DXm%7pefsFU7Ro4R{Of_vZ@V4#kB)+SjLOeGKq-)IS2!_&(6~GC;}`578OL#R(vd zV;?XH{F8vhKMF{84pw>>Anm8Efz#2x3C5G1OMs-W8<6z*0%@Kq0BN4QfTXX0;?r4D ze+VS`Q$Xtf5RlfvW+1JvSxWD%SQAKkDr?;XNOEpKl6wSWNiG3MdV2uLj`l#3YoJ(J zvAAM(#m6&*?{~#>iu)ATDJ}(4e9Q&XJ~|CZ@i75N`{*d8hbXI)=$%K~AVPhlX9(;Z0r=qos%;%qOF_R-});-3qoagPJizB3d^>#(oVKT@m= zB))&9Nq+nbh$;2C0VF+VfHa@`71wL~G9byd1=2iM0n$EN3P^tU1d@CXAnQl)Q~d#u z>RYwGR_k-MK1u6?wccCn?SN!QV<5%RCqNokRUnP40+94Sn!kUpch>>Lh7D2c$S&0VF#kfn?_drH24%Uu_4ZeYG(VA>oq` zNcwM06g?+^l(*u6w6E?1(!LrBBtCy&2;}MjX z-wzkQt3Y~=@EwrOW0Qd7|4xckfVBRK0%<%sfi#b9T2C1-{7V#z1Ia)6faHhNabm|U zAnDzw*i6w6h_45hssW_!+;cL{eWbDb46bu`C;=IiI4F>{MOy4Fp%;>ZXo&J9Y}fM)o9r_rUTo6bsUiH zSDPyq0n+~2b(FMM1yaA|fYfijuS9PR;8p0W3?#kffs`-2fRqoeg~>P)fi#Y@K$735 z7z?C$o&zio?5*`$ik?6k$NG_?XBCk2ECQ0A89*9eIFRi43P^Sg1(F>Dl->y$(q88Uds@905!Me|um@*wFw;^H&o{ zauy)@>zh!qa~!Y(nnHlIpZ5lmTqhv$r4GY$I{fcbAo<}Tus!NYK@tv`(66`zJusTM|h9<_FSxcs)ec z+if7pT?3NbJ|O9jRonn1`3NB0zlH(n{&fhD^mPSN{>Tm_JO4$pA^AIsKPnzn+@!cr zF+wp!v9qGTVjUpGO;sT6zm>4Ho%7ffUDgfh2zeNO61- zNcNrp(){cN(zrGNY5$D^Qv8hu_5*eS5`P;Y`Q;NJ?^8hDr3TqzPN=|1xlZ7;0t*@0yLp8mo= z6G;4HffSb`faJ$uAdRmwko;8wNbBlRKZ)1-K-%Z80*UV;kmm0Q@EhP7Ag#~2K-%Xg z0%@PG4y1MI4J0`)Aj#zik{uQx?YnpS%D#IE*bem7K$?ePK;ruxNO>#(Nc(P6Anm*E zK;paHNA}&bK-zbA0I7W{kmQF0$q%J~wC~3CmVI|EkoZOci7yyP`)*wz#ZMj}t+Ri6 ziT!^9Y5m>-()#@kNb_<@=|2D|KGp!qeD) z^nVWY#QkG6AlXp?Nd0*M$)80O-4*}tE_@Gx%|XAW^`EqURO|bI^tszwtuF0FQ=FfNOooc5?^vRsow+=|9K$k`5s90t=hg8NP5~S zHU-kWdGR0FK$_i>QzpN~EQ(&wJP0!jWHko<9S`K=NZakk)A*Af5ZZ)b`>)?(Yl1TR@u6T|m08S`DQ2*9}PPsUwi`s=s1QAjww- zl3a1E=hylxBuS$G4@mSYT0gJ#O+fPJG9dLc0?2t5NOB))-COJbqvVP9V?fHE`+<}{ z7XfLW=K$$*#K}PV{O~Iv=@|&5{_6p0T*ZN;=icXnzX0ieCR*zuK(Z?kNb}bcNcpre zkn-sRBxh{pKEDAekM0E$|0W=fqa~2?XEKsB-M8EZl6_}@ls9JsX+AmvY5lfRdSf8v zvwA>Z=&uf}2)Z|r;`A3B%5o#mZBSeUr1@w8r1+~3qpB(FF zG_JWo&YM~v45YjnsP)!B%9~GHN#48bTs z$=_Llv|dtM%6j<&NO|l!kn-3iAmyv(pv;ba!HK^M*-=37oP#&1r`L7z9FBwSq1~&22y=;Bf)zOMeZt) z`s)NFyW0XOk2C{P{`CV=fA47f?+t|hf0ph7YO7)kAl(h?$#v~(lgU5a!FURpXu zDQP4mMd^^1PH7~Sly0R#l;Bfv>@%~^%s%IRKkBZLYjof9FPrPSmAFuPzotvCH%WTEG1BV|lwPl=^m^^2 z*J~-gPF>nHXkRND*4-j~pR1+gW=ro!9l25SyeSeXqJi2sr2Dr>_qU=yjclR)zV>mX zh^`txDPu)MBpyn;7wrz1P`Z92NzZq@aA^N7ecwCqSDYnJDt>}IA=}E=T0g#gETc(3 zKMxBF+m%rLR9%FkHV?dfs+&hx$uOpF=L`I!jACsr38v z9onx8g!kxwGM1j_E7I4Uk>%te>HFCueceXs_wHip__@+?Q>EAGC4GGd`diZf8CGJv zsPuffq~}W`Jzs3;`+Ax`{JE^#(tj@Ny!4;TIwiH`#g52ZdJk`sv31=V>AIRNlj!q% zf^4Gp23yv$T^E(5=e?dM%=^3adG@5;Lb~2k(T+{~ zMeZ=)KIwecNykl*uAi~e^)o`ceg;a{PY3Ds5=mbdS-Sqd%B9akwcALaV}0p;s!Y42 z^tt7xok{xql1iUn9Qvb3*TvJE;Xdz5Uw1`1{+M+90qMA1((BBUUiSz3$I#ywyD;8D zdcOM7^Hq|bFTeDk=gT5pHy=pXO=9V~i7Q<<&vJyixi4Ke7p3dwh;-fTk*=Hd(seUm zZqUBXl+N=9>AEQ*{dt~Gx^9w4*G+_U-CW8Z>Sn(5d44K=E|sLurL^?96p=ocCE3Dx z{3KmJ5nVD&rzi7?!`ypx;xVG7p3D* zNyif(hw)C*dHhd$zS`3BRc5@jY_I;b((5OqeJ5*}|GM<}X6f-Y zv`0(V=@8nju?GF6X{VKM=cRooOK4w|u7{)2^{`XA9=1x?!+Pm@m?QljnJQfm!=>xt zYw3FEEL{)HrR$-VT&MG?EWJ;qr0d~o=1>n8r0Zd;bUnmtTy|490})Y9?sq~qU_j*F09=Un=*?w`{A zzf1RTz+V`jDLvl=>G=jp&)1vrF4Fr~OM3lEv{N&ll=iAG4hU01WD>uQ{IT@8?H zbe_GX_oK6PT_u)&&%~9kt2=2!T^*IKt2NSfHAVWqx=PUZ)J}K9ugiE!}?>4>7(&dcL*N z^UafGLfreZD!Q&o{mF`6iY=->7nx_VrbY zkk3Qu^PMbxzGJ1&x2yDfqp|e)mXJQ*tkRzc_mYSE`&;_H{-nKE`hGUhUM78CGo|COHaZ|V7tNYA%f zdS6#a@9S*oeVryh*1k@X-q!)r``TN2Ut3A3uCBUGLeYKc^#T|M`BnpB>WkuA;qA`u={R{k`;k_LsiT z9`t`Hy?@Q5_qo3Gb=9Qfi%G{9kdDhCy-qCYeU702Y0}Vt9nVUSAC#VNhxB|arRQ6~ z_)O{dKtJjAd(y7Pcsbh18Gn!V?Ihv3z9N17Zv2J*nY8=KxAW4jM!T5wIp>x>=XBEN zoKk+Qb50_C&XJ_g`FY}S&ex^S`Ly&oACf-jZPMqwOzPi~O1VIKpJqs(a~bL9r>OKf zr<6YDNYdwgIZ-(0ee$*5PqU=&>s#8rX*Z)?NBaF(K|WS|A$d+_pq)~>UgFXJ=X>G( z*a@E{4D0-h-%HQaT>8D3Q2P8LOW((X1fhLX`aI9jJ}iB%+oaERE&WTR>t&Yo{{JX_ z-6-k!KJslHO2>7OUZ=A3x+Uo^M1Lks&Ujqu`65ftcRzlZ?}qgE*9-C&-Tz7H@2`jD z61i3S+*e7T`&{XBpCNtjlcmpnp!B(aBmI20kv{i^(&t`F`rJ!PpL=e(So3FD#}4PaSNeS0OYd`I>3plxE-SsSg=y!M-rv;H=arcLccjnl z*}Ea1d(zk4l#V|w9sj3v+;7tB%#dDpBK@Q2{|ehO-dK9R&!p!oCp}+o>GR7VeSYsr zpWnOE=NDD_{2s*$=l7rV`JI+NzeCdJw@do`)=Hn>&r*LUHRW{aJSR$@Ut#IzHjniA zC6YeB*D=HSotHkpIr5a^^Gcsz7U}a#Cw+d&rO$8RJ9;h^*A_pLUT<3r-JgCvXSDRM z@ARWx6-#0S+X|YcZXacyGpP7DV~ZJ>FwX6IxPL`QTwF--qS=m zOb(Zh?~3)YFrJPY&T*e~{=d>*E`4r4)1D%Ie&0!--vIi%N!LXS>3VJ~-=4R8d*0IV z#iiqNO0V;-bp1r4|5=pKe-%$ikMEP7Z@ct-E2QU}CS5;crR%4kbp7;{uAffQ_0vrH z`EMXyKjozBr-*d@<1MB0Xd*pdb?Ny&mfqJK()*f1dS4Ss?`s_CeSQ5#{|lOWFHSg;>>E~*? zd{<7w@^XacDIop(bMHt$ch6ph_!-jsF-Cgbp7=ld8%Xa%722g}=b@chdVk)R-k-Si zN2ULv{<53xM|@`MGplZRxnO(s9M4 zD*Z3@m+jntPrCn#bo@E`58-xPBOUjPbbhm?*PSH2?hxs9zmbmX!gx!@ z>o8tSx^8ky*G($vx=AKoHwmTd=GF61H;<+3=CX9%9G6Yh{zJNMHc8jbVmVuNGgtb) zrbyRKA?dowEnPPWrR(PLvrspur0Zsj^mU7+^Pet#e`9D5mcGyK()Zbp{$|qqR!cg* zoOE1%>9`z>XOx~lvh@5qYC!P5KJS9<@NO7CA8 z>E|w;^!^=wto-!6ZNVwhd5)3J^Bej0y({0occt@eD4l0*={!qG=b2YJ&n(h;ejuG^ zOgU3|MwZU=*`tu>B2P# z{BldLn@Kt@CF2PgkHq+md!a7QN!P_b>AKh{T^F0B>tca)UCffMi_y|`(O))EyN7gL zw34oiI&!+|qK5SSmY1&I%XdRvoRhAL&C+!-OS&!wO4mgj>Fer9=U++s{ywIiOZq<3 zNZ)4?`eRG)^UFIS{;qV~U(#`>rN@s*&;N_`{B!7^LVq9Zz<4w1_3KN|S4n!l{L;@= z7U}&Gp6^QM z8A&?N`?o`$f6J-L^Ne(!N2K%YAf0C`={ze+=b26Voa0L8Ip&}6{P&m6H<|Q##FU=z z-mTzi+$}x6N%}l~p*@H81lmJs_oCfF`rMjGpIdGEE7Sim{kiDRNPiOgW78j5x_+MA z40-%3-M&Qo6zv1j&*c{BJXcDuKU;eJDbm-Cm%h*T(s9kC<7!FARhEt`EghFkIxdcM z+^ZWQ?y+>-f6{TkOYhTW`q$9Ei2iBxPo#eY{e9@~PJe4`fK{=W^!)jy?=!1(Ua6$> ziYuLeROz_q*TeXK(&HDT$B#*m|IYXp#+Newy>#6UlCIm%(slc#bltX)uG^Z@bz4cg zZVO1)ZD!d-?Nrir8&CTAdVMV-;wRPZ6Y2f>Pr7culdjuA(skQHx^62;*X>8rb(=u? zy4P1j{`aKs{}Sy}()YPn`aZYNzgqg7=1Rv;mW~@H9XEjSucYVyOnQH+&|ilB448!R zn9}n_lAiCL{*r{}J1@O|N2K>}i}e0&klw$Q()%|}djBR#@83Y_{p&8hf9<6AuaWfr zRgphx|H?||SwwpOPU$aUc>j(_@83%4{hK7cf8C|`?_(KD&wC2#{NhXJ_ey_R!}&dx z&hMUde&?j~J1(8y4(a?>OXs&pI=?B>`Hhg1mES<={CZ30msC2x_|o~^`#a=!TspsX z()o>*&TFuAUR|W~YA>BvOX<97N#|8rI zURFr&?`+zWrJs-CwEIavCmp4qlNR(hlzu*IO25}CN?%u0IzF3pdrK9`H~F^S3y$* zMWxRzk4&OE{v=1s zv2wfSTYW6dI~@~CU-z!`by20Sdv!D-VwAim>uLO~^snzP!b!5e+M}g^9kIOhug4db zsnnlaIzF*9>3Ug0d$x4lj;B3bx_-ZsuHTOIw~(&?2GaZViS%{lrQ-`o$LExe%Ot%{6zO%J z9SHsRr2GHEKk+x|xV6&rE|Q-2C+T^I%eT*w^mEih`Z?+#E9<@8O8VdHsxRXx{uAlv zsEqV;R9H4qJEzPblgkl0pLo*qMv3J7R&pS){ z`5Y(xd=8MqHGgmE`|T|Kd?uEDKI2M1pLhQV&*vHG=W~`$|sie{XEOV8U*dft}O_1RRqJ}XPtXBp{vb4kyePI}(=rRy`MbbUVkEh1vD=D#PM z{|)K-94TF&gQe@UmGtLFb?N%dC0(CMr1Od^omUj;yk6`Gc|DZQ>zZ_47p3z$ES=YG z>AW^c-|u2MNcoJAu9Hr(gDfCjudlZUFW>^{bDt@l$7Ja|MoH%}SbBf@O6So@I*&He zc{GsDqo#BoIi=^zBt1`j>G+t^@vpXp_>0nUC#B=INylxFj{8M=-Z9c~L#5+7NuPTg z>A1$yaV4bV3QEVNk&a6y9T!JB?(o)#w|{CdSZv=>UB<232`VbXuzyg%dJ zv5j2;|m#|#(1gC5&log zq?^KfY0k!Qo`a=7#~RW8=hyI_t0UcCQF`8z(shs;H*E-UeWl}$tP9We9_hR{(q1Kf z{bK3Q?HP=Zm9CrN()-z0x^8+%Kd&97pVwy6=g~m=ek)7gZ%OI8DIi_HnPqp~Ut0O4 z+8@YnYTsQO5z$W9-;}A;e@;4&?YKrd-vzR}`iIC~vb9X8b&5-$PXX!cb6`g4_fb;D z!z_5YK;uD0}b z)fg`&eLu`aJ7N*GDDVC8X;u7wwGFb(ciC?qbs)S-Sq7EDH5-NBX+U((y;7 zG^U>zqdY=es3j`es9H-{=9of`t$C= z!tl9tTl&3qTKc{9hiszucIoc}E2X~=%#t0oPd`cLIad04$uIr9xrK-UYhYj^v9QfX}zuUL;O1Fe<$I4>HIs$3^J$m zzo)WhUf9P4((_Ni{`e)A-zsj={hSdU1vq4 z>nxvion@Ck-we|Gky5&z6G+eddTyBazVy5|r01%W&g zt9EkfzgHVc`uaz+Bi{bI%a^40>4@}uE|vs?Z~tr%n0Mxq{mOv zJ|O*kZkB#NSJA(a{vYWdL;qm3vE;e};Bb`@!>Ab#>j;qgjHO7lEo|o|~jHhHg z4&!&GhWF@Y>G$Yi>G$X#((loo((ln_GPc%RApIViDE%HCDx0X?NBTY5LHa$~ShiE$ z)sepcYSQn~TT{Y&^s@AObf@%tbb<8ujuF!D(N5CWHI}}=n$q`QigrQieaIxe4=L$? zPx_pqNXI|N z@8A2<`MY65-Z;o`HKS}RjLFvz-T+;iO zKzjckO%D5aOnU!*lCktk9*JK|=h;y@&qmUD)|Jk)rgWY~q|Z5@be?IY^L$S_&zRDA zKK~))c~iDgo|mNaJT0AP59vHRO6OTqI?sI4=bS`3&%2XCURR{^IwGCde(Ah+N$0g( zIdg*#tAYBjB=^rayXWvRczrCfe>mnWBTspp?bX-;GbuvrWV=DTS z&>tBej3+PY`7TJ$cTjr1U!~7^sq}tMmEO+@()&3|dO!P0?`Kcx{cJA1pY^2ov%2(t zmXO}h9I~bMGm~_lsigOF$GEVc8>RPin)H4SmEO;m())RCZ1^1iQ~Gm!yX>Ly60)&O zFB9mx52Sy+E{^P_xYyr@_{XxT*1v;SrN>V&eo!{i_#WIWyJ>tWV4}4wJ60{<6O8j%}pBM>UrI`MH>MTweM!(I1EYDD*!W9pbM` z*WpF!>rP6~w@3Qt@3SQV`PY*CLKRfx;{qZQ0e%uF^%;6|9uzYuSwU-MLZ=PzaKkG$Cr_w zzle1GpfKMV{8M_~iPH0aFAFKI zm-M_{Wns0ON#E~hSQ$%8U;mEu^--j+zcVmge_0k(`-F5}JEim5B%Rkf>AVJf8}7fM z^nR3-j?W_eSQh0^Nd3Ov;Lud8_!F}AEmt-7vM~JSobkf z=2Bc`={yR^d|G!#zcAkq(sBKzS&&S&ysz{yyTnbjZZtMIves#nC@e+OonbRKiCxb$@erQa+6 z_6&Jkl-;$?ydL5DKGOe=Og-uQt|^^Q4(WVObr1WyQ`XeFYo)KBEdBc-rR3Y^+ihKU zt6SKgOVay!Mta^Y@}S1&%W85o{X?YJ>ma>eROw&Gc-~dtr?lP!nONSImE~3G{XZ@} z?{3>!euZ{F|&7|XNNyk@~jw>R)PEzT0rRQ5LT@T+$KTmz7pZ|7PM*4eVLFw;_8Kl1_rj-7km_+(} zVhri;i4oG@6aVQPz9;@Io2Y$K`g`JD>FN((&yDg`n>8&pI6(Cp+2fe?@t-& zeJ>(iuURn}zUUD8@8CG;`fW)2b^Fl%P5Sv=DLv0;^ym39)LByLI@{eYth+^e-L=yD z@H0+gd?f9D*opp@v@2ps>3Yo|U9T6~hV%Sgrqlf{lb(MLPLYluC>>u;`uuatw2FV- zCdA*DS=7H%rqS=GFOn5>-ILa8sK33;Ci6(|V^-<=NhiHt66te@EmP{h(WKAeb*qSo zAc>NA1IZU|I_Dy@>=-0K0oEqrm7pw zv#^Q&KPBbO#;Pm%SEG>UDd{{9OV7U%S4y8-9hp$`rjaEz-=l`%x__mwyDA-b7;DJl zic2HC5AR9Od#^z__mk4+zEb+S`O@Q4WLfq1m)`%5GM@5mExpd?((#{2U!NJ{Nq>+3 zt$svAb@dOBM`Q&VMaGhj|D;}cpJtZME4lQ#G4Mg%(7uR&;5wXxy`|p+U8LUwt)$-r zO{IVTub%Yp|5cX${l7BO?}1!0iN4Qelugu5A$_0k%F?>eH+8~&K9SDrn)Ll1$0hX7 zq&-&pece;~{u(o0OL`v*(9SCTd6iUV);jT}Kc`-O77EqduA42rFJtA~`=`HxbbY3h&Oed#^Bhh3?@`{b73y-O%&Puhr2dn#r*uAb zad*v7C&i`fq=0n&<&d5?3C5LvZ#=IN)|n|i&rr-EeSJph>r+WzA0OXT4|ViJx{hv3 z*U=T}Iyx_1M~9^AXs>h~ZIG^`Wzu!@v-J5)kTG;WqomgzD7{`R>HS))4~JsP?*~~z z4wO}851C)Kl8$ePpGx0f5$Sz=TqUe?Nk-Q?C8hVVkn}$0mVPhYsvO=+wWRl>AfBug z@;W5FAA6+NTZ{7M8qPsuS)O3dFg#9BmL_$QE*b( zaNnb)?|X=J9=)*xHpg064)bAVOo6w{gzqc6WLwq8Z0UI?;b{C;`tzZZ^n0MJETTN~ zO1}p($&b}eBE1h$rN8&Q)Jw@f_dJmWG~Ppc{C8T?cF`pMGQkC(o_pY-)zWkI!DO6OHuIM9k53f5RF>G6GxFMn4aFI7yg z%U`AQm?!gT-FVXT$B>S@TQtP|EFCvi=2cvE>F2n-bY8`!ulq!Y_mND4_jPz~AII_1 z*L^2_-9YKOyAEk={%>ntvp-EWExK@y-qyo_=h@7 z$Iq9JA1`w%zP5CH8ktbvD}L4?JKt&2`A(F6U-ic~I;^;gZz0_uUHbdx_59(w^U~kv z57OQ#^QpaB#?<*PqJO3=r~a|Dhe)s2SH9gJ>3Ld8UtdT1`Wn*Lm648%gOTu&4%PkF zr0?ULbe_9tua};8A?+E`^N*39e=z-DORw`K?WWS#eJUMaMmoNzbX+d!bz?}c`&>oi z_EFp;ef>u1>laI3KUezt$r{j8$#&$B&ce%VU;=biY{KkvLyk@)AG^YVSQx64XuPnK8pdH7|H zFn@mOdH%^B?*Fp%d7hPC_jlZYQ*aFCkeMvFU%I z&G+~n>G4a_^PP~MZ@2V(E2Y1$&XfM0@q_gDjB(OGw|*yYXwWf@iR?@52p zyOoLiklvp&((`VSdlffdrjeuRA0l0s9i;0rvUJ?_j3I84^uCOio^OcseBH4n@SAp#46^mtOCYZrbZDl^NtuGM)CJpY;4)v7L1Mr_%9>rQ;*Xw2D8NKE&^kS=2v4 zrqTPbw|rmM?fFm*^%s-b9x3ksm0fmZ>5lqUk;g zYSMS*P<1BLJPY+d@5`I|pQLiD{>SUBkxA5ED!tx(nMn4Q{{5|t($Dqx3i5polfJM1 z()qN*=F)M|WkTg~Sd%5x`aerwH%)~4V8}X zD1DzzWNgKkX1sv(dYNb^myVB+j=!T#c~|ilr01QA1Eu#Nuk=3LjvMx2sq}lHtaN;K z>2pjdvnoE0)PGVQQ_>#afO)0&YrT^5ek_-M|1FSy|4oyA|4o$sIcv1^&sqJYf6n?! z`u*2d`u+F0Y@&8?>AEN&J#P-_eMy3GrJwibx=BCpgQcI3oYK$7U$H`-d$5D_d@ZHt zYa%^gO)Meb{(7Ty-r1z{PA{EzO6k1gN$35Jbl%TmhP>}c=Y3Ur|BuNS+OGrB>;5La z-YgkO{Z*yU?_UMQ(|w$l3FI!BTCSCjUxc%z?{|ds{g#tnC%25Q`7+2D8uy|;uczwt zdEJxVmqpV1l0f?Wou2w`b$(Ty3)Ma@y)Or(_oc4%edwQie7o*tb^7PXRoD+};PL^{{k%qBfKzZh4#2PQ z3v7s0u`K4o%otU^qxoO<4_?7@xF2`o0-TBcu@~0Enpg&lU^@H&cl8VFZpI}z7boCI zY>UmY80N^?n{(&oT z5st;-*b_TqQ>=>>umtABOqc}Y;_I#H+889VA!e^aBUf1y=uEnL871QD2PT{(}SP*k!GE9IkI)?ZM zcnvS$pZGg&#x=MQXW;}KiT$w`w#Lt~80NCt6zwi{6#6noBU5KxQIWZH) z!x;FaZHT{vNAV9_f^%^&_Q6ir8mnSi%!k=91t!9%__9sN<2GKwEw~nc#%cI9cE##g z9^c3K__TFc=PvHYowyp8;8dJ|L$M$Bzz*0P8(?KDjd?IDet-!vGCpq=^86D2hgGl) zX2o>)d&_X$4xEhNV+U-Bm9P{R!d#dMQ)3d0i|1Q}^^W6aT!UkAIDUnlu^HCKs#q3_ zU|!6GsWBeLz$gC;`P{*acoO&ER?LlAFh0J6cfJVoUB@vv6dU7bm={07xELK@H4pPW z!rOQS&*D*>jXz;;?1J^N78b%>_#r08yUoJ-H}Di5#@}!wF2niw1CGJY*aj1&@Ejh)u{a#-VNJ|{DKQ4VsT=0KglF(~+<_}`5%$7P z_&L_YidYikVGO)oC#-t~PvRl`4L9O}I^PQy_+7`tP8ERF^6 zP36a246XkWukxEfnx6U>L%@Ym|$`jt2iM_^}cgEg@t7Qwvu4o2YJYGM8xcovW1 z9^8t{a6S&l0oWWHU=hrV88H<`#^+T-9)II$+=lCMG0wpe_$_w9w%8ay!%A2Rb7K}v zh6ykdKC2S)JAnsrGp@nO_&xT*PFNMo;z#%)#=^+>sB&2MU%Z0n@G$Ph^|%~o;$$3# z{jn3a#_CueGhu3sj;||)ysqMToQ&UNO{|D{Fe@g)*m$F2nD;N-gIjSPPRFr096Mth ztcevdCuYKz6~cNCaUX8S6}S+8#Ie{Cn_w9%f;liFet-$_Qu(m{8QhK=a3)U1?{FY? zz?N7I%i+^#3J>EpT#pNICU(NsSPyGr0nCB#V|;vGHmrXim*ITufgP|67Qqad z5+m?wnK17S{0k4`UYvxZu`l+(me>TdV+M?ck?~RKu zm=t5+n-U?<&e#TPVnxh}neb5YaNQo9h7++Xw!`XJ9*bdq%!cVPIlhONiiP#g;12v1 zC*f%9i#@O9{kRhgU=B=-aqwZ0FyC#QfFrRv zHo!ud3*W)A^8r)both)-Q;CLK}Ut>G` z0@Gs(yjLj9cN34|AGj3f;UpZ5eX$3Y#iE!E(_a3XZ{{SQl$x z0nCAkF%FI?5Y`)teX$3Aid8T_X2+x$4D^%w5JtvC;-<5(Pyov=05!=+lL@K-6W8N%oQach81~0b*c$6$P5dKQSpPR%gtKut4#3Qq24moxoME1u_&2V= zh4?M@#yVIXi(>)Ih^a6E#>5DGnj@@#8?WFo+>e`ZHO|GUI1&fpo9toUCwKu*;AUKd zpJElvf@$$xjDmk=3-kYut8ocV!qGSYzry-h3kzW`Op5U^GCuz(ta}=d;Cft+Kj0Yr zA2!0=m<5wz0=%6ytaAl-;IB9tzsE1IAy&aMSO9ZiB8-hUvV`^i!o#>1*W+^Ri#@O< zHo@vx9#dfwe33b<_W-Zq1^g3#$DeQ?2=2vgxDJ=$Je-bwuseQ=RWJ*t#TfV|L&)PQp2q{Y3%|gISS(Gr zE>MLdbia6V4QNjM4z z<2Tq1TjS?g6Dwj)%!J7>0Y=4_DMOxj@dh5m-8d0P;UN45J77yJgt;&-M#uFj!n(_G zQ1a0J2Ag4htcK;V5az=4m;z&CRDAeBnEy7O!(+G+SK%ZajbGybunLyJ{FogRVQhSm zEUfXW@@H5(i;x{2VJ_3CxJ8FagHIyNSa3H}Di5#@}!wF2niw1CGId*b`e}Q!I-4 z@Iy?Fuip##JjM%n0$1W99E-!T6Sl^N_$gM#(pUg+n|KWO<0@Q? zO|T9Y#{!rUQ(;_;jwj-Tbr0eeT#Hk20`|oo_&L_Y#25$9#SZfy!-Y5tzr%sp5}ROk zERO{+2flna%>NLt;5ponJ8?XIhn=uBHpEY{0+zsd7z6){71qCo2XGfw!cv$8(_#XQ ziO*t&`R?Hk{1pe{*Z2iC#DbU;Q)5z$fp6Xk>)gj%_&1)$1Go#<;4e50C*ol2gYB^e zo{SOJJ%np;ua6nqgq%ySx#;A&igb8rfd!x1JjQ`w*|- zIoyvsaUCwhc{m-%;Rx)FU9dSez{*$}^I%q-8a3oM0l&ts*Z@Dl=TSoZecX%Na5_%H zudp+=#?P@X*1+;u9OGa#yc#*Ie;#+@CY*y)a5N6Vw3rMd;j>6#-kbP09>IM$0>8z& zSOW`VZcK!+@nu9<=OJFfbGQg+<2W3Fy|D|H!orvelVD7Ygpb}td;9tMFK)&)I29-0 z*Vq*wz2l5|1uTIXF%?F|m#;z|*YE=F#cj9@=i^T}4u|6a z?1i1MI+n-mm;qyBRDAL>R_JGREpu>=;xRG0)`JqYVR!ryTR z{(xh!ANIsgurg-GH2C^{nEx^E!|k{N7vfZ$fW5H`R>$&K0CQj}OoCVLh4s(je%y(x zaS0B>Z?GBG$EsKs3t=vdz^8Y^x)<>zZo#!!8>?bkOombL#hozUNj!wBaS2Yqk@yXE z!~bC;EP(|v2WG^Sm>6SYRJ{CO$m=X_z!f+KhhlqdfmN^!=EaY2-@jr0?KtN~XivfK za3FTYc31-|U}j8%k?`5|Fz;==f z;Ey;KdtoQ6i#0G0X2k>;6Yu^N=D&fb@G$;{8*wEr!ddtuj>5s%0vlsZtcWGBAjZdc z@SlqzzsvYL?!bjO3x{EU?27HMIX1wuSQJxZQhXPq;JynXpY0fdPtS+`b9f9l;wt*Dz^I$SefKSha_3z>ZJb}A$3r@sQ*ay2~6)b~!@gt0k&rgSSZ{a2U z6Mx4FSOQ<23fDct<0nJ=0ItME*bcwI3RnU&U`mXFFHVGcSK|_#gHy0Fmd4DO2BYH3 z<6*u_cm}uOdhCkrFeN6&=f}c4_wf`S#&x(1XW$Q54a;GE%#QD4d^~$JtalWD#IgA1 z&oKT3Z{a08jYn`H&cX>e5_@0=Y=U*LBo@Mt@I!oXB;@lCp20tH7jDLBI1vY9A8d~; zupZXL3RnUQU=B=+$uKrX#VdzHzUS~D?#4m*4OYTZm>aWTQjCX@@%f>!&ON+|`*1tX zz#p&=cE^VJDWtRj&81rBXOoTD;&4IAqZ2So?=pX*@ z&%-BhE3U&Ia18dv9@qw(VHGTcnJ_g*!&iTVbuZ&toP?vXBo@Mym>6IF9_D$7r|}35 z#{t+2J7Ep1fFI$97z-og&3$3Lzi}6C#yL0zzs26z4C`YWd>`Xs3_P(ntalL4>HLE3+pYw zA8-tQi@mWrmdBsBgzKkaU+jUOV?BJeImAE0#`qZ)#eA3^Q(zQ)u_?@R5O?EToQl1% z3%=eMu6vBfa6c}>*_a(O;L%^h^?%?ZoQ)%K5O%L3#YzTQg zz<=;89>uM=4(H%#m;aWk&L8TbQM!cw?&O}Ks@4#ID+0e*t1F)7BtH><-u*YE-!#ND_7SKve(g?+F) zw!)@(WmQ<`9R7+c@p~MG2{9JlSQ)PW3%B4}9Ee|IJNyDGV`MLn0hi!h?1-(f92Udm_#UoW9@blolkt1(kG-%d*2Usj052{J^PR-cuo{-cLiiyj z$H@46X_)6Y9>C4G27ktBI0(PNuGkJ={SxMVgtwN2_9fhg>v0l}#)kMQmcb(U5q^m8 z;k)>Haaiv$9>P8NGfu;=u`51U6t4dV7ve0ehcz)bX2JLHU0l8}%(nnbVPVXIY4JUL z7auGj9~_IrF)b#;m>3D~%@5b##Lc({$K!X{2AkpYdExr|co_HMJe-atupnOjIb44p zV`Eg@JU5K5!38)Izs25I70Y5y%!F|)prGcm(I+bR3L*usycG zDEMMVnD;au!DTofC*f%9j_olYX2XOS3pY&<>#W8NQ$l+McEPsT06)Rf_%UY33>Y8Z z!IM9Q`48b%T!-^<2KL8Z*c9tx1uTK*e+=^<$5pr(hvNY3gsrg#R=~Iz9dAz#^IyS9 zI2s2}2;+V5<@nHkh}&@kj=`Z=6Dwj)%!F|tc9hpFebv-_-1gJ?+N~g*YFVT!F9L{hvNY3hF@Y6 ztb^sTIHto7FcwC}M}tCs|Kb7Mh3j!S&c_)z4EtjzY>nwL1xCVW1H-yE@o(IKD{wdt zz}i?9(_;#J_-&Z?Hg3c9m<`k8ssSN>F^lhdr?_ z*1!Uo1Eb-qeqsK*cmogME}Vzcu?;rEESMH!;G4c-{wsJ6x8nv}fHSc#_Q1yY8Ro&P z_@+--=LsIf-M9f);0*i$2jEv&2diT~%!UatCjR$LSpOOx#{;++=imtZ7Mo&S%!cXl z#n)l}2Y3xH;C|eROK~0!#ILa#*2m&l0F&c;7#W}U4tboy!?+HY;Yb{W^|2PF#-tbv zBjdkcg>|mtaXf&Fa5fIZ{@4N=V`=;tvtU|$(<`j^1TWwTT!o9VKlZ}%SR8X>7EFY( z@nz4j-a|Zs`*0pk$EH{pb6`eHh6(U-k1+p#cnJ64e4K$_VP~v@WiTZs#yj1^{MT_i zZos)X75icjY=pJ36c)xTm=>eqt8QW4fAK2r$DKGEf5P6_1?yuiEQ>`kFMfoHFg8Bu z8uIuDFX0*7i`#Gs&cz8h62HN2_&;ofWv~dQ#-tbn-*gFi-NT!>30LEEoP@)10Jg&~ zuntzo!k8PAVm!RxIplE*kKjIBhVyYW4#D==0zboQm>;uaGE9K4I)(Kg;Z;132XGgz z!C!C!j>Jyb8tY+AER7#y9E^r{I);3%;~D%DH{oiWk2CON%!98waDR9O&*6UDiK}r5 zj>X~F5nEw(ERVO^hxIPu4*V6T<0SkByI}+T1mj>d?E7VyzXvwNPq8rO#-tbz&$SEJ zAH(l)7`DQuSPqNfhnO5sv<>qe#OBxlt6@1Th&eGeCdC(R!h8?#GM>eQxEojCLY#^d zusJrs@>m>mU`9-Waq(*Fkk5G>f!|_xY>%H}70iwqFcwC}`>n$Kx9|Y&!bLb6zsF(N z3p-(Ltcpc3A7;YT7#E}C#*sJ(yWy8u3oBt!%!eQ0hZq;5Gt91=hk!SQv9-T1cwKAIo47 z%z+s(KE8u58i(~C;8dJ|y|5G3!RnX~v*EKwVZM9#9S+1E*a5R*I*f-g@JYik-yOV& zCvhpx!|vD~YhfiUjJfeWd>3Cg2;uaN=%H;>apMWH=f4*xD%J*eEb%BV>7Iem9P}%#w-|tPwR#}_TW~WiIed=9EdHj zF_y)mm=iN$VvK|T)(Pug#YH$9N8q>E1nXci%#SHB5kC1W%zp<@;6dDiYjGY<$FVpZ z`(rQch^??8ev0L>IOf5u_yH!wSG7aFkMJs<#{;+vr{V-Gg@rL2rpLpdhWYp6GMta2 zaR|1-W>^tRVlK>#?_+$7f-gP^>)yv(_&1)$1Go#<<8qvfQ*k5?!VcIH>tJ;(js-9d zM#Gi0LY|9o8cxJdu?iN!yqFZ@;hUOaz9)DT|G?$A07v5xY>zFlGM2{7m;DfT=JE{#H4xvk{l#JWPbK@lmA^ z|1X}$?10JfJ&ca8D};Gh;bNSE<1sEq z$H(Qvb^qZ7Jb}O9&-e*e#$uQs@0JVm-M~|L7`Nei9D_qKA7;bUm=uqe4fFqjTW~GT z!XI%s4#2dS45Q(zGGX4kcmt2(AGi`1VP!0hA7XNhgwINc`7h#09ET$?IlhO{@pY+i z{RsRP6Jcz;Uoynq!o#>12jbTl4`bl-65;y$cm>ble%y%*a3+3_!|-eDigmFDmcqiA z7~|moS-Q(;Evv3=z;t&@OE-vgr+{=SrKFM~Eg?!uD%~Xw0s_+A-6^fKq)1BnJ@2=U zU&pxiwdQ%wz3vUeF%*1TD(v%&H+YE$xs$87grhi^6s@A5Lwa68xY7tZAn_G4$ZWjZG3 zn#-UOGcPkRC0`c|`#j+?&SzzoVM-?A^8#W1A&+nmmvSCQa3H_nXROGQ%*51;!zg_5 zVd#IvTfD+EJi;B^z@?nW(HzRJ*@m@PnFW}O>6o06`8t2t^Exl`5O=W(%Q7Kj^4 zxRq-;hf_J61Na3$V-0@9Ld?TBjKUlFLjNW1;wCQV0?yzB_G1q=Wqnp-1?FcCCSyFl z%NzE2&Re{~quk47oX=tG&(3Vi#;nUMOv@OIz$baaKKFQrN4TBqIhWJepS{?G^;n!A z@;xTx%iN*=Z=T~ZZsR&G|J&W^0?#mMLws8Sx zatw#@6V_yLe#neW#n_C@3z9GK$a}%tyvm*2$oZVXQ5?)B ztjCN@#n_C@s~JQ8IUeO+{>p_M!(r^j&aB1CEW&(@!zlbKL+JmL`?!q@IFkd}ht1iL zWmtrl-VgbwIhWJ;J-=Zce#|_~!mH`s7q@T?r*Ryk@@={>_n3e2Aa`;RXLAVqu_!;_ z)U+XYEC;YRb1(zrF&dwz3G)wmg=e{!TRERI*q^=Fmd#n0RhgE_7=bTShdu7`I*)J< z*K-9MvNj7cHxn~9AEydEe{n6Bvog!@L+0e|lwtlV4|6wHb1A2DJlnG+^D_tIF&dx0 z=kwul?&l`{#t9t7ZtTEntiZy|%QQ^N7b!yjBc9ESU1wZ3I$;13zp5Ot_<8%&W zAGT*p)@4;@U`qa#EcE@!J>0@&oX;Ql9lNj{tFZ!eG9x4NbyA-bZ}Bt_b1{ErfA(T2 z7Ghc^<3CB${#9&%prHm~v+_i-jCvOJ4353}%Mw2*&_ zySRykn1^YZjM4ZmYREamBkavCY|W-j!32!Jmr+9A9sa>}{FO~ukCj-OuOo+?C%nZg zJir}X$;GU~vdqoQOu+Y=nD=`nVFe3kb z9P)1RGLLW%7xQP1;V^#9HvEXCn3l=-_V3X9jCc44&+!=7a|I{yCk|mhc3>;kVr3R# zKBi|1#$W{AeiZh-%3a*VUpSW&IEu~qDa)}Kb2BsJGdf>A4E_J`GS6@mf8#{{$nNaO zx~$6l%)x|=$$uY&{>MDe6Wqcz{FzfYjQ!b}ZP}2uS%mqRgmL)he%R+JZ}AFOaxuqo z1pBcEoAFatWqDq?7y8b!6Tf6NR$vZhU`$5jt-B%b3U_leM{zJ)vni{xJU?VkCS*(= z{VVkCDzXFb<<| z+pUnlj=7ncDVTsSZ-(=K^DK{YD8J_y{ES(dj?www4fn*$T+Rg?#lifBU$ZgmG7Xb5 z0$*MaeRuc=k8?j~aT4<~D^oHNUtV)RJjsLnl?yqEKd~*FvntE;L*`^8zWOut9^eix z;%tuQP_|(+)@4 zwqPTcW?`ma0v@;$@^)|`XK^sU<*Uo#{6GAi$N4j-@Oys42CTudEXw!!9{;-(`d)A) z7xO3nz(kD2cNfF_b6(^r?&2o4XG_*(B^G90rektO=YJPM?=4>8PHyB9&f$2D84BkH*`fl(v4|6#ea0ocMM36FC>=W-hR zvlrX4Icu{D(=!EcpLW08%dMQnNgU1rY{e!l&*IF(EKI^Uyno7lb1{GBF!pCVwqPB8 z%wo*Xn2g9NCqv&D4q{(s=lhJo2)up5eQ_r@@@G!rF!pC>wq;yK<^ALCgNL|_3pkU5 z`7JxLHS4oF%diOZGAq+E8DlXLpB)SPJ>Z`_&jZ}SC7i>t9M0bC!YVAw^G8G93GU`* z_GTBhU?Y}dA!cD(zB&@}|KT|v;~FmGc#dRewq;FL;?2V$|1!67E$4C?M{pp!vOOEK zF3YnxvoSprFb1z23j3Vpc#dQP*5HTC$y7|tI|oDFA6&sjoXpYup5L%0EAi@qkavy; zxs&;rjR_coFZYM}zxfA$=dWDI(k#pz%)m?gLf&ca=4LMCJoaH%#%5$b-y8BCaxSNF z1PAi%o^bvdZ}Kvaa1W<*JaaJ<;-mxRQ%Gg=5%;&G>RxnE#vCd6AR&69=$2 zTeB&vvm$Tq4EdLNfIGOFOF4-@u?N3mJVxW+J3{^){?6mv&h`9>KQJAWGZrIp-S&|G zD`#;Mo3I|QZ42iw@E~_`A!qR?{=gpmicMIL6}vG{gF=zGTNyvWU5&8ZyAZ}>HHG9#y~ z5BXy_h<(|LO<0b__;g*Ezt59A$Z;IOu58cRtiqH`#DCX@{Kve(OWen8oX+v=%J%$> z4H$<}Sbt6EtIo14%3RFE6imPfe7QR0T;NHr;WAF-n; zu?`C|HufHhco&|mm^SPLsNqBd5cz=yO*@<;omHC;2cV>n8Ke&zSxPUX+lbzUzby$jpn1yK> zkJ0#iX6S#&Gd#kTT+AsP!-4F>5-h;`GeZ6ip5rlY=Xx&UY>wtoe#Qp;YkJ84lP7q9 zE!c$ez}{@f7Ocl=jLWFpJvH=i=2Fh%c#dQXHexJB z;$KtT56|!jw{Q)ob3E(tW3HGS@)q$s_GEolXHI5hGREWKNg;1HmvKIu@l$S}7|yTf zRE}jYc4i~iVM!KbLdN912_gSF_izhWa1r~n7dx^wKV>aeUG}1Kp}!5QvOKf%eMaYhqr%)gPUqc`;p^AfW<+>y z#!4*BEKJM)hKKVnc!g)Vg=;vSo(UL(_r4GF*Li?DxRA3r zg#Fl>O<92@n31XY&v&8kE*Eh&$8iL|V^4m`&smPen4T&4u3zYT&dWT*&0NiC9LIKS z!H-yqA22&(Gcy1DHuRt8I{wP;?8uzV$YhMizx#%~JKW2yoWN1+!LQhYjaZ!(S(G2} zeZI$k`-J|-Jjk6K%x~G5ZP|qNSea#*kJ%WJ|Mm{O*Ljh@@fUVu2R30nmSjO@W*Ww1 zMBeQcdav;$4{|M+b0#Np2>bCXe!=Rj$RfImo+H`ufBxUEht{mm>MX!qOvmJW+cC^P<0YQv z9&X`$&fq8x<~RJBt=NRsSb-Utim@4)PdbGC?(quGax+(R8pm-E`?4cjvp%b{42v)q zGcgI{@OAsJ-xDt7JbugWtjhAt!3<2qSX|#O}w$Rv!z|5}IrUhpO_ zb04?yS1#m0_F)S)Vp$etMy6s^zHJru=)hLY+alb5Rz~5Q=HctV^ElV>SB~XycH)<8 zz#7cOOpMLQ{G*v(ZsR)6=4AF}7dB*VmS6#$9-PqIj-jlj^rSAV+Y=C9P+MlAGdKnXK*0Nd zQ}9Nk(07URIfLEUfuHjeR%A(LWjelY81kR+7O$`|>#{tHGbb}LI{*7LmN$8!$!Tgpj*_dTnlusIj`Fs45pEDH`^L2gq$KQFJYq*Tl zIi6kEj*VD{d6|__`L>=td7YYH>0=}pk`X6y0w{au~ zu?g$($j4!R57%%RXK(_0u``>n9xJglb1(yAF%oxH3H=+njPp5~L-{Fd@j>M-A_qtN$| zlR28lDu(y_Sd963sX};vn)|qoYq^|LIEKC0nKfC7nVE*Y%ZI)$Y|W;u$7(FhyiCS; zyjL#dUFUYLXLB}WWtL$+X5;g+A@3m%b2sO3Dl;)PUz7>+kGO|hIDw zLX5{~yjLL1U*`et-~!I%K=xrfwqO|+VK%1c+YdwEGoIohF5w)G zGDhUT`9j`(-rzCrnY(g_{!LuY1sua+Y{=S7$wZ9ASGhv&U0&l+?&Vr8=S)uI5cXqhHf2HPW=uxp zPu>rG_jr!SxQ*+$khAy`e_&5`;^+K?l~|g2nU%>I zpON?~ec1DN9_KD@;$r^H5gf=D=|avUUgbIN<2KIaG!9`uc4k}FV>K3FF5XWY`fuq^Lf8jKa<6wTvTCB|c%)vBF%KuV^ z{ujK1l^{=o0pjxG2x%P|sP zCDO~AJkI^B&+1%}Fw8CDPyB&j@e4L&Z5~Y!=J#?fmvbg3vNyZ1DeJQ`%P=Q1GBzV~ zSNzbwiOacwV>pZrS(`bSfmh;%yt7=zCH#>?*p==132U-63o|RzF+QX7VcgJviwC)r ztGI;IIi6qgb5>zl7GN$WV?0LWzj4AIN4b~NIF7B@ge6#j@fn@hVu#!d+{SgB$%*XD zw#>l{ycsLxUFJ@1)MR%RLIV>YH>0zQov=I`?yk8vkAaz1BpFu!F<7GyT2XKY61 z#;Box6({mXc40eKW*L6SoQ%)t926zw_hkpRVm(%4K4xQL#^$@oA@4c=j zTeB%EvkX6EP9|eKK7SSZ9&$Msa0vn?C4HVZO0Q!oJ|^Yu&j z%PZW=t?b7hY|G}X#tMwYS1&^TLGI)*_GdSCU@cbWp64NF3zu;|CvX%yvn}hf8cVY< zGcYA1@zt}?yOFCnpEEd=-}B7VFn5GoxQ6pNgZPPE!mi*S(q7^l5rW8e?JQOcX*upIh5bCE8DXHYcLL@@btrwf0*Mqg8kTojaY|U zAB6d}?8C17{eF0VoZGpci#VHu*q2}ObJpRdamF!j$=zUW@;wk zjk_W55;t%qb21}iF%qx;73MGU5O;A6mvI6|@mqFhL)K zvpE~G3d`~XW@iG%;EQWvpGQ2)qg={)9L@pE!nAzzXUKcX+q}wUoX;=#87s34^D--A zG9oYi5&BMZEtm6WPT^<{WnXqh+GR$^XeWlARE^Q&Q>hy0W0xtp6gm(%zohp;o- zvKA{d3FC0`mC!$$-PnQkS)FBAgxQ#$i5Z)b`08@#ImUgQ%CQ{A{`{J4*qC)$iKUsB zSs8;7`1hr-#~ohaNp9pS&f!#+VG;gvG33ofSL)nnES%D>(mdW_wc*wuW(HzP??8+Mah#8rR@feLakA?ip z+{jg&&l&8?Zmi8JEWrXy%-FnhH1z$!Q#`~)oXv09oo(2RC0UTs`QMSybB!0co13|S zGdY|C*oE!bh;>+w#h8N`n253X>TuZWA70}H9^_7r=SY6W228>@{OeH2|C8IejuSYF zWmtsw4u<*b+{E8Ffuq=nb(oy-dHX=fyULAR#c>?Le(b@HY|Sbx%NzSc{w40<1}^5$ z9M6%=!3=z|FXY|hYA$6F=3_#}$4d1GXqod(atb`n-_SJ2e^aZu_v3b z9xJgl3o#GhV?sXOVSldXQqJNe{>UM0#}=%{3e3W^jKo*lL+{=H`G0@D_!`gf2-kB3 zM{_8fvOX)b40AFgBlGpP&^!EpM*Ls@09IjH-rE}9U*{6e;Sc!c5NiJiFOE`>-o(@FNysKEB%&=AZLCPjDK?u?ovF6I1in#*lY~<2jPu*^xC_ zi5ZxZmp6pGGhD$%oWe2e%`U9RYD~*ye7Qd4|IG_L$=RID&)9%Pn2)d4g}i^bhRZmV z-?KB@vJO9H2BzfwwITlo_i`&&a1kf*Cw|ACtjLng%dAY!_d2J_Gd4C#s;jyvMj=UOvS`}@@we7$9>$!Rb0X!IfS3{6Bg%( zjKVj|L(e1L=60^<5cXpWHexvzV=~5LME<)h^j+mSuHq7QU@KN;8Kz-Uu38#$m#`sg zvjR&nE7LI=-~AGD9`Y79b2S%o7RPY}`>-o(vJ%rVIivC268*fz6wzh*U7;G=nA{x(-~F+b-gEX$%y$e27b zH{|VM_5b;Q|9o1Jx8{WRS9pR4xQz4Jk3CqEm6(@V8JAIc_vg@ejr+Kb%ejDq*q1HY zm_?Y6QTcXu=sC^9+{SgB&hhNdj{KPAn2qTfm2YSHzIcHLxP!AeiT&7vby=0^nSzgI zhMwEJz>{3ZUpbmX*_usRp2eA-Dfo6q=zGQ+yu^)M#VH)aulNOv^FzjBBtDxS`X2Bi zPjL&^a4d)OYqnu^R%8xlU_!>^?P;O^D)(|Lr*RzHuo(+8FEcPDV=w~mP7Qt6xQ**L zgA>@BUHA!WvJ?w33FGj|l+bsN`?;MHIEt;OF56@ zID$RdiJ$WmR$^)9Wmd*xG~OMnpC@^co4J}_vkj}TEK@THUyTX*|L}Jn=UOgj8#d$L zqr?0izW6CTKjKLqaoZ*o_@n zkhz(LNg0)IM}@uzyvf7d&ENP7$8tEoW*atO4Hjf>reRV>;;WHipFeq?2e^Z)xs=)Y zJ`*w~{~Zx>AM*^4a6MOWE~jw_`|%5Y##-UO zGcN~q4?TU^fvs4N)tHajn3%Eou3N}^&OdpcJGgA`w|SBW zxrJ*uo0IuHzhM#PV@9T8G`{N;dN*@52eB`&eHG4K;6d)>DlXxV9Kz0Q%O#-VBGYKQ`WrvV^hkx)m_j5g0a5g7%D8J{|Y{L>Pz!;3c)9u3^ zhdG;**@3NCg!veSZ`y^N!w{Qg)aTEvh3x3Aze4l@P5%T}!K5pYYPG^7iVjDJNDHdWHCgne^ zL*HF)<2wGxA?(G@{G6Y#EQ>N3|OS&OAui0PSv&l-om2Ry|?T){;g#lh^x4*Zzqn4RzQ zU8B(VoQJrJQ#qD{`7PVCC9AU{GcYA1@MXi$dzojrk*oMKr?4kGu>or^Co}Tpr=jO> z?&CJD;u8MEAJ~S?Sds;qii!F16Ma0xBizi@9LwSC%(nc9rI?tpd96X{yTBvd!zG-< zf$YOiS&O-unbYfs{PAqhmTbTp{E#^rhf#Q=UdX$|z1+&h{F&o9l0Dgp4OoLES&$i- zim@4)ck70IuJI%faw+F=JV&xC+p{t2vJ?w33)3nO>Rl@uWUg25p;wH}FRQ6{tc3>-JVOn0T6z=03 z_i-DSa{(vvM|NWee!`k8$70OPG>pPGAB8>c^9E1zF#EF?+p;-RF)<_ab;Xc>m)Cfb z2f2caIF2LOk3HC&4Oxaon2qU~fHAnGLfC5!=W_-NFc;rrLPq4j zMMC~PUgs$u;wJvaxtzxD`3=jk2-7kd-xLnLPx(8Ka~*%>ME=Nc*_};TkCj-O`I&-2*&v}bixSN}~kh3_J!`Yo3S&!9Nf(4j~skt;?*k>LqvLy2{8xu1&|H&KX z?{W^OvOjzAZk}-d8jo@>H*h7Vb3FU7EAQnFdDnT0hq#HqaW*G&1PAgfe!;3N&pgb+ z_n44xa)o`K@)A$;Q`X{!oZtm&5(=6c2F`XR{xBusSQU z2=g%$Q!@^u@UQHl|4;7aRxaaw4rCv;XG@l05hi0i-pm&IF7r6|b2C?S8pp9K+p`uc zvoP~AE~D~U*3kce2f358IhmdKB^$90OR^wSGYOk!34Qfhk_GuLb9n!p7kH9;xP{9& zpA$HWec6qz*o5U+jG38+2^fPJJUiKn@dt2l!bIF#SBJzMf)mScYAU`i(9@%O_%`?;Pg z_#PATZTfKj8E^73k8lsCb39wJG0U+Sb2BrOFb?0O3;j=dn^(DtOE{HdIe@)cfh9OD zZO9+N&TPvjtjDS>&tlBav`oe*e3K^hT;m1q=4Q_2G!A2be#y_7i<$T`b?Eto!ORk_%X|}C^Iq@Bk@(Lu-60LJs= z-fYJftirO)#Y{}XIDC^N?D3Qbxs%`UYqn%#)?_6XW?m*|e7;H?`u^cfUgilN;0CVb z=lq1FS(s^ucT*TQN&7thXFIkF(n4Rx4KBMz-!m!6*T*z7Mz*els zYRt!MjKG%(LhcowY&s-{Z?TzHeUONp9w9&gNte<@fxWZTKl`u?&ka8`CoZWAJ5c`|%I{&O_YA zC7igW*O#VHl|<#M&|42K4;$HG4A7PF6DTR zWM6h;W7cIM=3!bU5KVwq{dqiWu^L<5Z62ckIc}`3WnrG_x=*-$n@e&v=#RxPu!wpEEd$gV~)O z*_8EJktLa%nVFPv`S!m^|Nrk}dd8c)%;Vh8U%8M|IhNn^8@6C0mSZvIVHUo}gpA6! z@4}uBc$339fLq>%b89$*6F8XP@^gN|$}Gct%*N!5&;Qw zzvd^b$t+CEgpA1-|GE#J=LxRnQqJT=e#`D`!A2~{V$8t|jLC@n^JUoQJP&g>S8)l) zb0oX6J)5#VORxan=X;FEe_w<>{^Fn9&+VMe$sECfY{Oi0b=4NIlWK911B<%B;H+YG&Ihp;~gL#>iaT%2}{|WgM zIgowWl8srF<(Y#Sn3Qq(>~Y9{z*9WL=^W2K?8-0r8B4P;FZ>NH%BXyMPcJWWFSl|f z7jryEvMbxOG3&BCi!%~m-3|SBd5yntF2`^fzv0(x#!p$Ag_((|8HZ8$^slhTeO~1` z9_DWT!nypBL)e2~@iR7HG3I9?#^T*OVV`R}!z0|rb*#n8%*-^Lbvxuu;`m$Pc_jO? z8(Xmni!ncAG9vff40&6)jPp5xqu7c~`1nSc|BI)1h;uoOpYs!zWl?5gYQ|@D{&PL_ z-Q@`$;Cim$Oittw_G4={Wp!3$R;FWoM(4w8VV_$(%cI=DmHe4gIE?-IDQht)4e$Q`Mk_DNWX&93c`Sg#_f1ek5io3Xp1(};^n3PfZ_G-vI&BGkS zVeG}uY|8qq%reZ&tW3`MEO{mL7G%WB;rZW7!7Dt=1Kh#6oW=p{&36|=&U2Pw5vKm1 z|M%b1C*ipZ;rST1aUExJB0ps<&OIOIr*Q-avMbxO5$muVi}8KF$7p=_d+52z%iPV) z{FMvYmd%;rT)3Z-a0Dax4e)Tee{{R$^)9WmYCG}K-_LoR&Y$=LJF+#)un3bd4*xq4@?Y>W z&u|47aWsdrBU`f`t1$;NFalrh54~r2gwr^Veb|-B7>`f(g`9gl&i!1+Upb0{*_|Ev zG0QPMQ}EH=(07{`c#>PVhSNEo{n?9c*_^dlnMIh7$rz9S?g{%m<_%urK5pXz&g73A z!XEsJ1(}=Ac89(PJjFv?$;BMS!R)|RtjhAt&m2t1n0&J<^grcoUgaKc;R-I|K=xrn z*5;m_A%6>(aXu$-6w9(Gb1@U+GdeHq2>B;Dm1Fr0zh(p0V1DLcLdN9Z+e7{xp5rmD z<#PVaDICc`Y{wR?&+4qe5=_k`{AXL(=Pu`QI{UE)>#-V7Zw>Q@`N^j6T$2Tvn~4~U zk2Z$$w|SVm`5S-XF!pC>w&h1G#neo~dmBREb)Mx>?&L-;;T-Se51ZKHpH&7~a3KKzPbuo3I9C_i9A#^l3wq3;&Y@Cbk5T#n-iwqY}tVj;$5RK8pr z`u^rcp5jKX;_Efx{1et&9iFSP1Pd?|Q!@fz{ubu0^CFLOFIRFg$8Z>{uq+EO7n3tS zudWKc=Qx{_d2B^^zmH2fkHa~DZP<({nTWsq8uI3HJV&xQ8?q8hGcU6;8RPNY@{s?W zmw1}nxQ_}n>1@rWEX)7L!hOg6SU&zAwzJ6=nIU9L z2q8Nod(Z6bot?cmh3xF?nU%da*~!Yz$jI*Z`F+phujBFVzOVE3ysqp0PvxNiKjBAA z#MpfEOE~{2uk#`gaTgbJ4o7hiyR$v(unG$>7t=C1V=yB3FAaU$xsr=Gkt5lQomrpN znT{Xu!jf?QNp9sjj^ZG8VH?(ERes6OnU={Jg>M#z-G{uzlRU^(T+FE)&+qviKVuH2 zW>WTF6n1;C7z;2n)AD`B;FX2p`g2^!SscQ??8sKE#jjbE`I(jJ`Fugxd%(*)!@b1iqLXy6*8hw{jg9aW;S8SPo%dwq_HSU?HBL z6LwFqJzKC2tFQ?3F*DOL0$mT2*oAFamsOdInVE!f`Fxt^&C5K)tz5_1 z{E@@hpB>neMVOEGr-r>7Jj-L;#m!vGc^t`sY{%xT&B`pv!pz1DJoRJfImBkH&oB8o zvoIZFFd`rP5YD^Fquk5&T+YcH&8Do!N-WJ!nT<&qk4L72{XLw(5$wrMtig)R$W)BN zHQjaZ9c@k@TnZ2XXkd2v$cIK`dZ#3h`|;ryQM*qk+3kwut~ znVFVJ7?;l`hMvE9fhW0%t2vj`_&vYlM@-3tjKyaY?C}y$b2Ha)Hh*M)_FzjkVrhQC zR7}DMd@(+BT;m1q-W5dp69_3z6;0X3)C)Qv^W@IWx;hQmG=RR-nG!Jtn7jYQ-vk`0YD}KpO znT;PZF)xk|9jCaHo4AB?Ih^0K9hok^9Z+c9j9_Uzvp*s!={YM zNW3#V>|Nzi?&WeW;1rHwSGHw&mSA>fWPC>F(_vx%J}>b!cXJDW;m@4JQS8kwY|45p z&l1ebPneoX`EF?Fd(Jz&%46KeRb0&R9L_%M%9d=zYAnw}%**pbLeB{f9uz+JVKdfe z1(swcre=Ib=Zk^iyhr?#XSt8RaXx2o82hs`zhw=DB`}iB@a|VmEAouqV*Kg-kj%QzXV*}P;DHdS{e#rQY&j0#_ zy?^;9&vGxf@h48=_xz5HS({~9j2|-%|Lq(0AMzS6a6h+m3FmS!`>;J*up&z_53@2M zWASyL(DQ^Bc#^BRgflpq1KEqsSf3?Wh}oHuaTt~V^bS3Dd6EaYiK{u4jhNbxhGw?&M?-9;h&gq=UUhK?oSeM0FklC1laTt~N zx`(~%T+3fLkt5lc-B^>A_)oWR-d!H!K5pO&HfIAa?i8+{!=dcQW~|RheAO{rH-vrJ zoDEo(#h90$Fb$J2IwNpehp;n&S(%;*8H=ylhu{B)*LZ>3xsmfYonttJ9odRsvkdby zC(|$)Z?_9QS9qNJxtMd_4zf+FgBy`ZriYTjng@i-?1YTG8P}U3D@7^5$@p> zj$v1}Wh2&N0p?WFki4o7SQ4 zK5uY8w{tdsWDj=WH>}GFEXm8Q!p<44;ZkN}2449l{Qfy^<9hzYNi4uzT+}37Kbwmi zhtG33p2PVaJF*f>GY+HjXrpl6UaseI&g2xfWiwV|c@|<`X5fd6%C`-}?kOJPbWY?z z_F@}0WeFDI?gru9E&PQ)b1a9lA!{-P6EaPuND<=w@6Q9q{GajvXW3H0Pnni+__Ad9 z`CmN2tz68>|MUI-oi~^*{%3;!eUAKb`16OaGX?MQI)CR8uH!P!;ADQsj%>`@{EA;P zE7LO}WASRn&~=_0xPqfOm^qk2e2nwvkA+vC@&@s z=bvJwIN@_?W@84%Vr1Tp9e)2B4{!$;a3%+_H!H9tvobwnF)|;-3VSzso+r44YdM`0 z`4Lm{cFb_z74GFWe#5#f#sZAM7cs&)*LjggxtFWBnBzE%$@xCpzZcGJ!HO)!Y|Ox9 zjL*n?9W9)5jTd-;JGhFA*^-U;HOnv}Uq%h*U*JjZ;a1M(kL`B{^D`&=Vq?q zOip26cH_13;k*mn$xWQk863x9?9DE0%6cry{QQ_{7@4oX3LOu4lYj7cZs$h+z_IMd z?o7`VY*#MqG-q{IU{U60dZu73M&{VE;k=>j#&&GX+AP6BOwSZtSSFk|i=#`2&x6^6 z9axuD`6WMRS|;baQsKPk{F7(7og2B7^H`TvnTE+2i;?-DWZ1jOGd#)x?8(+_!s@KR z{LIOujK^&y!rpq;WmV>9PNrcp4*fD*-;eFtf;Cx*d6<<+7?%9v2gARreYF~DjI%1h^^R|m06bgn4PJZgwgo!i*W7(-sBk`|CggUh+Wu*^;nHrnVzo;h4Y^9 z8ZYo5cX9z|ayY+d7q($dR^n&O!H1uR{ad`ilibR6jKCKK!*vr11V^v~Te2ccF&i`R zJ^q(JoO7KQxr4uQ7Jp!0c4IAm&Aj}C2^f=)J`20Id5rtGm~%LoefSOQvKR~SUOxB5 zEnLfKoWLIJz?!VYT+GZkjLLhT+T#K4U}t{I5-h}Y{D2YoB5yc%3FopGJF_+`Ge2`O z0b}xB9=$xl16;>t{E_20kiFQP4Oogr7@4nghuyv0##LO*Q5?kXY|rLwz_KjHY|Oy; zjLz4&LdO$c<{56~I@V+*9?2Q5-@~-ABSwhxzyEL2<3NP}`+FPOM+rZ#n>@<@{qw5K z|3Cl#-|LW*i5Z9gBnv;k%VXTfU-&bJ^LsXD1AfWRnTE;uHfh*<#=E@6ef*7U`3uK$ zIQz02>#{1#uqZR|LndHMK1>q&Zt)UN^H;9o0?y<>_F@ONWCfOFLFQ&s#$yz|NgTSa z@;r}nFE?`y7jZTRvkyD5H5;-f%d-SCGcA)aE}tX{o%eW!=eU*YxP)^#l>OL+ZCIIQ zS%mqRf(aR&5%^ca(Dw&V@*r1mA%Ef|e#ee%&IbIFpED;v=7&ton2f|*2}0kWJk7)0 z!C$$Y3pkPk*@GR}jP+TC<(Pw+n39PYgAw`s{m}b>r+A3lxsl5_pVK&j-PxW^S&zk7 zfT@^-u^5@RODVeaN)&fye}VMn%NMV4Y#re`w7=d+l;KfJ~Z{EZv<3xDQte$VD?z%ThZ(=Zv| z#t8e*c#g-phg-Rli#UUmIgI_;m2Fvt<@g0ZV@f9C%jlu+G0*TQ*KjGvaTxosE9TPhZ^Q0W-scG(;8w2V63*pN_G4#$%SNol!u*t(nU+Zymrve=&U-x0{oKlR zoW=?4&i1Uv@+`&z%+8EV!GwJAI`ll^?>xfQT*9#&%3kcumTbgoEYD&rz--LG514?_ z`0iEce8PMDlV^FDyZI|uaSF$9AbYU`Te1R6G7Ho3J^uGH^xfbk?%=PS$tmo`&aAMZhDW)EOF53i*p|&$ zj>VaYsTqZD{t3HRd7j(2p3^yzJ=lTOS%JBkh4J_v?>`Q^H@J_#aV>x0SPo@xc419c zVhI*vY9?iDM&YeTq32JY=3%blVvgYue#>uIhDDiyA2JeOJ+#ZS+`_e7$XT4kQS8U= zY{RB3%VNyO>`cg5eD@%9J?A}M=NTU5E^g**{>VP;%GPYcnykbUEX1@-&Ub(7<3*n0 zes1SFF5?7_U_W+e8#ZNG7GpkUXL_b!d`9Qn`=R$4@A4Y=@i(sJFPy`v9K#{(#m=n7 zuUV3XnVVUdnn@X(QTXy+=zq+cyv$QP#O>V38Jx_X?8KU^#Jv23?=uD;+zmZ9d5F8X zfHOIfBiWA4S(jCrkJ*`?DfsS=?;r2+I`?uL*KjGvaTwdO8OyOaGch%z@XhVeah2z} zjq5p`6WN0uSe+GEoCTShNg10_c;}W5?&UVl<8=0C57uXO7G!QFWjsE;8TRh;1P^dI z7jPs8vN;>DD!*cOW@HK`!=^0DV$8@?jLg?J!tNEG<5sTY zG)`c5wr4e#XD()DTt?%)>tXjg_j5bva|Q>nCmXUR3o$Q~G9IJw&9$)mC(rUQcXJ_U zaS}(dJzKCItMN1D;73f!hP$Z_n-wyeT(%)v~I%_#i$O4xnK8@$A0 z+{Z0k%c&gCA?(XP8EXw@M#te+fNPPZB=y|~FyvXg`$Y1y~r*b^I zu^p@OD;8ybe#pdpbt&}x!?Qfb-Q2=eT+ErA!d~pmTKt-yG8+>xCf{8QJ!A&~cS#c$90nl(YB)M{y8au`#Q&0*kXCQ!^=JF*0AA3w@9HJCATRmv9z; zU~hI|ZB}MJW@mb)V0=dB+q0qP887f8H*f_faTGhU73;G)%dt4~F+0;U1>^BOzBv>6 zp7J)Y@OK{J4*tsJT)^p^$R6y#W~|RDEXN$o#Mq3&JHPw>aWA)V9;b60hp{c2u^fvt z6H_w^-<-C~^W4VuoX&~t!49m>3e3$cjK}wQ|5Vt$!2{gE1)Rx=9LWxB$@;9$g3QfK zOwA~KbJG3uJhyQ@r*k5Qu|K=AEt{|ozu;#~$wYj4B6K|F86M>tF6B55V_P<3ITmLo zre-3>W<m|5vJbnmB^$9i zE3h~VG6ys9118|VM?>F3UgHHG<34WTS}x`sPU0wbWGhx=DQ0DQMrQ;*I}-Z-=1Csp z3NGX*4q_`dW+@h7dZu6mzBn9q|KRW3#MS(PV>yVu*_gFik)@cG>6wi2`RtJU=Sd#q z3NGX*4&rz0$mVRos{D#M`7z@#D(@Z)J=eI8zwu}O#P9hX8?XjHXC5YFd_Fti{&|uI zxq=Hhii6mSjaiCCn4T#ZfiL!Z|NNbsxSBt3EW5A`E3+)KGb3X$GH>q-yH~h}TRE50 z*pJ;=kJVU!xtNiu7@4p4hTTWJ%_H2yC7jEl?8m08$6_qNR7}Fxd&2G$p5t+@<1$X* z2=-%lwqaA&WF?khA?9Evreq?%+#UKJ^CmBI7dLYy7jXtBa~S)xE8DUWYq0`LG7Hl& zDdRB;-|PzA4|$81c$x>egX_7R^EjPjIE1~}na$aNRrwW*FdwrrJ(Dp$qw?*}a6i|0 zfycOyTey~sIfp~om!0`78?hEEuq3lE9g{L1qwviR-y7cHQSRlhT*U>P$?+V{zU;&Js+p-zUu{bj^HKXv&y3lcz=edpRIh_;PgB@6%6_}e@7?1Dq?%J?>jc0j` ztGR@;_yc>h3v077^D#RUG8P}L3H!HsgnPJzb2*g#*p&5Hj0KpAN%(qo*n7frJkE7o z#t9t3_H4oOEWyl7%V>PJD(qh8MQ-OtPUl1pV}E|by8N1Dn3d_7jPdzoW$3uaD?G=| zT*F12&B5%$Cal9R_!(0&5nrwd`;U2sN4bVeIgZ2Fi=Ek$jaZdmu_*KNLndZSM&hmI zq3=(g6`wWm$yzn3d_7jPdzwS?K$lCwY)7xR9ebh^^R|C0Urc znT2r~jjw+R`%id|$GMwZxQdH8hC|qso!Ej6S%QU_lOOX#Cg!W9q3<7_R z_GLHLWmT48QGUv7OvexS-;&VtFE8;lf8{Dp;TR5JPqt?Z)@4)fAcEO^C@CDaUab+p-zUu{bj^H4`y5AI}RtcX*V0xs>xbjQ!b+^;w(+ znVL!YX0H3^d7j{UF6Ts!WCyln1(swMrejjZm|5vJbnm4y*7p=3pYm=Hpr3KaX-RmvSC|)8J%yZhW%%} z%WFK#V_eH$IG)4Vj?MWMzvRbE!>D}wW9YcX3;c~6_!B4bJ9cCZR%9M#Wqd~G-#>W& zJjk6~$XOi3-fYa;EW&(D!GwGxfQT*9#&$~J7uvMk1oOvT82Jvr=N;W=*Q zIxgW{4rM=fVH;LvS!QQO#$sgNo}`0&xRrA`js4i2^;nGsn2Sjmmy!8;qUX-ryvS4B z&+S~prJT(l*@s=(noU@mUobB}VOl0PUJB5XIHjm6_#URe#$IN$Ha`oNPIO`H*fJ0PxDu<;sVa( zK=xt>wqymCWI^U;QpV%cF`?@|Pw)Vja{;GwB8RXqJM&vMVl7r+Nfu;oW@2h4U`+lu z+V_|Dd4uP9f_u4*tGJjmIfcXdJ-e|T8?!bmvJ?w27c(*y6EYUxjSBbkocDO0=Xjj! zxQr7xg6-LYM`Ze-}V&Wqg6jhw;B?8#1S!G z34PaifycOyTey~sIfqj?h6CA)9oUjz@k@TpG>po(gG1jxyvt+U$1PmTsT|KC?90yl zmS3|BvoQl>G7@hM3SED4H@9#Or*aI3uopYC7Qbdm7G`c{VLZOaHv>b@Q=aDuuIF-2 z$5rwFc&j26(jR? zuh8?5w|I%C`72j(K4)+ON3cCxupX=NGv;6d#^l?cq3ap%@G4L9FjsLgXL1Thav*!K z1FN$Fb2AI$@jc%EF7(~t0q)=e&g4XnWIHxzZB}MJW@kdi;-em6|2B_s50`K*hq51= zvL1`E08=puUw03CPk4^UxrbZ1noBr~Kd?8uuoWA#1Pd_-Gch)!@MX8q_n0?%nY*}| zE4hd>IGH`!i7nWW)mWazSb*7?k+B$=FS>@_NBo^fxRaZ>f(to{gV>6VS&BuNo+%iC zFS>+|KlnR0aW#M7Sax9>R%TgdXGX?iWZv!^cCT;`w{kA0u^+p$9;>kcb1@0y@=2$# zcaO)ppUXI((>Q_M*`7^VkHuJkshEVXJBIxyJjdf)$7P(r5p2&EtjB6B%VNyPRE*5m z9XxlQ;}P!RCa&fW9LquM&5mrviY&#?nTH=U4HGjCBk@)H(EE_Lc$mBSD_3y=XL2G( zvOjyUKC81Fi}N$);73f!_Zfrl+J)}tyvOT2$K%|?t(?ng?8ok`$7(FVTuj2ae9|`b z+~aZX=Q7Uc2o7KiHe?AFVp=BWyEg8h7kP>sxssDPnw{91l~|ge@FT`xL_YsE>_6Zs z9^y(a;%E+LYc^qNe!-8Jk`ei`wO!uiMV{hDuH<~q-~^6fKXzw5R%2NfV?JhQdZu6m zzGxMC|K?x3z?0m-6`aIT?8sKE$WqM8^i0P1jLNqyL(er{;4$vw7Ov$~j^_~eWoLfN zuUUqL`6)kO0{+_~bUoy09_A`8=1flENDgEVc3^c@U~Xn%Jif>K%|p)(p63bf#V?tWsTh$jzX^Mnc$yoyf)hA`ZP|=vSd{6Rg72Dyo##By6I{z* zIF>`%noU@eg_(xQ__}e}d&09k#+}^6nViDm{GQENpI@^KKjBAA%6R;zQRunLBizG9 zoXvsk#Rjaw0?frkjLnA)!`>|(U}mOeG`_3vz4IQg@Eo^t9hYz}hq51=unr6JQzm14KB*Tv?(r!1axv#{ z5PP#BYqB77Gcn`vQQfe2n}@iI3ptAuID+lioV8h*pE4WMFd5&}3HwiZi+^$#H*+}` za2h9YF#E7EYqLB{@MET7LdN35+M(|jFYqKca0MrE6g#pN>$5t`u{iTFJJT}-Bk)D7 z(DgU};z91@LeAnK_GV+&W)bFNR;FikM&MsHL&qQ7$xWQaAK05+SeuoZkJ*`!vG}M) z*t^X?_&YaoH5YOg2e2pWvpVxLClfLjA5;(fH+g_N_%navSPo@tHeq#EU`~F_6imqH z)x!P*Ugddi<9bfzcy?hMR$^&pVLC?T+p1yr3eRyf*Ki8Qup?WsJWDV$(=rO*R0(^3 z@+>!TH79d4JFq3c;+M?GRE)@%mBZd8p5_Lw;3SS>d$wRX7H0;2$OwG#b=bSeQ(VvG z9M9ow!=^0FFPM%W@V`o7=U?9E4W8!-?&UVl<8=0C57uQ>mSIumVOFMLGR9$4zN#2{ z|KTnE$@#f;Ai}VA2Au@Gb-O!2;Gl)hnIPVhq#Lyxsvla zg9F%;4Ox?gn3u^IpHIt&uKPUB{rrVLb2z_eb2eaAe#M;pm~j}DcfJbySGkwlxQ0tP zj>Fi8U0I7?GY_*eE~D{fIq!w1d6>U(1E+BU2eS_wu@=ALm(0jijL4T|L&qha<_50d z1dd=^He(qUWqPLIyE0+tInVP1*YX#RQ_M*`7^VkHuJk*_n|kn2;|@hMq_Ki+}JW z4{`+;@+VH>ckIX-tjI6k$$6@Txu58OH zEXN$o#Mq3&m&J7OCNFarH*+?BWFK~A9adp!e!-8Jk`ei`Xy~}iGd#pyT*TR&%+Vac zo@~z+tjB8nj5(NqG5Plwq3bX1=XTEHboOO8)@Ehq@^fZqM#f|$J}Vsd|Ki-q|q zKVSm>n?LkCDh`YFuvp9*P*paPRpVe88 z#hH)UnVu;akMHqKzR>rSw|RxX^9Xlx6KC-Uj^ZHpUTBwqzrgWMQV`2mCKj*!!24c$&X* z6(@5v2e2pGu{rCqD$B4aGw?$uU`#&D9r|wZFn9A;uHqDq;Xw9cBi3RCmSh&DV^YTB z(_G#Uukt*%aXqJVB73j{tFr=&u>eys318<7`%id|$GMKnIG5AdkKNgZO<9)3n31U% znXhw%jw?LJtz5@xoWSmE&uT2sT+Gb4jK+J}!|rwN=XTEL436h;_GLGI%WqhQMVW_L znTE+2i;?*vTj+blzxW4F@*r1mAxCi#Td^@qu?W*M1tajqC!ymKPje$zauP?e16#5@ zOE42tGYa2i4SQF4p4+&d(>amD*q_ZPOial{jKPR}o;mbA;B{W)aqj0Sd^bK8xt@l|I6Tg^Ab<< z0C#XbmvbUVvOjyUKC81Fi!&2bGZAAmB42(KIxq7KH**aaaW*G&G&`|1E3q^`;YUo) z_Zf}v(ubbwyvXg`$Qhi>p6tXHY{+UX&s_gAVuT3MGBYlt@pZcJ^CvvV<6OsOoWK!m z&lar5YAnlQ%*a$s$XJZP7imM+AN-xaaup|YG&`~tE3y=`GCia5T^i4U_js9Sc!;~W zkt;coBiWxl_$|L-Eq=|CEX*`a#yE`1SE)nyKRnB0+|4aq#l;-MA^eu#undbb13zQ} z#^l3Pq30Ga@ic$sDo)`T4rDJjVl7r+NoHX>CS^Q6{V??0=LsI*GS25zj%PQvV^w~| zocx%v8HF!WhW$r8&BNTzjr@s|IE?+-jP+TC<(Pw+n39S3GDYZl%$vN-UEIu-T*T2F z%%1GTnykdU{Dki_1|NJ7dT#O%cX1JCb1?g`6I-(aOR^wyGb!USGG8b6o_L#=c$yoy zfRYyP9|b(K1vokZu2mAa}j5A5PP!`Yq1dXG8yCZY0|KFpU1hMzwl=c zV}CYfJr-jDreYGlP7?N>@EnhG9hY$eN3cCxupXK8vok$YFg~O6ZQ{`PjCXmB zXL*dfxrM8^m@_$rBRP;Q*pOfHbLQm7jKipWl_>Q7!(055r+Jt=_$!xl0jF~!hp|7q zvMrmi4lA)V3o$PR5T-J3Pw0T*`SI z#{O)^`Yg_ZOwFW>%_zJRCv;rpUT)(&PG^7iV0~6+0p?-`e#rM3gKuMp{bxMS6I{n- z9M9ow$L1`@;>^fYjKo*5!tQ0B;X&@?0?y<>_F^N}Vqt#D514@e#tgd;d5VX)f(tp4 z1KE;|Sb~L^hROIQM%a7Gb3D%7+``%Xk$u>eby$U;F$WVdHXlb1`*(PRd$^c$IGBCd zgmqYi`S<}7@cDaT?*UKpAh&Tnr*Q(ivpuV^JaaKK<1!lWMGO1axu4tlGk;=#_Fz3$ zV*%!3V#eX)sGcv6a1R%A4kvRoJF*okvJ|s2J)<)M|B4d!|KLt;;w=8a-t59wY|K(D z!aU5%_>9iKBZvLJc#u1}kh3_5z1f(xS%mqRobNLV-$V+#fATE1a4n~DJiD|WzO{>GpA6TjzotjB6B%`cdnS(u7R7=sacGeYRO%w62f+5C}x*p;G%QT@jc%EFVg@0_oN#<&lB9sZCt~poXsCOk^|X;9oUTZS%u~J1wZ2_{D?6a zkvHFk{>$9O&7932*@sl8vZCQoon1h)Zn^AcC zMcBQ<(>%;oT+A^X!d~pmmTbh5EX>@@!gzd-_x}w&H+X9iCPeac$Uf@aY<8NHcUpS7#*oIA6mc^KnsTi5BpM;JpJjcyk!$q9U$sEm2Y|RQR z$%4$yOiay4eDzQ0dB|J5#M9is75te$aXg2!4V$tyE3*U(F&8s4Hly(64@| zGZm9C1|#zM!_fPHr+A1fxrn1Vn624_rTGOvVoJWx7<}*`?BC=?p5jKX=yZn=9xrwW} zkh3_6qu8D;SdZ0Mmc^Kl+4(+W@ZG)8`JDH7o#%L*>$r?_IgMjEl;83jmSPd+VrHgf zBEHA}?uO1Ayu=;+l`}boz1W#GSdm}ybEaYv#$sgNz7smG@OK{JPHy4~F62*~#Nqs& z-Pn%bur7--KR;w*zPjyu$Fn@fwfu#1IF)_bjdfX-`I(a$_#qQ8CLi7kJ-2w6ySbQi zIE7<4kiFQ5wOD~AS&+GziK!WxuWyE~KY5m0xRz5np554vRrwW*GC#9117k80Z~di% zySasPIF)_bjdfX-`I(c68HfMe2zz&VjQjWtf95duXBW0%WtL@jW@Jo8;;rlMm#2A{ ztGJkBIE3Hw8P8%*D)1#UzZy$h>vM`{8bG;VLfX7!F}Cc4kX9VhI*vS|;ba zKg0fW-s5$i<8iLzGEU$Kwr2~LX9;FzT1Ml$%c0{sFY-9|a~bDz1P8D?+p{U_u^0<5 zJ2Nr`6Y|9$q3aR<;vYQ8gIvx99La&~!49m>3M|fo%)v}d$wYi{Ngsdb5$@zBuHZtB z;vjy~bEY5;V&7_RYD7=1MN&C=OyvHeyK@W;%Yr|1O06e|d?g zd4M}OpEEdsJ=vZuSe_+VfVr5FshE(l`0#w_yTwD?#YLRW!R*5(ti!_mlv$XLNg0p- zoD2JR`6tivAa`;DS8xJHuphg#4V$twzhGW|!gzd-Z_b9kr##DJ+|4aq!G-*Zlh~c@ z*_8EIiKSVHd6|^)7=>@ngwBV&#Y;TR4P3#W`4h)-D0{ODYqK)*F*_4779af{x^D9b z_izd4@&}G(7q($z)@BjrV^*eTbVlH_)1l{Y9_M~;ikZ?8Me=$eJwA5-h-6 zOv1Q~%-5$v=OfOVSdUiOvm^5-^sB5l=pd+=XsQSxrB2$gnju9 z>#`{G^Ft=)ixZv$uk#|eaXlAv4u`NWJM&w9%`*IiA29|a^7--5^MI##h}*f5%Q&CY zIDy^Rj#XHWIhctlnTRisg`UT}$;&*&L)^}d{E3s;gB@6%6@CDaUab+p-z!unJ4_3x33ujL4TqLf2)U;byMkBF^Syj%FveW<%Cwd6r;ire!p~ zI~;nh^CGu%BbRYLM{oeUvpt)#9*eO6voj-8Fd<(Y3SE!*7ysZ%9^?uxh~g zR%9M#Wf~@997g5cgQ4#l_whHb$r?_IgMjElx^6QWm$|FnTnD5 zdQa%P!gJipb)3ct?9TSA#`4U?%#6!uyt_N>UgH@aSoHs~bXQSBRSnxl>F(~9ZUh9RL%O>=BqaptlJ4&A z?(S~s?ru?}1mu6ef6t?-IL32dYwdM_C&1jy!dQ&NZ##nh54_IvJj~r(z!~hv?rg{A ztiviS#X`)*OiaN9jLNY5cYDzLH=pnh4{;agb2|I-SJq(_mf(*}&iMSYE!h8u*LaRw zxP}uslAYL^6A9Rb2AZR z@x!K|>rY3VQ2R-+AgnPJvGuV&aS)bLJk2x5Z zQ5k|CR|UH-`H;uCpG!E0gV>9WS(^o!n;Dsk@fn?OR|Xv~c$UYwo0~a<6F8Lp*p=;A znWdSTX&8|q`FKUpbDIablXEzQBRPmY*ooCxjz#zbGch$2Fb3Z)cR#$#t31uaT*i5v z%+c(`)@;BU{DIl|9g{K!Bk=38pzj^8@+=Q?H`j3)XLB-puoGLb0V}gK3o(Zd}4WIHBFL4Jqa4N^LE8DRO%P=d`GBQK+;}RXb#M3;$9h}Rl9L2$G!zQfBip<4K zjKK(eu{h{?z^gpV!`#gUoWXwV&ibs*yv)WlOv0Fq$d`+Po`<}~b3DR5oX_bT!y)X& zF09FlEY1SV&h(7T(EPa2_v0hp;sNg9S}x^C4q{6-WEGa-kNlnq8I$i91U;{LfhW0+ z%Q%|9^Jg|?EmmR){>YR}$Y>15&+~(xw|vUGyu{Nyz#Ux6r5wemUgsY?%2iy%=^W1??8`1}%S!x- znV6ap7=n-H1bw%7fIB#sQ`wtc*@jJ6lNFhZnHYl+_-b~r|A;4efJ-@-gV~!+Scip} zhlv@RA7=%7Z+MBPxt_~8o0Hj-omq>On2VVho#FX%X0ZQ|$GM+NIERDSi=Eh-4OoNu znUnDuoo{CZ`!9HhSGbFtIGy7;gnikCZP}Q$S&+Gzk*OG;(HVwcrU#vW@fmOPGIwwT zr*bU2vK_0i46`yVBQrFgP76Bj@-TOE0cWruyR#jevkt2;H?uGnBk|kRVE+Se@* z%_qFWi#)~s+|D&z!kL`NVeHRtY|o~w%S!x-Kk|EKU`obgG=}Eq{@xv*@)j@g1P^d4 z*K!eOaXg2!FMnlQHe+p8W=R%gPG)3s#%C0U;irDVx&Go~-sVB>UMF%F~fuU_t-XLy7wxsb!ypDoyc#h9PT z8J}Nz27CYTD$nu|cX2+avoC*TJyv6B7U6eH%2ih5}FY-9|a|!2g5PPvPYqKD8GZAC)L$_f6PhR9H?&o%{ z;S$c|MD}1O)?fwZWJX43c)si!^gQHo?&lKD;UM;6W7cLt=4K+s;)gEI&x<_8^<2&| z9KyD2#?map@0gUK_;2T6_YSXc7dLS_$8!k#vKi~K2!CKw#^t}i1iOFp3jg3C?&5kb z=NwL9FLq&VR%UKyVGKs#=T1S-TVCcFZsbai<1n^o3zlUureku3;g^oV?mb@P9&X`G zPGk>uVl|dyA?9HQres`3We9%k5cJ&QCGOw`PUTp3Wjj`8X%=K|CS**8PX zaD36$J@G2fauZi^9EY(To3k{FFb$J11V8@leee=@a091uEC;hUo3IWGF%J_nHb1rr zcHi(3Z}9+ka4x5^H@mV9t1u61KE=u*^1>^g87((X_<_n`MG(}^@dM*ip6vE*oAFbnWdS9-!T$H z@kz6w;|>pT7w2<2`|?+|Wi!@hW#(oUreY#SXL!D7>YeZy_i-~1VH|#H9PIwZ%RIx4T*+}9#`bK%vMk1Q zOwKU;(kR%y$7|ffEu6`T?7>c~!3xaDjEu%`{M68S`G~i;pW8W$lQ@+9*qJ}G5`SW5 zreQ>erj^^+DnN3-Xl~{s5G6yp-8RIcBL-T3$5t`uqe|q8AJ1Py{MJ zi95J~Q#qDh*^W(EhlQAjnV6d4`K?ya^N=^WpW8WyQ`n1LSeunuk_DNQ8JV2%`K4yi z@eiNz9xw9@4{|5xaw>bXE99|1J-6H#cwv$8sp!u{rCo3iB{4V>2>C@ME>0;}swA1P^d4*K!eOu|IpT0c)@< zi!mLOGY+FLBtKOR`fl+OcW?uzax4e4H-BLpR%9s_U@oR-3Wnv^DnZZRe9k+(!d=|N z<($tc9K$Yb%gQXxEc}j<7>XY%2VH;iA#ZX&w{s1ba3&|R2RpF^8?Y+NG8@w|3F9y# zL-J82-<1crgKN2zqd1tq@fWsaLsnxsW@9==VHkd@81($b$Gpvh+{txZ#@U?Ap6tw4 zY{cp;&m7FaWQ@ni49zDMg5Enk#9ds^e^gQNC9^^Kz<7AHJK=x!uwqku&=MT)zIE=!- z$_72pc!o!~k_$PM{n(84SeSX4n6de>OtANck9dm*xPxoCl(RUA!#RL0*nmZukI5L1 zpGyZlZ+VqxxsfY5hg0|)e_?ahXHn*3R;FcShUSx>f}T4(#9ds^wOEO{n29kMfnQ4oJ@0s(=ed<@xrnnk zp2OLJEm@AmnVu;amr)st|CaFGc!j&TiPJca-PoQ@S(k;GmzkM{2^o{&_+N3~jn}z{ zTR4*w*@Kp5!_%<7ocQpV^c@ zu`tsx2}ANz!C?0`FLNh1avI06E8DR$OEU|z*@jJ6iiMb(i5Y?)e+YJO@e+4%1E+E-Ry=J6`8`Zsl4|;wb*YHmt}}%*a%X z$7uXJSFrz_w|SX6xPePJhXeQ<>$5t4VqvCX5{BfboI%HJUgl12%hW#(oU#$qJC${y@J;#HpILGI){PUC3)&YtYdR&2y# z%+I8Z%ZLog$Ju-b9^ekn;S}~{XVzpz=43`jV>rIZ8tgsbG4A7LuI2=eU_W+eeO6~a z=3qQV3ZT*dJm&JJwJaxBhtOwKU;l0MkI$7|ffEu6`T?7>c~ z&hpI8^o+tVe3~xUy~{(~#d(~@KJ3Q2tjfI1#yE_^ko=T3*nQ2%JjsLH#&ulG+3e3A zY|CaW#X`)%42;Hb{QOYHC52_H=pwl z9_1=7;&hJZ5cXv=)?*R=z@&`JNDRdfDTA&*d6B2Mp36CgL)ezhSeixn9g{K^Bk@~` zVE+SO@*%JB9FK4hH*zKCaT-VSclKmwwqhezXL%N7K4xWFCT47YOdg!)4Il9q&+`QL zaw}JH5vOxJhp;cZuq_+2HY>0s^D`&YF*)Nf3PbW!vfx~|d6_%8k<&Pi-PoR0S(b&F zmzkM{5gC&2lLj5Hd7dY@hD$ht1KEm=Seylzf(iIFNwD{h*Lj{>xt0?-k{#KKA{>nP<3>D>;tC*q$v|mc^Kk$r*-U;A{>gnPJ=D>;tC*q$v|mc^Kk z$r*-UVgw!cc#V6wg)=#k!`PoK*nm}8mW7#@Nf?I_8Itd#2VJjuo+r45OE`i9*^&)e zjQN?I@%bg1@4;(4$0OXsg`CO$?7;@C!Tik0_>9hfq6Ygfd5*`qhD$h-gV>slS&{{r zii!9wO0f5VH+hlUxt>cnhlALQjai!onVT7ziedRRa?o*?S9y{Lxs3DpJNvLH>#{KO zG701GQ>0+`FJ9&uZsbai<1n^mGuCEhmSjO@XL=@OTt;9BK8hIh-Qof6;9O2+Z+2xH zHeo3iVoD}tG=}5n2*LhaKIL6r;7RV|HqPc`j^IGHVk4H|kIcq&Ou{&f$dLRee9-%n z_jrwGc!b-zo=Z4~gV>85*pl^Fjip(HxtWEjn26CCp8tjm`v2w=-r+@_;(l)D8ZO~X zPUH~wWf!((W7cK`mSleBWI85i97bVCehM3$>ozZQCpU5$$FUpRvnlJcF!M4q(=Z}K z@^Kg)yug!O$7P(&$?VC_Y{f<_!5^8N@fn3-_$+kLbB~vKh6lNmb2x<~If%cq1DmlP zE3-5UGB-0a72`50L-F5GLH8>@;&q%L%Ib?92*L=(yyuc&e!;M_YIh?|g9K>JQfz4QtMfd}gGA{oO5p@2|EBu3-xQgRB zoE_MbY^;^ggAwz@+cc0g}ms>fDllU8dVNF(KE@onMhUbg_g53u^%Dr63 zne5LVY`_}K#~h5ysQl||u=k8-c!WE-k;^!blR285`7;}_7R$2)GcYCNF&f`~3Hn~} zERS(FH**CSa4N@gFnjYCwqZloWH}aRdZu7pMrA1e`#I?TlTUb)7kQlfxrJ-EkTW@s z!`O%2SeI3qm)RJHQTW%tzCUmCGIw$#mvJ6{XCHRv&#c6s_#?k(LdN9#PeIRXKHv?W z)gw&oW)7}jlZxaE3!BXFgw#T zDdRE{L-EO9LDwA~;x5kTboS-1tjB8nf!P_Gk@@D0@4?eN%oSX~q3p-5Y{yFciTRn6 z@fn?A_~p-_;~uZ^43BU*=W`NA@fWsXL)K&g=3;uLU|4>A9rXOo=RCtBT*-wT#{O*1 z`Yg(POvZTp{3_Ue%cs1{!~ZkF|9)S$n+rID{n(xLS)KWqgYg)RZ(jyK{{_$T7*}&K zM{popu@Ot~N2X*#Mq@a>coFPB;4$vwV$S9Sj$l7_XFXP9X%^vkOv+IF_j%B9hgZ0Z zo4AbgIGLk4kUiOmwOEeD`2({v4U;e?Bl7jL;JrNNNgm`f&g1Xw!=|juO8kkLnT81& zli~Q^)1c!4Z*brL{J;0Qjk7tKJ=vMHSc%^=Gh;F$Uq1jsJaaGuqcSX?JqmvQJs#$6F5nFI zV|UhLHRfeD#$qJCdKm0I;#HpIMy})>PGK*0VQp4sZf0RDM&h3jg8e5v$%9CBo1Xi zcIMBl#Gm*hzh?%fWIRS=XnwvMbl&Av?&fCB-~JLmuaTF5w(bi!cq7FeE=+4LWY~ zGIwwTmv9aTvL_p{7JuaTOvspgcO}?;#dAE)HC)1x9K@Dv$fC^0WQ@npmxH~xe9F5# z%-vkT8SKaIY{%v-!=g;fWDL#Emx7MFyvp6&%o&`(?(E3wEYBRwz-SD|&ljDaS9z9) zxtj|(gZf;10b?*M zzn%?x?(;hT;8CvPB2MRc{>l!l%CgMLw2Z`1eEdhyahnIYgL65Rz1fv@ScQ3*m9ZI_ zZ_WgJPkEY$xq=Hgl>OM8^;v~wn3ZW6nW6dgbg+Myhq;^cIh}pjjdfUsxtWEr7>R$L z3ih7x6c2Gb*K-Nya3V*tKYOq}Td*vPF)y<*4U;e?Bl5qKLGOFM-~%4xJ}%-c_Gb^) zXLaUd4#s0N{&gbQf5uZh#O0jNA?(X$tj8k!fk_#c{~iza{^k|_!A)Gn@f^-}Y|b() z%Ct)pE((y(fQBOpyMU)@f!DV3ukg7yR##! zu^h889V0U|pB`}!Jj~r(z!@CNq3q4BY{Mq3$%-t_0!+aKjLNY5_ptZDC%nUpJjMOo z&e@#Ip6tw4Y{cp;&!Wu7WQ@ni49%y9+$RrnHy3aQ`|?-TWmV>3R>oo^zCIZ2J?04> z;1bT^AogNo)@DKGW+KL7cz!z&>^|g8?&o&S;S}~_7uI4W=3*vBXL!EcZ7=S(EvggK-#zf9?zRp6~<@a4~1IKYOqqt1%C=GA1MPVatDHxVtcL%%oc#XTcnbSF*-PoQ@Sce6f zn~4~U;rVTsd*)4^<8iLx63*mA4q;z*VOut2O_pPE{=n>v%c%T&XVCeacX)-nxQWv_ zp554ex_HXkbcXA%5aWsEtPj+T2Hez*_XHn*3GR9+MhUUlZLEjrb z;w_%%3GU@q&g4Y)U?;X<16E~O7G_>1VH`$eNIu@?K6#KkIgiuWn_XF(mH9n0GX^8@ z<r@F;h11DA3xCvXJ&u{+zbIm@spzhhE{)BZ}T#Da091s47;!`E3-5+F*U>SzZKpSpYaTja3?o% z8pp94+p{U_vM}>93FGkN@}T1lFY*-EaT!N(Fx#*ROR*4BGcjW@0>3T`_TTY2@AC@( z;34kfd`{;W4q-2LVQV&K4OU<==4Ud-Y{9ZD#&k^1F#NJG*uBFm+`$c;%+c(`)-1>3Ov_{p$xjP{ zy_>wqtz63q9KrT%!O|?k)J)6}{5U_@yTwb~#&w*;QS8LlEYA|mz?2Nf|Kz~fxof?o3btoF%J_mCd2T{++hDtKH(`I;&!g*BF^G?4rgz6Wg9kOb(UvQ=3{22 zVM4}aIQ};$=zqW)+{>+;$%*XFj;zLV%+B6o7~UsoWm*X#V)MP%FN9yjKxU&Ho^IMgBQ4s>o|#{_zT;x zB1k1ov_)XK@mHuoG*r0&_AWqcc2Tj&tuk%Dr5~Ssc&d?8{%- zmd#k3m06MnnTm<{-`Jq%J+JdTw{Q(7a0END70a^(GcYCNF&abj^O&IH4WIHBFYyEq za4Xkx5od7#e`5!>WIa}6X%=B_W??EOVswV*m(jsF{^2#A;}P!RLe6AAc4s|SV_s%s zY)0mrQNjLGp5|e$-~vwNSPo`y{=znF$eJw2;{1Wx`5luo6#pF=bpFXFyvd6^&i&lN zHC)J<9LHho!)~n0s?5WzjLpb=Gs1oHG!JtH7jOvsvMKAb5c4n*WAVdq_riy~$^G2U zHC)1x9K;^%#1?G8sw~UG%*)J7!-R~<_rrqT*L=VmJj-L;&COiF1)R#U9L(Nq!a6L- z+)T)rd^a@cd&P4+&NW=ZksQRs^1P*0Cc4a#@VI3A?9wugNMqmiO8{|Fm9FKDimvAHpu?IV`1}iWp zGcp>(@%g}D|2~g!4;OF-`>{LQu{q1IDDyBYV>2>C@Z$jYz(>5!^E}GE+{9I!&*|*T zU)h$;Seunuk_DNQ8JV2%8HHi^tbcHhdpykDoX_d(!)~m@D$K*IjLpb=(=XV2%3Hj| z6Fk7JT+2nA#qk`@4s6MKtj5wT!raWlR7}L^49^#RgZ>9R%Dr63ne4~ztk3E!!=g;f zWQ@(oeACDM@fI)f1P^d4*K!eOaXg2!FMnk{R%2-vVQyw&DkfrdhUb^wLH|E|#(O-% zJzU6{9LHho!)~m@D$K*IjLpb=)60GGG!JtH7jOvsvMKAb5c4n*WAQ`JVDC>p%W*R1BOuqju=zYxxyuq_P#@*b^6h z%o&`(q3p+ItjEI4%fyV$55IbUyvS4B&+VMUDICc`Y|X~3!3r$K{LIF5Ou{&f$dG*B z&HLj8p5#7m<7zJE3{K!s_G4GJV-wb4A?9Hs#^U>~`goovxQ0tOl7rZTomhhvSd96Z zobefjVfd*_(DN4`^ENN=B=>O}S938(a3H(0Bb&26tFR0UF%L5_H4`uf-*pc9U-3Lo za4)xV6&GnWg zty9qTkT-db$GL_}IFf_dgPmA|6_}G58J*$zvZD?j=YDSC8ZP8a_Gb?^U=9Aj>`cwX z{I5f>|DMlyk4LzN8@ZC>IE;PRjX$#~e_~;N&&*88g#53)KHlI3Zsl4|?tNb8A3Vxk+{ERa&nX@;di&D_3z5hjRdbWd~McIc8^iMrBw&Z5VXi&&tjyBP!tWS~q4=bJuzQDxxQp{S zoufFIzwsBgWJ4Bb0cK@dCT46#UYcw?V#r#uW=8za3&|R2RpF^8?YGjGaJ(}3d8Vet)SyB4{;agaTQr21wHS0m1lX7 zJ2{Wj*o$3QlNFhZnV5nJ__=DZ|CX0|hU>YUV>pDp*oC!OnI&0}DVTtttJvpdp5b~f z=O_+lD>h;==4VpI<;Tjw-Wy)vNv`8E&gNwHWM{TwBNk(RCTDzpsTA!0!)rXpEnLHe zoXLLd&U&oIyv)YfjLbhP2K!HViifzI^Erfl*^KpAnWdS9-!Tzm@m+;r{}s>j7*}#3 zhp;c3unvFZ_e{u`d{^Ec&+#}{b1{c=09&vDi!vXRGA=)r3-Wji)! z9ado}7Gf@DVhSc;REFjAvO(W{Uf~}+#9ds^<($JQ9LYg!#YQa70!+^M{9GpJdCM#O zgPXXD<2jri*pl^FjXy9u<1#8k@!!%x#~ohbDIVf-&gT@4VHdV#WtL_Ze#b}*#V0@M z;GzHde}8`NF0SWtj^PmYVi&e%W0w4%|M%z77Gx?W;ImjS8y(;vNyZ34V$nO z3o#cnF$N>>Yq6l`9iQ_)k8&?JaTUjNIQ#Nfwq-MxW)bFQ7N%k%ek&UEec($z5iJ!z0|ujhx1D?8f$N%DODfyv)orOvspg zUohx;%?G@}ecZ;?T+9(1$nNaO>MYM3%)n?2#}_{aJr8)4d%2J^*^k{>pVgU_kw46jJvs+GdO|W*^$**o;jF-Q5c4w@_QG&%ro4`m7K?E?89!X%c{)FY>dMw z{3~Cu|BPpNge$m!L)e#1S(k;Gmq{3hpMG#&UgjBYU{9^^94+8#YLRX@f^aw?83He%-XELlFZMXjQ>CX@Ap^H z`Oo*kzrW-;9_MN<=5P*R3pQXe=4W!o=a*c;-amZCd%VmuJjk6~$7P(&$?VC_Y{f>b z&hjkEe9X$UOw8DPpVNEf1K!|S9^*9gl{E{Q+yvJ)i z!y{bDg`CE5{GEN+gmqYfC7F*o_#KlnCL{7|_Mr0}pYa|Kb2sO6I{UC2>#{2IFe_s* z5?^Nv_8;>E4{!_DZ~{lLBU`aNOE3ddG93TQ8tgvc4esSu&g4XPXGd0Nd1hyNMqwB} z%@XY1dYfJ4}q%~+2`_ydzNF8|FK?EcLw{DT|0l4CiPZP|>aS%hhrgdzAbL$G_3 z7rBk=xQMgZpFP-sHJG0{8K2SlPx@f@CC~9VS939ka{ybg0gEv|lQACuP3L}jnP<3x zD>#Q!*pr=EiFmR9tivkI!>o+ONPL~z{qh74a0%yd0!Od| zTe2LBGd)uo+W$b6G5*n7%byu=;cz@?na!R*Z@tiwXg!%R%g2n@k@NrRqOJkJx{ z%dMQnN$kN+tj_Yx&h(7JFnpFI*uTdk+{1;O$#ERUKJ3Py*_5?di6!_WQ!*i=F&sZ9 z4*K5mDev+UPxAnGa4x5E6bG{no3JJ;G8Z#31rzXVqM+{`pYuMCaxXV=6~}Wp`|?-T zWmV>7HpXETzDXGLJmqN~<_>P)6pmpRwq<3OW)^wxtj4^|#?(yA5d0V~=y=6PJi!Cp%C(%t zQ5?YE*pM|@j>VatDHxYg`FGr)>pB16QLf@54(9;2WJ4Bb0j6LAMrBw&jT7wO7PT@!nVt00ARhDI8=4E2W=7-op&!4=&lU&QC9LYg!#YQa70!+^M{2VLTd&?{Q zgB!V$V>y&<*^EE2FjF%zzr_spKJW%Fa4XkxB1f_#Td^FAGaZvNG(X1(cJJ^CcXA`A zaxA;BEi3USW@2iF=eOv=-UHs?K5pY|PG(PbW-V6Y_sqx z@A4{7^DuXC1DA3xCvg-9@Hci~OV(pG{=n>v%c%T2V$l7ZXLy7wxPU|0mrYrhg_)O` znT8P=lJ6q~`>%O{C%KQ?xSESOgA+KE{n(Z5*o1Xhhf&$3{Wun_YwF=I0VL-1W__s9FZ&OdmRySRzVIiEw=mrYrhg_wtl7>n;id4IgXlibH` zoXyD`!GUbWMy$^AEXsV$%Ct<(*o?psd>7LF@jOp(FSl|P7jZhra|rvg3)`|WYqKD8 zGZAAkJimnqI{)EI-s3gy;TF!|1pdkntje;?%CwBk(0uwW#Q**&M7X;=%-!6;6`aed z9L2%>jlZxZ8?qY9u?T-)QpRN@hT@0+g5E#*kT-db$GL}FxRMJwjpNvj?OBy&nT_d~ zgmL)kYtZ)>AM-XZ@Fdr98AtPX{>-NQiG`VlNf?r!z62e&d6_%8k<&Pi-PoR0S(e$D zj!_tf&prpc_jrVRxR5j1pFP-sHJG0{8K2Sl&%eRmOP=F#uHh1nz~fxof? ztFaujF&!f_G@rZ+_V4f@cXBP4awG?_H5;=e3o;cG@!LPa-Ur^~MQ-CdPU0wbVry1l zNoHV5hW&pm+jrcX^Zxkppe1U>&cQii$0)HXRs}^+#Eu=cVuw<(Dkx&d4mCol*r}PC zp+@YWh#j-B%i)Moe*Jx~=U>mq<7#`qU!V8&x$n03qvfps26I2PF})uc?8FB8*auGxHSLy$$t3(-{K>@kCQl&XYeHM z%iXvk*X9yjkpG<-%>R}hws|*iWtk-&%ze2zH{`#$IDh}qe)%?EE=yqx2B40qvnT#Ku4KF-A%U)wLI@iE@SYj`2g=3zX5qqqr| z4#c?r+u5gfy{cjfj>G0A^(asKgnF#l)1%h&lJ?`DN%9>s&1W{N9t zY5x6LFzr_Yc0Hk)kl3SP(p^W2ZS zb31OqRk$qY^#@f^n^c@VSAaD5KvA{@paKM1;K@D)DG+j$eu;we0U zdvY{KaYL@nCAc7edOw)|H9z9pe3bX|8eYl?JdFo(FOK90uFe%0WrV-J7xaA3H~A9p zn{9aZ_xo<=MV!FHc_6puNUqD(8Do^Qy1~c)mGARSKEnHWB`@M}Je>P;4{pqL8E1?` zXFJF2^UZoU@MnI**ZBe;=Yzb1H}h&s@@G2h|KoW?q9Jcp-q4EN?v+=gp#MgEHmb8i0qQqc1`KVXM#KEa20 z9WUoeJeIq0G&kpl{12Dle4LB@7lW=I-{z~F!aH~|&*9-bkXv&kSK!iIkaP2!b};`l zKF=q43$NpNj^hy=!>u`zD{yIsICvqL`yr=uDyQ&jUc#|Fk{PBsoGWn{=j4p%gSnq@ zI$vRfbzaPKcnXi_VLX7laWvQFs$7tB^V{cwp3nILpW-A=?nJ2&DwT#^fM2>+TE%>R_{@ku_+>v<*1EO8u<;jY}CBRPVr za|JHJ1vwZ0d?x7YvCCKa93SQVyq!1kN?yd{csTdvZrqleb3LxX<@hiD{dCazKYqZs z*kprO@nRm&BX|J!W6S z{Gl22eZ`kKjZHRq8*kv{ynx5>Q0~oLID%_(5f0-IkLck`e1^C4CQjgK%rVPNxE`a7 z@Rx^!dEc?eE+6NEtg^xrcocW$wp^1da~S93R}TgAKjt%hlsEEfUcj?>DEH@<+?dO9 zN&fj@Fz>(YvcrdX4=>~SJer4aTW-#k_-`)EdHMYV!Tc}z5})DiyoqP=6duh(xE;6P zDqNOB_}Bfx+@JV0Kju4pnbTNjjaTtvp2bsmEDz&oj^c(~n@ey(&c#2c1id|W`8Xfs zHN2E(@f04wJvo}A7-x(_Ija%O|C!(L6TZt=_$=?>%{-Umc@X#EX54^Fb5RcN3p!@< zOMb*R`4XSvBfOqh@?;*zJ-8#+;c8rvbMxDKgPzaXW{bD+2A;)Jcq|X&zTA!5a&xZC z|8P;x#}Ehi1YO_rOTN!H`3Udht-PL>@qCWwIPSw;nP!UXb2yjhQe24h@UOdr?qB#G z-{7-+oKtuQujiFKpJ(y}9>oK>7kA{=+>mQ?W&VeYaz4(yE9md@RX)c@c|Wh=rJTUi zcp&%UNRHs@T!B$W_{*I^&v$&CFYr;`&ue%oPvBA9ncH$CM{sqnz`6PN9YM!W{F<-v zc|OJmSY?Ih@N^!}BX|J!Y7kA{=+?eY!&KQUAuSr2ik6k{&hj<+?=Se)4yK;Lb80P{U z%0F%i=Kjog_!=MJU97Rn(|7{2%y1Mp;j&zk!#F2r+#K|L!e{w7Z|1ce&vD#`yE4fH z7v}=}xfaa(hOhGl-pyNiKF{Q#+@HI0d#0G=aIVCqxCrOrKQ{$kzwkSL%J=vhpXXzI zfOXb*6))ylJcY;dFz(CUxGgv52(HN$xHKaSbJmT)xqjt0{EYANbw0?uc{8u&B|Mj> zaxC-Aad+;(Ew~Za;woH*i*ay6&_9#Y`3f7X^CC`Qo;i-l<)90 z-p@OE3D4z`JcwClxE|MFgkgR+F_`}aU*yxA%o}+&Pi2l-Zp!t!6c^!d*9G%_1MNYmVf)T%9pSxd4aqk86T+{mdEsgwy#7 zpXOBF%gLO`D_CZUC-P{H;ojVd+i(-E$5pu;m*9e&i+^4noNFfg{D^P!B|gJPcpq=& z^}LMdb3DiKNFKy2Gu(=saviS5Ww|8h=MesWm3zpq_%Yw&%WSd9dw3hKY$(=Zg zn{aKe%KvZ)&d0epxWYZ;m;8ut@+CgSM|d}H<+Z$w=W;y9@o}g{xHos<2(HORIE+7B67+nr3z_WM? zkL6(;%~4#H%W-c0ePJ;FGrrF!`7kH)3Km)5?%aXva5XN(dHCH0!Q3zS9^c@@yq8z- zLKc|k4%~{Xae2N8THdp0>oSWaA8}xj}=lLWj zaUx4BazF0Qjkpe%;DY@5oM7HJe4Q`wE>2>ZC7#HmxeK@BT3m(ma|pkl5X}FS&+>6j z;T^n$=kiD%#57Y}iT~!D{NwCk?k9YgkMluZ%gZ>9$8c9}&jjOKfJ6DsS>7*S;8VPn z*YixC%>B6sH{{w}k<0L(GlO}*@jHIO7x)w(si_m}l`69?QeHFL&d%+?*r0CKu&=oOw!cjy_-JG&b4b6}*ro7P$|1 zWtu52&!xB^=jOL32R)y&%MPF86TF{y@+Mxxi#UNN^Ee*L{kbc*XNpM<=Sp0Pi*O$P zQ*=N09Y5uJe2vfZF+RXLYdnXia}4+9X54_wa54UNQqc7y-{ecYkGJ!BUdi)$CJ*KQ z+?*S7I9K8@&dC|$f}T$}ov&~T@8Bgom#1u^af#9xjJdcI?aZQjjWc|OnNq1>Ola(kwj}h`$`;{qPOG z$a^`N7xHZ8nd4U6l*@A|{&RFN?>BzP>72?byqcGAERSS{X%6Q~9L7005AOH|6?Vii_~KBZB!q zaynn()11m1c{MNO*~~M?t+*+d=TiLVaPOZVayqAS3a{eDJd-E$Xdc47xHGrnrd*q= z^50yXgM838lb`bgzQ*S{l~Z^tuji#akEif>9>V>&1vlbaT!qVUG0w|5_|;)S|Hquh z$5>;Pr}ISa#htl6hjU@h%O4I6=6%Hv_!ir2@gd&B%XtBhW!5Ajak!fSXbPvB8J zfO~Q@M{xtL#TB^>7v{YD;UMpqFLN5}tnnP4&f|Fmcj7kOgzNENT$ukG6U_gCpYsE@ z*yKIDjTi7N9>xPWikon4uF3^DH@`hF==q#ocK8tQ;Vrz5XUsM{`_Gpr@hBe5y|^<+ za80hjr5RzE-{*pl|0Un&n|y&!@j>3rn|UqAa~zN4LCiA4t+*-I;c8r#OLBe=;qM0o z{Xg*?zQzZ57b`6DXdc47xeGVoT3nIKa1Q>yf6(zU-{H%g#yV>}ho^H4_vU8YfXi?( z{=T2{^Bum%2Y44R<#{}nV|f@4;I7=B3C8(vF3w?`lQZ@W`aa=wzQQTIgE#VOUdXdq zWPyipKW@Q|xE5F8{2aos_X+ww<@0=!lQ@wj7I`!e;db1Dt8iHk;a_{3%lG&sALd=0 z#4<}fnENurG&kXTj5EfeoV8cb^E1EUCw!NW^FiLhn|U=a;qkMbWA@jtBe)~C=IUI5 zVTSl+Hu&`)@o7%wjl7ztaxC-AaVu`h<+&99*)y2;8$aM%e1!M$3SP)#c^J3nmW(sT zp`5ixF!wXQ&)4|^@8TquS>nOmmz#4#uE~|TG#6!nm0HMt0f@yF4@{26?O&+-o5%yT)O zV|gSqOmjF_;xNw1-?k6t|H$clg->%T@8x7($g^2wfroHEZo!SXESKb8+XX$p@N0g` z=lLWb;9ab+%+q-y_vS9#ikosBuEvEp5C7U$AHU|Oe21@b8XseWbzaPKSY&~Ra6e|4 z=B8Yqt8sbG&A-z@_s{%>ukm@_$y<0X$8!w#=4RZ0%WyFcwh89W&Kl*Me2-7?A>P58c@9tK81Bu@xB-{qA{@$DTL$w#5La%C>fMLAe6=$pwe z`4OMtqr8dN@FGs&;XIIga7V7o)fr)!v(^oIe&sj(jL-8)-pp%x5hw6)9>}dZk}Gg& zMi}O-b@Z^y4yW-k)>!4mJcmbc4EN+t9K}tzHdp0;xCH0pTpXM>^I%~Xw7xGvh#_hQ!SK+c8!oSuC=6}lf_#_|Zb-bJ>@mTK0 z(cGLHa!szxrMW17Tiw0kTYQ-f)_F0{;Sn6etvQk_aA}4(SS^_QJ-_6Oe43MaBd_3v zJeG%Xdv3`MxE2@TFwR;v==hcI^G!a&`*1MNYmVf)T%9pSxd4aqk5z)6pE-k{a5`V%)11nCIhhlA1|pC+?zXb z8*ak&xGI<95?qjT@z0fmbIoL*AMtIz#AkRrZ{n4_h-dO-9>YVq4|ipnDX!1qT%JpD zA+)c?h@V=3JTo;i8<6KduM}t24$Z7vNC-v0TvqGiUGpW_p} zh1c;6p2U5*8#mw`&*GunpIdMv{)bEO&n1F+|7DjQKE!)?IWOR` zJdC3`imP%t&dt9U59WT(5BL-x;a!}>GD|#>M{^f$$F;Z$=jRai7YjOie3p;%W?swj z9LIgQE7MGICH|Xp@{dJ>xu5V|KF$YuEidCZ9>ZO^Jrj&`0S@Iiiv)8&;|qL>xAJ

49G=4Cc^D7i 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 From db22de28075764cfa40564ecdf909c508f015969 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 6 Sep 2015 16:23:00 -0400 Subject: [PATCH 032/212] ignore coverage files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index fbbb1ef1..ef9ac6ca 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,5 @@ vendor/gtest-1.7.0/scripts/gtest-config *.dirstamp *ltmain.sh m4 +*gcda +*gcno From 0dd9512c08057dabc4433f60cc7dc2976dee8f22 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 6 Sep 2015 16:23:32 -0400 Subject: [PATCH 033/212] ignore test-program and .libs directory --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index fbbb1ef1..5adf8c9a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,8 @@ config* *Makefile *Makefile.in vendor/gtest-1.7.0/scripts/gtest-config +test-program +.libs *autom4te.cache *aclocal.m4 From 99762c5f9b3622122ef75824b3c0afc573d990dd Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 6 Sep 2015 16:24:58 -0400 Subject: [PATCH 034/212] add unit test for basic auth --- test/test_restclient_get.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/test/test_restclient_get.cpp b/test/test_restclient_get.cpp index 28a81ae4..ede7aa27 100644 --- a/test/test_restclient_get.cpp +++ b/test/test_restclient_get.cpp @@ -58,11 +58,11 @@ TEST_F(RestClientGetTest, TestRestClientGETAdditionalHeaders) headers["Accept-Charset"] = "iso8859-2"; headers["Accept-Language"] = "en-US"; headers["User-Agent"] = "restclient-cpp"; - + RestClient::response res = RestClient::get("http://httpbin.org/headers", headers); - + EXPECT_EQ(200, res.code); - + Json::Value root; std::istringstream str(res.body); str >> root; @@ -93,4 +93,21 @@ TEST_F(RestClientGetTest, TestRestClientGETTimeout) EXPECT_EQ(28, res.code); } +TEST_F(RestClientGetTest, TestRestClientGETAuth) +{ + RestClient::setAuth("foo", "bar"); + RestClient::response res = RestClient::get("http://httpbin.org/basic-auth/foo/bar"); + EXPECT_EQ(200, res.code); + + Json::Value root; + std::istringstream str(res.body); + str >> root; + + EXPECT_EQ("foo", root.get("user", "no user").asString()); + EXPECT_EQ(true, root.get("authenticated", false).asBool()); + + RestClient::clearAuth(); + res = RestClient::get("http://httpbin.org/basic-auth/foo/bar"); + EXPECT_EQ(401, res.code); +} From a00b6b6e55aff8dccf36b6ea2819576ee0b0a1a5 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 6 Sep 2015 16:27:10 -0400 Subject: [PATCH 035/212] add --enable-coverage option to configure script --- configure.ac | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configure.ac b/configure.ac index 9807fde3..9b42062a 100644 --- a/configure.ac +++ b/configure.ac @@ -36,4 +36,6 @@ AC_TYPE_SIZE_T # Checks for library functions. AC_CONFIG_FILES([Makefile]) +AC_ARG_ENABLE(coverage, + AC_HELP_STRING([--enable-coverage],[Enable code coverage]), [CXXFLAGS="$CXXFLAGS -g -ftest-coverage -fprofile-arcs"]) AC_OUTPUT From 7a8eb0114051aa6dcf5246cabb801eb3588b7a79 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 6 Sep 2015 16:35:12 -0400 Subject: [PATCH 036/212] add basic utils and make targets for coverage report generation --- .gitignore | 4 + Makefile.am | 11 + utils/lcov-1.11/CHANGES | 551 ++ utils/lcov-1.11/CONTRIBUTING | 96 + utils/lcov-1.11/COPYING | 339 + utils/lcov-1.11/README | 140 + utils/lcov-1.11/bin/gendesc | 226 + utils/lcov-1.11/bin/genhtml | 5989 +++++++++++++++++ utils/lcov-1.11/bin/geninfo | 3755 +++++++++++ utils/lcov-1.11/bin/genpng | 389 ++ utils/lcov-1.11/bin/install.sh | 71 + utils/lcov-1.11/bin/lcov | 4325 ++++++++++++ utils/lcov-1.11/bin/updateversion.pl | 146 + utils/lcov-1.11/contrib/galaxy/CHANGES | 1 + utils/lcov-1.11/contrib/galaxy/README | 48 + .../contrib/galaxy/conglomerate_functions.pl | 195 + .../lcov-1.11/contrib/galaxy/gen_makefile.sh | 129 + utils/lcov-1.11/contrib/galaxy/genflat.pl | 1238 ++++ utils/lcov-1.11/contrib/galaxy/posterize.pl | 312 + utils/lcov-1.11/descriptions.tests | 2990 ++++++++ utils/lcov-1.11/example/README | 6 + utils/lcov-1.11/example/descriptions.txt | 10 + utils/lcov-1.11/example/example.c | 60 + utils/lcov-1.11/example/gauss.h | 6 + utils/lcov-1.11/example/iterate.h | 6 + utils/lcov-1.11/example/methods/gauss.c | 48 + utils/lcov-1.11/example/methods/iterate.c | 45 + utils/lcov-1.11/lcovrc | 160 + utils/lcov-1.11/man/gendesc.1 | 78 + utils/lcov-1.11/man/genhtml.1 | 569 ++ utils/lcov-1.11/man/geninfo.1 | 531 ++ utils/lcov-1.11/man/genpng.1 | 101 + utils/lcov-1.11/man/lcov.1 | 886 +++ utils/lcov-1.11/man/lcovrc.5 | 841 +++ utils/lcov-1.11/rpm/lcov.spec | 51 + 35 files changed, 24353 insertions(+) create mode 100755 utils/lcov-1.11/CHANGES create mode 100755 utils/lcov-1.11/CONTRIBUTING create mode 100755 utils/lcov-1.11/COPYING create mode 100755 utils/lcov-1.11/README create mode 100755 utils/lcov-1.11/bin/gendesc create mode 100755 utils/lcov-1.11/bin/genhtml create mode 100755 utils/lcov-1.11/bin/geninfo create mode 100755 utils/lcov-1.11/bin/genpng create mode 100755 utils/lcov-1.11/bin/install.sh create mode 100755 utils/lcov-1.11/bin/lcov create mode 100755 utils/lcov-1.11/bin/updateversion.pl create mode 100755 utils/lcov-1.11/contrib/galaxy/CHANGES create mode 100755 utils/lcov-1.11/contrib/galaxy/README create mode 100755 utils/lcov-1.11/contrib/galaxy/conglomerate_functions.pl create mode 100755 utils/lcov-1.11/contrib/galaxy/gen_makefile.sh create mode 100755 utils/lcov-1.11/contrib/galaxy/genflat.pl create mode 100755 utils/lcov-1.11/contrib/galaxy/posterize.pl create mode 100755 utils/lcov-1.11/descriptions.tests create mode 100755 utils/lcov-1.11/example/README create mode 100755 utils/lcov-1.11/example/descriptions.txt create mode 100755 utils/lcov-1.11/example/example.c create mode 100755 utils/lcov-1.11/example/gauss.h create mode 100755 utils/lcov-1.11/example/iterate.h create mode 100755 utils/lcov-1.11/example/methods/gauss.c create mode 100755 utils/lcov-1.11/example/methods/iterate.c create mode 100755 utils/lcov-1.11/lcovrc create mode 100755 utils/lcov-1.11/man/gendesc.1 create mode 100755 utils/lcov-1.11/man/genhtml.1 create mode 100755 utils/lcov-1.11/man/geninfo.1 create mode 100755 utils/lcov-1.11/man/genpng.1 create mode 100755 utils/lcov-1.11/man/lcov.1 create mode 100755 utils/lcov-1.11/man/lcovrc.5 create mode 100755 utils/lcov-1.11/rpm/lcov.spec diff --git a/.gitignore b/.gitignore index 63747024..74a7b5e0 100644 --- a/.gitignore +++ b/.gitignore @@ -23,5 +23,9 @@ test-program *.dirstamp *ltmain.sh m4 + +# coverage related files *gcda *gcno +html +coverage.info diff --git a/Makefile.am b/Makefile.am index aa7738df..4c9d6b94 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,5 +12,16 @@ librestclient_cpp_la_SOURCES=source/restclient.cpp librestclient_cpp_la_CXXFLAGS=-fPIC librestclient_cpp_la_LDFLAGS=-version-info 1:0:1 +.PHONY: check clean-coverage-files coverage-html + test: check ./test-program + +clean-coverage-files: + find . -name "*.gcda" -print0 | xargs -0 rm + +coverage.info: + ./utils/lcov-1.11/bin/lcov --remove coverage.info "/usr*" -o coverage.info + +coverage-html: coverage.info + ./utils/lcov-1.11/bin/genhtml coverage.info --output-directory html diff --git a/utils/lcov-1.11/CHANGES b/utils/lcov-1.11/CHANGES new file mode 100755 index 00000000..2b1ae8ce --- /dev/null +++ b/utils/lcov-1.11/CHANGES @@ -0,0 +1,551 @@ +Version 1.11 +============ + +genhtml: +- Added current time to date information in HTML output. Based on patch by + sylvestre@debian.org +- Improved --demanglecpp performance. Based on suggestion by olly@survex.com +- Improved memory usage when combining files. Based on patch by olly@survex.com +- Changed initial function table sorting order to execution counts. Based on + suggestion by paul.bignier@hotmail.fr +- Fixed incorrect function execution counts when using --demanglecpp on + functions that demange to the same name +- Fixed handling of prefix with trailing /. Reported by ahmed_osman@mentor.com +- Fixed "use of uninitialized value" warning when processing incorrect + test description files. Reported by lbalbalba@gmail.com +- Fixed reordering of unnamed branch blocks during coverage data merging. + Contributed by jhutz@cmu.edu + +geninfo: +- Added exclusion markers for branch coverage. Contributed by s_stigler@gmx.de +- Added toleration support for .gcno files with trailing garbage. Reported by + christophe.guillon@st.com +- Fixed parsing of gcc 4.7 gcov format. Reported by fa.soft@gmx.net +- Fixed geninfo aborting on empty data directories. Based on suggestion by + rich_drake@yahoo.com +- Fixed "no data found" warning when using lcov with gcc 4.7 +- Fixed --no-external not working with --initial. Reported by + malcolm.parsons@gmail.com +- Fixed handling of non-english locales. Reported by s_stigler@gmx.de +- Fixed gcov tool version detection for gcov versions containing additional + versions in parenthesis. + +lcov: +- Added compatibility support with LLVM's gcov (NOT llvm-cov). Contributed by + jonah@petri.us +- Improved memory usage when combining files. Contributed by olly@survex.com +- Fixed lcov aborting when using --diff on a patch file that changes the list + of functions. Reported by Nasir.Amanullah@us.fujitsu.com +- Fixed whitespace handling in --rc options +- Fixed --config-file not being passed to geninfo. Reported by + liuyhlinux@gmail.com +- Fixed missing description for command line parameter value in man page. + Reported by sylvestre@mozilla.com +- Fixed reordering of unnamed branch blocks during coverage data merging. + Contributed by jhutz@cmu.edu + +lcov.spec: +- Fixed Perl dependency statement + +lcovrc: +- Added config file setting 'genhtml_desc_html' to allow using HTML markup in + test case description text + +CONTRIBUTING: +- Added contribution guidelines + +README: +- Improved note on lcov usage + + +Version 1.10 +============ + +All: +- Disabled branch coverage processing per default to improve processing + performance (can be re-enabled using a config file setting) +- Added option --rc to override config file settings from the command line +- Added option --config-file to override the config file location +- Fixed handling of '<' in filenames + +genhtml: +- Added option --ignore-errors to continue after errors +- Added man page note to further explain branch coverage output +- Fixed man page description of default coverage rates +- Fixed HTML page title for directory pages +- Fixed handling of special characters in file and directory names +- Fixed directory prefix calculation +- Fixed warning when source files are found in root directory + +geninfo: +- Added options --external and --no-external to include/exclude external + source files such as standard libary headers +- Added option --compat to specify compatibility modes +- Added missing man page sections for --derive-func-data and --no-markers +- Added support for MinGW output on MSYS. From martin.hopfeld@sse-erfurt.de +- Added support for gcc 4.7 .gcno file format. Based on patch by + berrange@redhat.com +- Added auto-detection of gcc-4.7 function record format. Includes + suggestions by garnold@google.com +- Fixed exclusion markers for --derive-func-data. Reported by bettse@gmail.com +- Fixed processing of pre-3.3 gcov files. Reported by georgysebastian@gmail.com +- Fixed handling of '.gcov' files +- Fixed warning about unhandled .gcov files +- Improved --debug output +- Removed help text for obsolete parameter --function-coverage + +genpng: +- Fixed handling of empty source files. Reported by: sylvestre@debian.org + +lcov: +- Added options --external and --no-external to include/exclude external source + files such as standard libary headers +- Added option --summary to show summary coverage information +- Added option --compat to specify compatibility modes +- Fixed missing Perl version dependency in RPM spec file. Reported by + Martin Hopfeld +- Fixed geninfo not recognizing Objective-C functions. Based on patch + by abrahamh@web.de +- Fixed option --no-recursion not being passed to geninfo +- Fixed capitalization of the term 'Perl' +- Improved coverage rate calculation to only show 0%/100% when no/full coverage + is achieved. Based on suggestions by Paul.Zimmermann@loria.fr and + vincent@vinc17.net + +lcovrc: +- Added description for geninfo_compat setting +- Added config file setting 'genhtml_charset' to specify HTML charset +- Added config file setting 'geninfo_external' to include/exclude external + source files such as standard libary headers +- Added config file setting 'geninfo_gcov_all_blocks' to modify lcov's use + of gcov's -a option +- Added config file setting 'geninfo_compat' to specify compatibility modes +- Added config file setting 'geninfo_adjust_src_path' to enabled source path + adjustments. Inspired by patch by ammon.riley@gmail.com +- Added config file setting 'geninfo_auto_base' to automatically determine + the base directory when collecting coverage data +- Added config file setting 'lcov_function_coverage' to enable/disable + function coverage processing +- Added config file setting 'lcov_branch_coverage' to enable/disable + branch coverage processing + + +Version 1.9 +=========== + +genhtml: +- Improved wording for branch representation tooltip text +- Fixed vertical alignment of HTML branch representation + +geninfo: +- Improved warning message about --initial not generating branch coverage data +- Debugging messages are now printed to STDERR instead of STDOUT +- Fixed problem with some .gcno files. Reported by gui@futarque.com. + (file.gcno: reached unexpected end of file) +- Fixed problem with relative build paths. Reported by zhanbiao2000@gmail.com. + (cannot find an entry for ^#src#test.c.gcov in .gcno file, skipping file!) +- Fixed problem where coverage data is missing for some files. Reported by + weston_schmidt@open-roadster.com +- Fixed problem where exclusion markers are ignored when gathering + initial coverage data. Reported by ahmed_osman@mentor.com. +- Fixed large execution counts showing as negative numbers in HTML output. + Reported by kkyriako@yahoo.com. +- Fixed problem that incorrectly associated branches outside of a block with + branches inside the first block + +lcov: +- Fixed problem that made lcov ignore --kernel-directory parameters when + specifying --initial. Reported by hjia@redhat.com. +- Added --list-full-path option to prevent lcov from truncating paths in list + output +- Added lcov_list_width and lcov_list_truncate_max directives to the + lcov configuration file to allow for list output customization +- Improved list output + +COPYING: +- Added license text to better comply with GPL recommendations + + +Version 1.8 +=========== + +gendesc: +- Fixed problem with single word descriptions + +genhtml: +- Added support for branch coverage measurements +- Added --demangle-cpp option to convert C++ function names to human readable + format. Based on a patch by slava.semushin@gmail.com. +- Improved color legend: legend display takes up less space in HTML output +- Improved coverage rate limits: all coverage types use the same limits + unless specified otherwise +- Fixed CRLF line breaks in source code when generating html output. Based + on patch by michael.knigge@set-software.de. +- Fixed warning when $HOME is not set +- Fixed problem with --baseline-file option. Reported by sixarm@gmail.com. + (Undefined subroutine &main::add_fnccounts called at genhtml line 4560.) +- Fixed problem with --baseline-file option and files without function + coverage data (Can't use an undefined value as a HASH reference at genhtml + line 4441.) +- Fixed short-name option ambiguities +- Fixed --highlight option not showing line data from converted test data +- Fixed warnings about undefined value used. Reported by nikita@zhuk.fi. +- Fixed error when processing tracefiles without function data. Reported + by richard.corden@gmail.com (Can't use an undefined value as a HASH + reference at genhtml line 1506.) + +geninfo: +- Added support for branch coverage measurements +- Added support for exclusion markers: Users can exclude lines of code from + coverage reports by adding keywords to the source code. +- Added --derive-func-data option +- Added --debug option to better debug problems with graph files +- Fixed CRLF line breaks in source code when generating tracefiles. Based on + patch by michael.knigge@set-software.de. +- Fixed problems with unnamed source files +- Fixed warning when $HOME is not set. Reported by acalando@free.fr. +- Fixed errors when processing unnamed source files +- Fixed help text typo +- Fixed errors when processing incomplete function names in .bb files +- Fixed filename prefix detection +- Fixed problem with matching filename +- Fixed problem when LANG is set to non-English locale. Reported by + benoit_belbezet@yahoo.fr. +- Fixed short-name option ambiguities + +genpng: +- Fixed runtime-warning + +lcov: +- Added support for branch coverage measurements +- Added support for the linux-2.6.31 upstream gcov kernel support +- Added --from-package and --to-package options +- Added --derive-func-data option +- Added overall coverage result output for more operations +- Improved output of lcov --list +- Improved gcov-kernel handling +- Fixed minor problem with --diff +- Fixed double-counting of function data +- Fixed warning when $HOME is not set. Reported by acalando@free.fr. +- Fixed error when combining tracefiles without function data. Reported by + richard.corden@gmail.com. (Can't use an undefined value as a HASH reference + at lcov line 1341.) +- Fixed help text typo +- Fixed filename prefix detection +- Fixed lcov ignoring information about converted test data + +README: +- Added note to mention required -lgcov switch during linking + + +Version 1.7: +============ + +gendesc: +- Updated error and warning messages +- Updated man page + +genhtml: +- Added function coverage data display patch by tomzo@nefkom.net (default is on) +- Added --function-coverage to enable function coverage display +- Added --no-function-coverage to disable function coverage display +- Added sorting option in HTLM output (default is on) +- Added --sort to enable sorting +- Added --no-sort to disable sorting +- Added --html-gzip to create gzip-compressed HTML output (patch by + dnozay@vmware.com) +- Fixed problem when using --baseline-file on coverage data files that + contain data for files not found in the baseline file +- Updated error and warning messages +- Updated man page + +geninfo: +- Added function coverage data collection patch by tomzo@nefkom.net +- Added more verbose output when a "ERROR: reading string" error occurs + (patch by scott.heavner@philips.com) +- Fixed geninfo not working with directory names containing spaces (reported + by jeffconnelly@users.sourceforge.net) +- Fixed "ERROR: reading string" problem with gcc 4.1 +- Fixed problem with function names that contain non-alphanumerical characters +- Fixed problem with gcc versions before 3.3 +- Updated error and warning messages +- Updated man page + +genpng: +- Updated error and warning messages +- Updated man page + +lcov: +- Added support for function coverage data for adding/diffing tracefiles +- Added --no-recursion option to disable recursion into sub-directories + while scanning for gcov data files +- Fixed lcov -z not working with directory names containing spaces (reported + by Jeff Connelly) +- Updated error and warning messages +- Updated man page + +lcov.spec: +- Updated of description and title information + +lcovrc: +- Added genhtml_function_hi_limit +- Added genhtml_function_med_limit +- Added genhtml_function_coverage +- Added genhtml_sort +- Updated man page + +Makefile: +- Updated info text + + +Version 1.6: +============ + +geninfo: +- Added libtool compatibility patch by thomas@apestaart.org (default is on) +- Added --compat-libtool option to enable libtool compatibility mode +- Added --no-compat-libtool option to disable libtool compatibility mode +- Changed default for line checksumming to off +- Added --checksum option to enable line checksumming +- Added --gcov-tool option +- Added --ignore-errors option +- Added --initial option to generate zero coverage from graph files +- Removed automatic test name modification on s390 +- Added --checksum option +- Updated man page + +lcov: +- Added libtool compatibility patch by thomas@apestaart.org +- Added --compat-libtool option to enable libtool compatibility mode +- Added --no-compat-libtool option to disable libtool compatibility mode +- Added --checksum option to enable line checksumming +- Added --gcov-tool option +- Added --ignore-errors option +- Added --initial option to generate zero coverage from graph files +- Updated help text +- Updated man page +- Fixed lcov not working when -k is specified more than once +- Fixed lcov not deleting .gcda files when specifying -z and -d + +lcovrc: +- Added geninfo_compat_libtool option +- Added geninfo_checksum option +- Removed geninfo_no_checksum option from example lcovrc +- Updated man page + +README: +- Added description of lcovrc file + + +Version 1.5: +============ + +genhtml: +- Added check for invalid characters in test names +- Added --legend option +- Added --html-prolog option +- Added --html-epilog option +- Added --html-extension option +- Added warning when specifying --no-prefix and --prefix +- Reworked help text to make it more readable + +geninfo: +- Renamed 'sles9' compatibility mode to 'hammer' compatibility mode +- Added support for mandrake gcc 3.3.2 +- Fixed bbg file reading in hammer compatibility mode +- Added check for invalid characters in test names +- Added --base-directory option + +lcov: +- Added check for invalid characters in test names +- Added --base-directory option + + +Version 1.4: +============ + +All: +- Added configuration file support + +genhtml: +- Fixed help text message +- Fixed handling of special characters in file- and directory names +- Added description of --css-file option to man page + +geninfo: +- Added support for GCOV file format as used by GCC 3.3.3 on SUSE SLES9 +- Fixed error text message +- Added check to abort processing if no source code file is available +- Added workaround for a problem where geninfo could not find source code + files for a C++ project +- Fixed 'branch'-statement parsing for GCC>=3.3 .gcov files +- Fixed exec count-statement parsing for GCC>=3.3 .gcov files +- Fixed .gcno-file parser (some lines were not counted as being instrumented) + +lcov: +- Modified path for temporary files from '.' to '/tmp' +- Fixed comments +- Removed unused function 'escape_shell' + +lcovrc: +- Introduced sample configuration file + +Makefile: +- Added rule to install configuration file +- Fixed installation path for man pages + + +Version 1.3: +============ + +All: +- Added compatibility for gcc-3.4 + +lcov: +- Modified --diff function to better cope with ambiguous entries in patch files +- Modified --capture option to use modprobe before insmod (needed for 2.6) +- Added --path option required for --diff function + + +Version 1.2: +============ + +All: +- Added compatibility for gcc-3.3 +- Adjusted LCOV-URL (http://ltp.sourceforge.net/coverage/lcov.php) +- Minor changes to whitespaces/line breaks/spelling +- Modified call mechanism so that parameters for external commands are not + parsed by the shell mechanism anymore (no more problems with special + characters in paths/filenames) +- Added checksumming mechanism: each tracefile now contains a checksum for + each instrumented line to detect incompatible data + +Makefile: +- Added rule to build source RPM +- Changed install path for executables (/usr/local/bin -> /usr/bin) + +lcov.spec: +- Modified to support building source rpms + +updateversion.pl: +- Modified to include update of release number in spec file + +genhtml: +- Fixed bug which would not correctly associate data sets with an empty + test name (only necessary when using --show-details in genhtml) +- Implemented new command line option '--nochecksum' to suppress generation + of checksums +- Implemented new command line option '--highlight' which highlights lines of + code which were only covered in converted tracefiles (see '--diff' option of + lcov) + +geninfo: +- Added workaround for a bug in gcov shipped with gcc-3.2 which aborts when + encountering empty .da files +- Fixed geninfo so that it does not abort after encountering empty .bb files +- Added function to collect branch coverage data +- Added check for gcov tool +- Added check for the '--preserve-paths' option of gcov; if available, this + will prevent losing .gcov files in some special cases (include files with + same name in different subdirectories) +- Implemented new command line option '--follow' to control whether or not + links should be followed while searching for .da files. +- Implemented new command line option '--nochecksum' to suppress generation + of checksums + +lcov: +- Fixed bug which would not correctly associate data sets with an empty + test name (only necessary when using --show-details in genhtml) +- Cleaned up internal command line option check +- Files are now processed in alphabetical order +- Added message when reading tracefiles +- Implemented new command line option '--nochecksum' to suppress generation + of checksums +- Implemented new command line option '--diff' which allows converting + coverage data from an older source code version by using a diff file + to map line numbers +- Implemented new command line option '--follow' to control whether or not + links should be followed while searching for .da files. + +genpng: +- Added support for the highlighting option of genhtml +- Corrected tab to spaces conversion +- Modified genpng to take number of spaces to use in place of tab as input + instead of replacement string + + +Version 1.1: +============ + +- Added CHANGES file +- Added Makefile implementing the following targets: + * install : install LCOV scripts and man pages + * uninstall : revert previous installation + * dist : create lcov.tar.gz file and lcov.rpm file + * clean : clean up example directory, remove .tar and .rpm files +- Added man pages for all scripts +- Added example program to demonstrate the use of LCOV with a userspace + application +- Implemented RPM build process +- New directory structure: + * bin : contains all executables + * example : contains a userspace example for LCOV + * man : contains man pages + * rpm : contains files required for the RPM build process +- LCOV-scripts are now in bin/ +- Removed .pl-extension from LCOV-script files +- Renamed readme.txt to README + +README: +- Adjusted mailing list address to ltp-coverage@lists.sourceforge.net +- Fixed incorrect parameter '--output-filename' in example LCOV call +- Removed tool descriptions and turned them into man pages +- Installation instructions now refer to RPM and tarball + +descriptions.tests: +- Fixed some spelling errors + +genhtml: +- Fixed bug which resulted in an error when trying to combine .info files + containing data without a test name +- Fixed bug which would not correctly handle data files in directories + with names containing some special characters ('+', etc.) +- Added check for empty tracefiles to prevent division-by-zeros +- Implemented new command line option --num-spaces / the number of spaces + which replace a tab in source code view is now user defined +- Fixed tab expansion so that in source code view, a tab doesn't produce a + fixed number of spaces, but as many spaces as are needed to advance to the + next tab position +- Output directory is now created if it doesn't exist +- Renamed "overview page" to "directory view page" +- HTML output pages are now titled "LCOV" instead of "GCOV" +- Information messages are now printed to STDERR instead of STDOUT + +geninfo: +- Fixed bug which would not allow .info files to be generated in directories + with names containing some special characters +- Information messages are now printed to STDERR instead of STDOUT + +lcov: +- Fixed bug which would cause lcov to fail when the tool is installed in + a path with a name containing some special characters +- Implemented new command line option '--add-tracefile' which allows the + combination of data from several tracefiles +- Implemented new command line option '--list' which lists the contents + of a tracefile +- Implemented new command line option '--extract' which allows extracting + data for a particular set of files from a tracefile +- Implemented new command line option '--remove' which allows removing + data for a particular set of files from a tracefile +- Renamed '--reset' to '--zerocounters' to avoid a naming ambiguity with + '--remove' +- Changed name of gcov kernel directory from /proc/gcov to a global constant + so that it may be changed easily when required in future versions +- Information messages are now printed to STDERR instead of STDOUT + + +Version 1.0 (2002-09-05): +========================= + +- Initial version + diff --git a/utils/lcov-1.11/CONTRIBUTING b/utils/lcov-1.11/CONTRIBUTING new file mode 100755 index 00000000..d0ba6f12 --- /dev/null +++ b/utils/lcov-1.11/CONTRIBUTING @@ -0,0 +1,96 @@ +Contributing to LCOV +==================== + +Please read this document if you would like to help improving the LTP GCOV +extension (LCOV). In general, all types of contributions are welcome, for +example: + + * Fixes for code or documentation + * Performance and compatibility improvements + * Functional enhancements + +There are some rules that these contributions must follow to be acceptable for +inclusion: + + 1. The contribution must align with the project goals of LCOV. + 2. The contribution must follow a particular format. + 3. The contribution must be signed. + +Once you have made sure that your contribution follows these rules, send it via +e-mail to the LTP coverage mailing list [1]. + + +Signing your work +================= + +All contributions to LCOV must be signed by putting the following line at the +end of the explanation of a patch: + + Signed-off-by: Your Name + +By signing a patch, you certify the following: + + By making a contribution to the LTP GCOV extension (LCOV) on + http://ltp.sourceforge.net, I certify that: + + a) The contribution was created by me and I have the right to submit it + under the terms and conditions of the open source license + "GNU General Public License, version 2 or later". + (http://www.gnu.org/licenses/old-licenses/gpl-2.0.html). + + b) The contribution is made free of any other party's intellectual property + claims or rights. + + c) I understand and agree that this project and the contribution are public + and that a record of the contribution (including all personal information + I submit with it, including my sign-off) is maintained indefinitely and + may be redistributed consistent with this project or the open source + license(s) involved. + + +Project goals +============= + +The goal of LCOV is to provide a set of command line tools that can be used to +collect, process and visualize code coverage data as produced by the gcov tool +that is part of the GNU Compiler Collection (GCC) [2]. + +If you have an idea for a contribution but are unsure if it aligns with the +project goals, feel free to discuss the idea on the LTP coverage mailing +list [1]. + + +Contribution format +=================== + +To contribute a change, please create a patch using the diff utility with the +following command line options: + + diff -Naurp + +Please base your changes on the most current version of LCOV. You can use the +following command line to obtain this version from the "utils" module of the +LTP CVS repository (when asked for a password, simply press return): + + cvs -d:pserver:anonymous@ltp.cvs.sourceforge.net:/cvsroot/ltp login + cvs -z3 -d:pserver:anonymous@ltp.cvs.sourceforge.net:/cvsroot/ltp co -P utils + +You can find LCOV in sub-directory "utils/analysis/lcov". + +Add a meaningful description of the contribution to the top of the patch. The +description should follow this format: + + component: short description + + detailed description + + Signed-off-by: Your Name + +With your Signed-off-by, you certify the rules stated in section +"Signing your work". + + +-- + +[1] ltp-coverage@lists.sourceforge.net +[2] http://gcc.gnu.org diff --git a/utils/lcov-1.11/COPYING b/utils/lcov-1.11/COPYING new file mode 100755 index 00000000..d511905c --- /dev/null +++ b/utils/lcov-1.11/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/utils/lcov-1.11/README b/utils/lcov-1.11/README new file mode 100755 index 00000000..b0f572d3 --- /dev/null +++ b/utils/lcov-1.11/README @@ -0,0 +1,140 @@ +------------------------------------------------- +- README file for the LTP GCOV extension (LCOV) - +- Last changes: 2014-05-23 - +------------------------------------------------- + +Description +----------- + LCOV is an extension of GCOV, a GNU tool which provides information about + what parts of a program are actually executed (i.e. "covered") while running + a particular test case. The extension consists of a set of Perl scripts + which build on the textual GCOV output to implement the following enhanced + functionality: + + * HTML based output: coverage rates are additionally indicated using bar + graphs and specific colors. + + * Support for large projects: overview pages allow quick browsing of + coverage data by providing three levels of detail: directory view, + file view and source code view. + + LCOV was initially designed to support Linux kernel coverage measurements, + but works as well for coverage measurements on standard user space + applications. + + +Further README contents +----------------------- + 1. Included files + 2. Installing LCOV + 3. An example of how to access kernel coverage data + 4. An example of how to access coverage data for a user space program + 5. Questions and Comments + + + +1. Important files +------------------ + README - This README file + CHANGES - List of changes between releases + bin/lcov - Tool for capturing LCOV coverage data + bin/genhtml - Tool for creating HTML output from LCOV data + bin/gendesc - Tool for creating description files as used by genhtml + bin/geninfo - Internal tool (creates LCOV data files) + bin/genpng - Internal tool (creates png overviews of source files) + bin/install.sh - Internal tool (takes care of un-/installing) + descriptions.tests - Test descriptions for the LTP suite, use with gendesc + man - Directory containing man pages for included tools + example - Directory containing an example to demonstrate LCOV + lcovrc - LCOV configuration file + Makefile - Makefile providing 'install' and 'uninstall' targets + + +2. Installing LCOV +------------------ +The LCOV package is available as either RPM or tarball from: + + http://ltp.sourceforge.net/coverage/lcov.php + +To install the tarball, unpack it to a directory and run: + + make install + +Use anonymous CVS for the most recent (but possibly unstable) version: + + cvs -d:pserver:anonymous@ltp.cvs.sourceforge.net:/cvsroot/ltp login + +(simply press the ENTER key when asked for a password) + + cvs -z3 -d:pserver:anonymous@ltp.cvs.sourceforge.net:/cvsroot/ltp export -D now utils + +Change to the utils/analysis/lcov directory and type: + + make install + + +3. An example of how to access kernel coverage data +--------------------------------------------------- +Requirements: get and install the gcov-kernel package from + + http://sourceforge.net/projects/ltp + +Copy the resulting gcov kernel module file to either the system wide modules +directory or the same directory as the Perl scripts. As root, do the following: + + a) Resetting counters + + lcov --zerocounters + + b) Capturing the current coverage state to a file + + lcov --capture --output-file kernel.info + + c) Getting HTML output + + genhtml kernel.info + +Point the web browser of your choice to the resulting index.html file. + + +4. An example of how to access coverage data for a user space program +--------------------------------------------------------------------- +Requirements: compile the program in question using GCC with the options +-fprofile-arcs and -ftest-coverage. During linking, make sure to specify +-lgcov or -coverage. + +Assuming the compile directory is called "appdir", do the following: + + a) Resetting counters + + lcov --directory appdir --zerocounters + + b) Capturing the current coverage state to a file + + lcov --directory appdir --capture --output-file app.info + + Note that this step only works after the application has + been started and stopped at least once. Otherwise lcov will + abort with an error mentioning that there are no data/.gcda files. + + c) Getting HTML output + + genhtml app.info + +Point the web browser of your choice to the resulting index.html file. + +Please note that independently of where the application is installed or +from which directory it is run, the --directory statement needs to +point to the directory in which the application was compiled. + +For further information on the gcc profiling mechanism, please also +consult the gcov man page. + + +5. Questions and comments +------------------------- +See the included man pages for more information on how to use the LCOV tools. + +Please email further questions or comments regarding this tool to the +LTP Mailing list at ltp-coverage@lists.sourceforge.net + diff --git a/utils/lcov-1.11/bin/gendesc b/utils/lcov-1.11/bin/gendesc new file mode 100755 index 00000000..2a7ad568 --- /dev/null +++ b/utils/lcov-1.11/bin/gendesc @@ -0,0 +1,226 @@ +#!/usr/bin/perl -w +# +# Copyright (c) International Business Machines Corp., 2002 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# gendesc +# +# This script creates a description file as understood by genhtml. +# Input file format: +# +# For each test case: +# +# +# +# Actual description may consist of several lines. By default, output is +# written to stdout. Test names consist of alphanumeric characters +# including _ and -. +# +# +# History: +# 2002-09-02: created by Peter Oberparleiter +# + +use strict; +use File::Basename; +use Getopt::Long; + + +# Constants +our $lcov_version = 'LCOV version 1.11'; +our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; +our $tool_name = basename($0); + + +# Prototypes +sub print_usage(*); +sub gen_desc(); +sub warn_handler($); +sub die_handler($); + + +# Global variables +our $help; +our $version; +our $output_filename; +our $input_filename; + + +# +# Code entry point +# + +$SIG{__WARN__} = \&warn_handler; +$SIG{__DIE__} = \&die_handler; + +# Prettify version string +$lcov_version =~ s/\$\s*Revision\s*:?\s*(\S+)\s*\$/$1/; + +# Parse command line options +if (!GetOptions("output-filename=s" => \$output_filename, + "version" =>\$version, + "help|?" => \$help + )) +{ + print(STDERR "Use $tool_name --help to get usage information\n"); + exit(1); +} + +$input_filename = $ARGV[0]; + +# Check for help option +if ($help) +{ + print_usage(*STDOUT); + exit(0); +} + +# Check for version option +if ($version) +{ + print("$tool_name: $lcov_version\n"); + exit(0); +} + + +# Check for input filename +if (!$input_filename) +{ + die("No input filename specified\n". + "Use $tool_name --help to get usage information\n"); +} + +# Do something +gen_desc(); + + +# +# print_usage(handle) +# +# Write out command line usage information to given filehandle. +# + +sub print_usage(*) +{ + local *HANDLE = $_[0]; + + print(HANDLE < +# TD: +# +# If defined, write output to OUTPUT_FILENAME, otherwise to stdout. +# +# Die on error. +# + +sub gen_desc() +{ + local *INPUT_HANDLE; + local *OUTPUT_HANDLE; + my $empty_line = "ignore"; + + open(INPUT_HANDLE, "<", $input_filename) + or die("ERROR: cannot open $input_filename!\n"); + + # Open output file for writing + if ($output_filename) + { + open(OUTPUT_HANDLE, ">", $output_filename) + or die("ERROR: cannot create $output_filename!\n"); + } + else + { + *OUTPUT_HANDLE = *STDOUT; + } + + # Process all lines in input file + while () + { + chomp($_); + + if (/^(\w[\w-]*)(\s*)$/) + { + # Matched test name + # Name starts with alphanum or _, continues with + # alphanum, _ or - + print(OUTPUT_HANDLE "TN: $1\n"); + $empty_line = "ignore"; + } + elsif (/^(\s+)(\S.*?)\s*$/) + { + # Matched test description + if ($empty_line eq "insert") + { + # Write preserved empty line + print(OUTPUT_HANDLE "TD: \n"); + } + print(OUTPUT_HANDLE "TD: $2\n"); + $empty_line = "observe"; + } + elsif (/^\s*$/) + { + # Matched empty line to preserve paragraph separation + # inside description text + if ($empty_line eq "observe") + { + $empty_line = "insert"; + } + } + } + + # Close output file if defined + if ($output_filename) + { + close(OUTPUT_HANDLE); + } + + close(INPUT_HANDLE); +} + +sub warn_handler($) +{ + my ($msg) = @_; + + warn("$tool_name: $msg"); +} + +sub die_handler($) +{ + my ($msg) = @_; + + die("$tool_name: $msg"); +} diff --git a/utils/lcov-1.11/bin/genhtml b/utils/lcov-1.11/bin/genhtml new file mode 100755 index 00000000..03ca57e1 --- /dev/null +++ b/utils/lcov-1.11/bin/genhtml @@ -0,0 +1,5989 @@ +#!/usr/bin/perl -w +# +# Copyright (c) International Business Machines Corp., 2002,2012 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# genhtml +# +# This script generates HTML output from .info files as created by the +# geninfo script. Call it with --help and refer to the genhtml man page +# to get information on usage and available options. +# +# +# History: +# 2002-08-23 created by Peter Oberparleiter +# IBM Lab Boeblingen +# based on code by Manoj Iyer and +# Megan Bock +# IBM Austin +# 2002-08-27 / Peter Oberparleiter: implemented frame view +# 2002-08-29 / Peter Oberparleiter: implemented test description filtering +# so that by default only descriptions for test cases which +# actually hit some source lines are kept +# 2002-09-05 / Peter Oberparleiter: implemented --no-sourceview +# 2002-09-05 / Mike Kobler: One of my source file paths includes a "+" in +# the directory name. I found that genhtml.pl died when it +# encountered it. I was able to fix the problem by modifying +# the string with the escape character before parsing it. +# 2002-10-26 / Peter Oberparleiter: implemented --num-spaces +# 2003-04-07 / Peter Oberparleiter: fixed bug which resulted in an error +# when trying to combine .info files containing data without +# a test name +# 2003-04-10 / Peter Oberparleiter: extended fix by Mike to also cover +# other special characters +# 2003-04-30 / Peter Oberparleiter: made info write to STDERR, not STDOUT +# 2003-07-10 / Peter Oberparleiter: added line checksum support +# 2004-08-09 / Peter Oberparleiter: added configuration file support +# 2005-03-04 / Cal Pierog: added legend to HTML output, fixed coloring of +# "good coverage" background +# 2006-03-18 / Marcus Boerger: added --custom-intro, --custom-outro and +# overwrite --no-prefix if --prefix is present +# 2006-03-20 / Peter Oberparleiter: changes to custom_* function (rename +# to html_prolog/_epilog, minor modifications to implementation), +# changed prefix/noprefix handling to be consistent with current +# logic +# 2006-03-20 / Peter Oberparleiter: added --html-extension option +# 2008-07-14 / Tom Zoerner: added --function-coverage command line option; +# added function table to source file page +# 2008-08-13 / Peter Oberparleiter: modified function coverage +# implementation (now enabled per default), +# introduced sorting option (enabled per default) +# + +use strict; +use File::Basename; +use File::Temp qw(tempfile); +use Getopt::Long; +use Digest::MD5 qw(md5_base64); + + +# Global constants +our $title = "LCOV - code coverage report"; +our $lcov_version = 'LCOV version 1.11'; +our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; +our $tool_name = basename($0); + +# Specify coverage rate limits (in %) for classifying file entries +# HI: $hi_limit <= rate <= 100 graph color: green +# MED: $med_limit <= rate < $hi_limit graph color: orange +# LO: 0 <= rate < $med_limit graph color: red + +# For line coverage/all coverage types if not specified +our $hi_limit = 90; +our $med_limit = 75; + +# For function coverage +our $fn_hi_limit; +our $fn_med_limit; + +# For branch coverage +our $br_hi_limit; +our $br_med_limit; + +# Width of overview image +our $overview_width = 80; + +# Resolution of overview navigation: this number specifies the maximum +# difference in lines between the position a user selected from the overview +# and the position the source code window is scrolled to. +our $nav_resolution = 4; + +# Clicking a line in the overview image should show the source code view at +# a position a bit further up so that the requested line is not the first +# line in the window. This number specifies that offset in lines. +our $nav_offset = 10; + +# Clicking on a function name should show the source code at a position a +# few lines before the first line of code of that function. This number +# specifies that offset in lines. +our $func_offset = 2; + +our $overview_title = "top level"; + +# Width for line coverage information in the source code view +our $line_field_width = 12; + +# Width for branch coverage information in the source code view +our $br_field_width = 16; + +# Internal Constants + +# Header types +our $HDR_DIR = 0; +our $HDR_FILE = 1; +our $HDR_SOURCE = 2; +our $HDR_TESTDESC = 3; +our $HDR_FUNC = 4; + +# Sort types +our $SORT_FILE = 0; +our $SORT_LINE = 1; +our $SORT_FUNC = 2; +our $SORT_BRANCH = 3; + +# Fileview heading types +our $HEAD_NO_DETAIL = 1; +our $HEAD_DETAIL_HIDDEN = 2; +our $HEAD_DETAIL_SHOWN = 3; + +# Offsets for storing branch coverage data in vectors +our $BR_BLOCK = 0; +our $BR_BRANCH = 1; +our $BR_TAKEN = 2; +our $BR_VEC_ENTRIES = 3; +our $BR_VEC_WIDTH = 32; +our $BR_VEC_MAX = vec(pack('b*', 1 x $BR_VEC_WIDTH), 0, $BR_VEC_WIDTH); + +# Additional offsets used when converting branch coverage data to HTML +our $BR_LEN = 3; +our $BR_OPEN = 4; +our $BR_CLOSE = 5; + +# Branch data combination types +our $BR_SUB = 0; +our $BR_ADD = 1; + +# Error classes which users may specify to ignore during processing +our $ERROR_SOURCE = 0; +our %ERROR_ID = ( + "source" => $ERROR_SOURCE, +); + +# Data related prototypes +sub print_usage(*); +sub gen_html(); +sub html_create($$); +sub process_dir($); +sub process_file($$$); +sub info(@); +sub read_info_file($); +sub get_info_entry($); +sub set_info_entry($$$$$$$$$;$$$$$$); +sub get_prefix($@); +sub shorten_prefix($); +sub get_dir_list(@); +sub get_relative_base_path($); +sub read_testfile($); +sub get_date_string(); +sub create_sub_dir($); +sub subtract_counts($$); +sub add_counts($$); +sub apply_baseline($$); +sub remove_unused_descriptions(); +sub get_found_and_hit($); +sub get_affecting_tests($$$); +sub combine_info_files($$); +sub merge_checksums($$$); +sub combine_info_entries($$$); +sub apply_prefix($$); +sub system_no_output($@); +sub read_config($); +sub apply_config($); +sub get_html_prolog($); +sub get_html_epilog($); +sub write_dir_page($$$$$$$$$$$$$$$$$); +sub classify_rate($$$$); +sub br_taken_add($$); +sub br_taken_sub($$); +sub br_ivec_len($); +sub br_ivec_get($$); +sub br_ivec_push($$$$); +sub combine_brcount($$$); +sub get_br_found_and_hit($); +sub warn_handler($); +sub die_handler($); +sub parse_ignore_errors(@); +sub rate($$;$$$); + + +# HTML related prototypes +sub escape_html($); +sub get_bar_graph_code($$$); + +sub write_png_files(); +sub write_htaccess_file(); +sub write_css_file(); +sub write_description_file($$$$$$$); +sub write_function_table(*$$$$$$$$$$); + +sub write_html(*$); +sub write_html_prolog(*$$); +sub write_html_epilog(*$;$); + +sub write_header(*$$$$$$$$$$); +sub write_header_prolog(*$); +sub write_header_line(*@); +sub write_header_epilog(*$); + +sub write_file_table(*$$$$$$$); +sub write_file_table_prolog(*$@); +sub write_file_table_entry(*$$$@); +sub write_file_table_detail_entry(*$@); +sub write_file_table_epilog(*); + +sub write_test_table_prolog(*$); +sub write_test_table_entry(*$$); +sub write_test_table_epilog(*); + +sub write_source($$$$$$$); +sub write_source_prolog(*); +sub write_source_line(*$$$$$$); +sub write_source_epilog(*); + +sub write_frameset(*$$$); +sub write_overview_line(*$$$); +sub write_overview(*$$$$); + +# External prototype (defined in genpng) +sub gen_png($$$@); + + +# Global variables & initialization +our %info_data; # Hash containing all data from .info file +our $dir_prefix; # Prefix to remove from all sub directories +our %test_description; # Hash containing test descriptions if available +our $date = get_date_string(); + +our @info_filenames; # List of .info files to use as data source +our $test_title; # Title for output as written to each page header +our $output_directory; # Name of directory in which to store output +our $base_filename; # Optional name of file containing baseline data +our $desc_filename; # Name of file containing test descriptions +our $css_filename; # Optional name of external stylesheet file to use +our $quiet; # If set, suppress information messages +our $help; # Help option flag +our $version; # Version option flag +our $show_details; # If set, generate detailed directory view +our $no_prefix; # If set, do not remove filename prefix +our $func_coverage; # If set, generate function coverage statistics +our $no_func_coverage; # Disable func_coverage +our $br_coverage; # If set, generate branch coverage statistics +our $no_br_coverage; # Disable br_coverage +our $sort = 1; # If set, provide directory listings with sorted entries +our $no_sort; # Disable sort +our $frames; # If set, use frames for source code view +our $keep_descriptions; # If set, do not remove unused test case descriptions +our $no_sourceview; # If set, do not create a source code view for each file +our $highlight; # If set, highlight lines covered by converted data only +our $legend; # If set, include legend in output +our $tab_size = 8; # Number of spaces to use in place of tab +our $config; # Configuration file contents +our $html_prolog_file; # Custom HTML prolog file (up to and including ) +our $html_epilog_file; # Custom HTML epilog file (from onwards) +our $html_prolog; # Actual HTML prolog +our $html_epilog; # Actual HTML epilog +our $html_ext = "html"; # Extension for generated HTML files +our $html_gzip = 0; # Compress with gzip +our $demangle_cpp = 0; # Demangle C++ function names +our @opt_ignore_errors; # Ignore certain error classes during processing +our @ignore; +our $opt_config_file; # User-specified configuration file location +our %opt_rc; +our $charset = "UTF-8"; # Default charset for HTML pages +our @fileview_sortlist; +our @fileview_sortname = ("", "-sort-l", "-sort-f", "-sort-b"); +our @funcview_sortlist; +our @rate_name = ("Lo", "Med", "Hi"); +our @rate_png = ("ruby.png", "amber.png", "emerald.png"); +our $lcov_func_coverage = 1; +our $lcov_branch_coverage = 0; +our $rc_desc_html = 0; # lcovrc: genhtml_desc_html + +our $cwd = `pwd`; # Current working directory +chomp($cwd); +our $tool_dir = dirname($0); # Directory where genhtml tool is installed + + +# +# Code entry point +# + +$SIG{__WARN__} = \&warn_handler; +$SIG{__DIE__} = \&die_handler; + +# Prettify version string +$lcov_version =~ s/\$\s*Revision\s*:?\s*(\S+)\s*\$/$1/; + +# Add current working directory if $tool_dir is not already an absolute path +if (! ($tool_dir =~ /^\/(.*)$/)) +{ + $tool_dir = "$cwd/$tool_dir"; +} + +# Check command line for a configuration file name +Getopt::Long::Configure("pass_through", "no_auto_abbrev"); +GetOptions("config-file=s" => \$opt_config_file, + "rc=s%" => \%opt_rc); +Getopt::Long::Configure("default"); + +# Read configuration file if available +if (defined($opt_config_file)) { + $config = read_config($opt_config_file); +} elsif (defined($ENV{"HOME"}) && (-r $ENV{"HOME"}."/.lcovrc")) +{ + $config = read_config($ENV{"HOME"}."/.lcovrc"); +} +elsif (-r "/etc/lcovrc") +{ + $config = read_config("/etc/lcovrc"); +} + +if ($config || %opt_rc) +{ + # Copy configuration file and --rc values to variables + apply_config({ + "genhtml_css_file" => \$css_filename, + "genhtml_hi_limit" => \$hi_limit, + "genhtml_med_limit" => \$med_limit, + "genhtml_line_field_width" => \$line_field_width, + "genhtml_overview_width" => \$overview_width, + "genhtml_nav_resolution" => \$nav_resolution, + "genhtml_nav_offset" => \$nav_offset, + "genhtml_keep_descriptions" => \$keep_descriptions, + "genhtml_no_prefix" => \$no_prefix, + "genhtml_no_source" => \$no_sourceview, + "genhtml_num_spaces" => \$tab_size, + "genhtml_highlight" => \$highlight, + "genhtml_legend" => \$legend, + "genhtml_html_prolog" => \$html_prolog_file, + "genhtml_html_epilog" => \$html_epilog_file, + "genhtml_html_extension" => \$html_ext, + "genhtml_html_gzip" => \$html_gzip, + "genhtml_function_hi_limit" => \$fn_hi_limit, + "genhtml_function_med_limit" => \$fn_med_limit, + "genhtml_function_coverage" => \$func_coverage, + "genhtml_branch_hi_limit" => \$br_hi_limit, + "genhtml_branch_med_limit" => \$br_med_limit, + "genhtml_branch_coverage" => \$br_coverage, + "genhtml_branch_field_width" => \$br_field_width, + "genhtml_sort" => \$sort, + "genhtml_charset" => \$charset, + "genhtml_desc_html" => \$rc_desc_html, + "lcov_function_coverage" => \$lcov_func_coverage, + "lcov_branch_coverage" => \$lcov_branch_coverage, + }); +} + +# Copy related values if not specified +$fn_hi_limit = $hi_limit if (!defined($fn_hi_limit)); +$fn_med_limit = $med_limit if (!defined($fn_med_limit)); +$br_hi_limit = $hi_limit if (!defined($br_hi_limit)); +$br_med_limit = $med_limit if (!defined($br_med_limit)); +$func_coverage = $lcov_func_coverage if (!defined($func_coverage)); +$br_coverage = $lcov_branch_coverage if (!defined($br_coverage)); + +# Parse command line options +if (!GetOptions("output-directory|o=s" => \$output_directory, + "title|t=s" => \$test_title, + "description-file|d=s" => \$desc_filename, + "keep-descriptions|k" => \$keep_descriptions, + "css-file|c=s" => \$css_filename, + "baseline-file|b=s" => \$base_filename, + "prefix|p=s" => \$dir_prefix, + "num-spaces=i" => \$tab_size, + "no-prefix" => \$no_prefix, + "no-sourceview" => \$no_sourceview, + "show-details|s" => \$show_details, + "frames|f" => \$frames, + "highlight" => \$highlight, + "legend" => \$legend, + "quiet|q" => \$quiet, + "help|h|?" => \$help, + "version|v" => \$version, + "html-prolog=s" => \$html_prolog_file, + "html-epilog=s" => \$html_epilog_file, + "html-extension=s" => \$html_ext, + "html-gzip" => \$html_gzip, + "function-coverage" => \$func_coverage, + "no-function-coverage" => \$no_func_coverage, + "branch-coverage" => \$br_coverage, + "no-branch-coverage" => \$no_br_coverage, + "sort" => \$sort, + "no-sort" => \$no_sort, + "demangle-cpp" => \$demangle_cpp, + "ignore-errors=s" => \@opt_ignore_errors, + "config-file=s" => \$opt_config_file, + "rc=s%" => \%opt_rc, + )) +{ + print(STDERR "Use $tool_name --help to get usage information\n"); + exit(1); +} else { + # Merge options + if ($no_func_coverage) { + $func_coverage = 0; + } + if ($no_br_coverage) { + $br_coverage = 0; + } + + # Merge sort options + if ($no_sort) { + $sort = 0; + } +} + +@info_filenames = @ARGV; + +# Check for help option +if ($help) +{ + print_usage(*STDOUT); + exit(0); +} + +# Check for version option +if ($version) +{ + print("$tool_name: $lcov_version\n"); + exit(0); +} + +# Determine which errors the user wants us to ignore +parse_ignore_errors(@opt_ignore_errors); + +# Check for info filename +if (!@info_filenames) +{ + die("No filename specified\n". + "Use $tool_name --help to get usage information\n"); +} + +# Generate a title if none is specified +if (!$test_title) +{ + if (scalar(@info_filenames) == 1) + { + # Only one filename specified, use it as title + $test_title = basename($info_filenames[0]); + } + else + { + # More than one filename specified, used default title + $test_title = "unnamed"; + } +} + +# Make sure css_filename is an absolute path (in case we're changing +# directories) +if ($css_filename) +{ + if (!($css_filename =~ /^\/(.*)$/)) + { + $css_filename = $cwd."/".$css_filename; + } +} + +# Make sure tab_size is within valid range +if ($tab_size < 1) +{ + print(STDERR "ERROR: invalid number of spaces specified: ". + "$tab_size!\n"); + exit(1); +} + +# Get HTML prolog and epilog +$html_prolog = get_html_prolog($html_prolog_file); +$html_epilog = get_html_epilog($html_epilog_file); + +# Issue a warning if --no-sourceview is enabled together with --frames +if ($no_sourceview && defined($frames)) +{ + warn("WARNING: option --frames disabled because --no-sourceview ". + "was specified!\n"); + $frames = undef; +} + +# Issue a warning if --no-prefix is enabled together with --prefix +if ($no_prefix && defined($dir_prefix)) +{ + warn("WARNING: option --prefix disabled because --no-prefix was ". + "specified!\n"); + $dir_prefix = undef; +} + +@fileview_sortlist = ($SORT_FILE); +@funcview_sortlist = ($SORT_FILE); + +if ($sort) { + push(@fileview_sortlist, $SORT_LINE); + push(@fileview_sortlist, $SORT_FUNC) if ($func_coverage); + push(@fileview_sortlist, $SORT_BRANCH) if ($br_coverage); + push(@funcview_sortlist, $SORT_LINE); +} + +if ($frames) +{ + # Include genpng code needed for overview image generation + do("$tool_dir/genpng"); +} + +# Ensure that the c++filt tool is available when using --demangle-cpp +if ($demangle_cpp) +{ + if (system_no_output(3, "c++filt", "--version")) { + die("ERROR: could not find c++filt tool needed for ". + "--demangle-cpp\n"); + } +} + +# Make sure output_directory exists, create it if necessary +if ($output_directory) +{ + stat($output_directory); + + if (! -e _) + { + create_sub_dir($output_directory); + } +} + +# Do something +gen_html(); + +exit(0); + + + +# +# print_usage(handle) +# +# Print usage information. +# + +sub print_usage(*) +{ + local *HANDLE = $_[0]; + + print(HANDLE <{$filename}; + my $funcdata = $data->{"func"}; + my $sumfnccount = $data->{"sumfnc"}; + + if (defined($funcdata)) { + foreach my $func_name (keys(%{$funcdata})) { + $fns{$func_name} = 1; + } + } + + if (defined($sumfnccount)) { + foreach my $func_name (keys(%{$sumfnccount})) { + $fns{$func_name} = 1; + } + } + } + + @result = keys(%fns); + + return \@result; +} + +# +# rename_functions(info, conv) +# +# Rename all function names in INFO according to CONV: OLD_NAME -> NEW_NAME. +# In case two functions demangle to the same name, assume that they are +# different object code implementations for the same source function. +# + +sub rename_functions($$) +{ + my ($info, $conv) = @_; + + foreach my $filename (keys(%{$info})) { + my $data = $info->{$filename}; + my $funcdata; + my $testfncdata; + my $sumfnccount; + my %newfuncdata; + my %newsumfnccount; + my $f_found; + my $f_hit; + + # funcdata: function name -> line number + $funcdata = $data->{"func"}; + foreach my $fn (keys(%{$funcdata})) { + my $cn = $conv->{$fn}; + + # Abort if two functions on different lines map to the + # same demangled name. + if (defined($newfuncdata{$cn}) && + $newfuncdata{$cn} != $funcdata->{$fn}) { + die("ERROR: Demangled function name $fn ". + " maps to different lines (". + $newfuncdata{$cn}." vs ". + $funcdata->{$fn}.")\n"); + } + $newfuncdata{$cn} = $funcdata->{$fn}; + } + $data->{"func"} = \%newfuncdata; + + # testfncdata: test name -> testfnccount + # testfnccount: function name -> execution count + $testfncdata = $data->{"testfnc"}; + foreach my $tn (keys(%{$testfncdata})) { + my $testfnccount = $testfncdata->{$tn}; + my %newtestfnccount; + + foreach my $fn (keys(%{$testfnccount})) { + my $cn = $conv->{$fn}; + + # Add counts for different functions that map + # to the same name. + $newtestfnccount{$cn} += + $testfnccount->{$fn}; + } + $testfncdata->{$tn} = \%newtestfnccount; + } + + # sumfnccount: function name -> execution count + $sumfnccount = $data->{"sumfnc"}; + foreach my $fn (keys(%{$sumfnccount})) { + my $cn = $conv->{$fn}; + + # Add counts for different functions that map + # to the same name. + $newsumfnccount{$cn} += $sumfnccount->{$fn}; + } + $data->{"sumfnc"} = \%newsumfnccount; + + # Update function found and hit counts since they may have + # changed + $f_found = 0; + $f_hit = 0; + foreach my $fn (keys(%newsumfnccount)) { + $f_found++; + $f_hit++ if ($newsumfnccount{$fn} > 0); + } + $data->{"f_found"} = $f_found; + $data->{"f_hit"} = $f_hit; + } +} + +# +# demangle_cpp(INFO) +# +# Demangle all function names found in INFO. +# +sub demangle_cpp($) +{ + my ($info) = @_; + my $fn_list = get_fn_list($info); + my @fn_list_demangled; + my $tmpfile; + my $handle; + my %demangled; + my $changed; + + # Nothing to do + return if (!@$fn_list); + + # Write list to temp file + (undef, $tmpfile) = tempfile(); + die("ERROR: could not create temporary file") if (!defined($tmpfile)); + open($handle, ">", $tmpfile) or + die("ERROR: could not write to $tmpfile: $!\n"); + print($handle join("\n", @$fn_list)); + close($handle); + + # Run c++ filt on tempfile file and parse output, creating a hash + open($handle, "-|", "c++filt < $tmpfile") or + die("ERROR: could not run c++filt: $!\n"); + @fn_list_demangled = <$handle>; + close($handle); + unlink($tmpfile) or + warn("WARNING: could not remove temporary file $tmpfile: $!\n"); + + if (scalar(@fn_list_demangled) != scalar(@$fn_list)) { + die("ERROR: c++filt output not as expected (". + scalar(@fn_list_demangled)." vs ". + scalar(@$fn_list).") lines\n"); + } + + # Build old_name -> new_name + $changed = 0; + for (my $i = 0; $i < scalar(@$fn_list); $i++) { + chomp($fn_list_demangled[$i]); + $demangled{$fn_list->[$i]} = $fn_list_demangled[$i]; + $changed++ if ($fn_list->[$i] ne $fn_list_demangled[$i]); + } + + info("Demangling $changed function names\n"); + + # Change all occurrences of function names in INFO + rename_functions($info, \%demangled); +} + +# +# gen_html() +# +# Generate a set of HTML pages from contents of .info file INFO_FILENAME. +# Files will be written to the current directory. If provided, test case +# descriptions will be read from .tests file TEST_FILENAME and included +# in ouput. +# +# Die on error. +# + +sub gen_html() +{ + local *HTML_HANDLE; + my %overview; + my %base_data; + my $lines_found; + my $lines_hit; + my $fn_found; + my $fn_hit; + my $br_found; + my $br_hit; + my $overall_found = 0; + my $overall_hit = 0; + my $total_fn_found = 0; + my $total_fn_hit = 0; + my $total_br_found = 0; + my $total_br_hit = 0; + my $dir_name; + my $link_name; + my @dir_list; + my %new_info; + + # Read in all specified .info files + foreach (@info_filenames) + { + %new_info = %{read_info_file($_)}; + + # Combine %new_info with %info_data + %info_data = %{combine_info_files(\%info_data, \%new_info)}; + } + + info("Found %d entries.\n", scalar(keys(%info_data))); + + # Read and apply baseline data if specified + if ($base_filename) + { + # Read baseline file + info("Reading baseline file $base_filename\n"); + %base_data = %{read_info_file($base_filename)}; + info("Found %d entries.\n", scalar(keys(%base_data))); + + # Apply baseline + info("Subtracting baseline data.\n"); + %info_data = %{apply_baseline(\%info_data, \%base_data)}; + } + + # Demangle C++ function names if requested + demangle_cpp(\%info_data) if ($demangle_cpp); + + @dir_list = get_dir_list(keys(%info_data)); + + if ($no_prefix) + { + # User requested that we leave filenames alone + info("User asked not to remove filename prefix\n"); + } + elsif (!defined($dir_prefix)) + { + # Get prefix common to most directories in list + $dir_prefix = get_prefix(1, keys(%info_data)); + + if ($dir_prefix) + { + info("Found common filename prefix \"$dir_prefix\"\n"); + } + else + { + info("No common filename prefix found!\n"); + $no_prefix=1; + } + } + else + { + info("Using user-specified filename prefix \"". + "$dir_prefix\"\n"); + $dir_prefix =~ s/\/+$//; + } + + # Read in test description file if specified + if ($desc_filename) + { + info("Reading test description file $desc_filename\n"); + %test_description = %{read_testfile($desc_filename)}; + + # Remove test descriptions which are not referenced + # from %info_data if user didn't tell us otherwise + if (!$keep_descriptions) + { + remove_unused_descriptions(); + } + } + + # Change to output directory if specified + if ($output_directory) + { + chdir($output_directory) + or die("ERROR: cannot change to directory ". + "$output_directory!\n"); + } + + info("Writing .css and .png files.\n"); + write_css_file(); + write_png_files(); + + if ($html_gzip) + { + info("Writing .htaccess file.\n"); + write_htaccess_file(); + } + + info("Generating output.\n"); + + # Process each subdirectory and collect overview information + foreach $dir_name (@dir_list) + { + ($lines_found, $lines_hit, $fn_found, $fn_hit, + $br_found, $br_hit) + = process_dir($dir_name); + + # Handle files in root directory gracefully + $dir_name = "root" if ($dir_name eq ""); + + # Remove prefix if applicable + if (!$no_prefix && $dir_prefix) + { + # Match directory names beginning with $dir_prefix + $dir_name = apply_prefix($dir_name, $dir_prefix); + } + + # Generate name for directory overview HTML page + if ($dir_name =~ /^\/(.*)$/) + { + $link_name = substr($dir_name, 1)."/index.$html_ext"; + } + else + { + $link_name = $dir_name."/index.$html_ext"; + } + + $overview{$dir_name} = [$lines_found, $lines_hit, $fn_found, + $fn_hit, $br_found, $br_hit, $link_name, + get_rate($lines_found, $lines_hit), + get_rate($fn_found, $fn_hit), + get_rate($br_found, $br_hit)]; + $overall_found += $lines_found; + $overall_hit += $lines_hit; + $total_fn_found += $fn_found; + $total_fn_hit += $fn_hit; + $total_br_found += $br_found; + $total_br_hit += $br_hit; + } + + # Generate overview page + info("Writing directory view page.\n"); + + # Create sorted pages + foreach (@fileview_sortlist) { + write_dir_page($fileview_sortname[$_], ".", "", $test_title, + undef, $overall_found, $overall_hit, + $total_fn_found, $total_fn_hit, $total_br_found, + $total_br_hit, \%overview, {}, {}, {}, 0, $_); + } + + # Check if there are any test case descriptions to write out + if (%test_description) + { + info("Writing test case description file.\n"); + write_description_file( \%test_description, + $overall_found, $overall_hit, + $total_fn_found, $total_fn_hit, + $total_br_found, $total_br_hit); + } + + print_overall_rate(1, $overall_found, $overall_hit, + $func_coverage, $total_fn_found, $total_fn_hit, + $br_coverage, $total_br_found, $total_br_hit); + + chdir($cwd); +} + +# +# html_create(handle, filename) +# + +sub html_create($$) +{ + my $handle = $_[0]; + my $filename = $_[1]; + + if ($html_gzip) + { + open($handle, "|-", "gzip -c >'$filename'") + or die("ERROR: cannot open $filename for writing ". + "(gzip)!\n"); + } + else + { + open($handle, ">", $filename) + or die("ERROR: cannot open $filename for writing!\n"); + } +} + +sub write_dir_page($$$$$$$$$$$$$$$$$) +{ + my ($name, $rel_dir, $base_dir, $title, $trunc_dir, $overall_found, + $overall_hit, $total_fn_found, $total_fn_hit, $total_br_found, + $total_br_hit, $overview, $testhash, $testfnchash, $testbrhash, + $view_type, $sort_type) = @_; + + # Generate directory overview page including details + html_create(*HTML_HANDLE, "$rel_dir/index$name.$html_ext"); + if (!defined($trunc_dir)) { + $trunc_dir = ""; + } + $title .= " - " if ($trunc_dir ne ""); + write_html_prolog(*HTML_HANDLE, $base_dir, "LCOV - $title$trunc_dir"); + write_header(*HTML_HANDLE, $view_type, $trunc_dir, $rel_dir, + $overall_found, $overall_hit, $total_fn_found, + $total_fn_hit, $total_br_found, $total_br_hit, $sort_type); + write_file_table(*HTML_HANDLE, $base_dir, $overview, $testhash, + $testfnchash, $testbrhash, $view_type, $sort_type); + write_html_epilog(*HTML_HANDLE, $base_dir); + close(*HTML_HANDLE); +} + + +# +# process_dir(dir_name) +# + +sub process_dir($) +{ + my $abs_dir = $_[0]; + my $trunc_dir; + my $rel_dir = $abs_dir; + my $base_dir; + my $filename; + my %overview; + my $lines_found; + my $lines_hit; + my $fn_found; + my $fn_hit; + my $br_found; + my $br_hit; + my $overall_found=0; + my $overall_hit=0; + my $total_fn_found=0; + my $total_fn_hit=0; + my $total_br_found = 0; + my $total_br_hit = 0; + my $base_name; + my $extension; + my $testdata; + my %testhash; + my $testfncdata; + my %testfnchash; + my $testbrdata; + my %testbrhash; + my @sort_list; + local *HTML_HANDLE; + + # Remove prefix if applicable + if (!$no_prefix) + { + # Match directory name beginning with $dir_prefix + $rel_dir = apply_prefix($rel_dir, $dir_prefix); + } + + $trunc_dir = $rel_dir; + + # Remove leading / + if ($rel_dir =~ /^\/(.*)$/) + { + $rel_dir = substr($rel_dir, 1); + } + + # Handle files in root directory gracefully + $rel_dir = "root" if ($rel_dir eq ""); + $trunc_dir = "root" if ($trunc_dir eq ""); + + $base_dir = get_relative_base_path($rel_dir); + + create_sub_dir($rel_dir); + + # Match filenames which specify files in this directory, not including + # sub-directories + foreach $filename (grep(/^\Q$abs_dir\E\/[^\/]*$/,keys(%info_data))) + { + my $page_link; + my $func_link; + + ($lines_found, $lines_hit, $fn_found, $fn_hit, $br_found, + $br_hit, $testdata, $testfncdata, $testbrdata) = + process_file($trunc_dir, $rel_dir, $filename); + + $base_name = basename($filename); + + if ($no_sourceview) { + $page_link = ""; + } elsif ($frames) { + # Link to frameset page + $page_link = "$base_name.gcov.frameset.$html_ext"; + } else { + # Link directory to source code view page + $page_link = "$base_name.gcov.$html_ext"; + } + $overview{$base_name} = [$lines_found, $lines_hit, $fn_found, + $fn_hit, $br_found, $br_hit, + $page_link, + get_rate($lines_found, $lines_hit), + get_rate($fn_found, $fn_hit), + get_rate($br_found, $br_hit)]; + + $testhash{$base_name} = $testdata; + $testfnchash{$base_name} = $testfncdata; + $testbrhash{$base_name} = $testbrdata; + + $overall_found += $lines_found; + $overall_hit += $lines_hit; + + $total_fn_found += $fn_found; + $total_fn_hit += $fn_hit; + + $total_br_found += $br_found; + $total_br_hit += $br_hit; + } + + # Create sorted pages + foreach (@fileview_sortlist) { + # Generate directory overview page (without details) + write_dir_page($fileview_sortname[$_], $rel_dir, $base_dir, + $test_title, $trunc_dir, $overall_found, + $overall_hit, $total_fn_found, $total_fn_hit, + $total_br_found, $total_br_hit, \%overview, {}, + {}, {}, 1, $_); + if (!$show_details) { + next; + } + # Generate directory overview page including details + write_dir_page("-detail".$fileview_sortname[$_], $rel_dir, + $base_dir, $test_title, $trunc_dir, + $overall_found, $overall_hit, $total_fn_found, + $total_fn_hit, $total_br_found, $total_br_hit, + \%overview, \%testhash, \%testfnchash, + \%testbrhash, 1, $_); + } + + # Calculate resulting line counts + return ($overall_found, $overall_hit, $total_fn_found, $total_fn_hit, + $total_br_found, $total_br_hit); +} + + +# +# get_converted_lines(testdata) +# +# Return hash of line numbers of those lines which were only covered in +# converted data sets. +# + +sub get_converted_lines($) +{ + my $testdata = $_[0]; + my $testcount; + my %converted; + my %nonconverted; + my $hash; + my $testcase; + my $line; + my %result; + + + # Get a hash containing line numbers with positive counts both for + # converted and original data sets + foreach $testcase (keys(%{$testdata})) + { + # Check to see if this is a converted data set + if ($testcase =~ /,diff$/) + { + $hash = \%converted; + } + else + { + $hash = \%nonconverted; + } + + $testcount = $testdata->{$testcase}; + # Add lines with a positive count to hash + foreach $line (keys%{$testcount}) + { + if ($testcount->{$line} > 0) + { + $hash->{$line} = 1; + } + } + } + + # Combine both hashes to resulting list + foreach $line (keys(%converted)) + { + if (!defined($nonconverted{$line})) + { + $result{$line} = 1; + } + } + + return \%result; +} + + +sub write_function_page($$$$$$$$$$$$$$$$$$) +{ + my ($base_dir, $rel_dir, $trunc_dir, $base_name, $title, + $lines_found, $lines_hit, $fn_found, $fn_hit, $br_found, $br_hit, + $sumcount, $funcdata, $sumfnccount, $testfncdata, $sumbrcount, + $testbrdata, $sort_type) = @_; + my $pagetitle; + my $filename; + + # Generate function table for this file + if ($sort_type == 0) { + $filename = "$rel_dir/$base_name.func.$html_ext"; + } else { + $filename = "$rel_dir/$base_name.func-sort-c.$html_ext"; + } + html_create(*HTML_HANDLE, $filename); + $pagetitle = "LCOV - $title - $trunc_dir/$base_name - functions"; + write_html_prolog(*HTML_HANDLE, $base_dir, $pagetitle); + write_header(*HTML_HANDLE, 4, "$trunc_dir/$base_name", + "$rel_dir/$base_name", $lines_found, $lines_hit, + $fn_found, $fn_hit, $br_found, $br_hit, $sort_type); + write_function_table(*HTML_HANDLE, "$base_name.gcov.$html_ext", + $sumcount, $funcdata, + $sumfnccount, $testfncdata, $sumbrcount, + $testbrdata, $base_name, + $base_dir, $sort_type); + write_html_epilog(*HTML_HANDLE, $base_dir, 1); + close(*HTML_HANDLE); +} + + +# +# process_file(trunc_dir, rel_dir, filename) +# + +sub process_file($$$) +{ + info("Processing file ".apply_prefix($_[2], $dir_prefix)."\n"); + + my $trunc_dir = $_[0]; + my $rel_dir = $_[1]; + my $filename = $_[2]; + my $base_name = basename($filename); + my $base_dir = get_relative_base_path($rel_dir); + my $testdata; + my $testcount; + my $sumcount; + my $funcdata; + my $checkdata; + my $testfncdata; + my $sumfnccount; + my $testbrdata; + my $sumbrcount; + my $lines_found; + my $lines_hit; + my $fn_found; + my $fn_hit; + my $br_found; + my $br_hit; + my $converted; + my @source; + my $pagetitle; + local *HTML_HANDLE; + + ($testdata, $sumcount, $funcdata, $checkdata, $testfncdata, + $sumfnccount, $testbrdata, $sumbrcount, $lines_found, $lines_hit, + $fn_found, $fn_hit, $br_found, $br_hit) + = get_info_entry($info_data{$filename}); + + # Return after this point in case user asked us not to generate + # source code view + if ($no_sourceview) + { + return ($lines_found, $lines_hit, $fn_found, $fn_hit, + $br_found, $br_hit, $testdata, $testfncdata, + $testbrdata); + } + + $converted = get_converted_lines($testdata); + # Generate source code view for this file + html_create(*HTML_HANDLE, "$rel_dir/$base_name.gcov.$html_ext"); + $pagetitle = "LCOV - $test_title - $trunc_dir/$base_name"; + write_html_prolog(*HTML_HANDLE, $base_dir, $pagetitle); + write_header(*HTML_HANDLE, 2, "$trunc_dir/$base_name", + "$rel_dir/$base_name", $lines_found, $lines_hit, + $fn_found, $fn_hit, $br_found, $br_hit, 0); + @source = write_source(*HTML_HANDLE, $filename, $sumcount, $checkdata, + $converted, $funcdata, $sumbrcount); + + write_html_epilog(*HTML_HANDLE, $base_dir, 1); + close(*HTML_HANDLE); + + if ($func_coverage) { + # Create function tables + foreach (@funcview_sortlist) { + write_function_page($base_dir, $rel_dir, $trunc_dir, + $base_name, $test_title, + $lines_found, $lines_hit, + $fn_found, $fn_hit, $br_found, + $br_hit, $sumcount, + $funcdata, $sumfnccount, + $testfncdata, $sumbrcount, + $testbrdata, $_); + } + } + + # Additional files are needed in case of frame output + if (!$frames) + { + return ($lines_found, $lines_hit, $fn_found, $fn_hit, + $br_found, $br_hit, $testdata, $testfncdata, + $testbrdata); + } + + # Create overview png file + gen_png("$rel_dir/$base_name.gcov.png", $overview_width, $tab_size, + @source); + + # Create frameset page + html_create(*HTML_HANDLE, + "$rel_dir/$base_name.gcov.frameset.$html_ext"); + write_frameset(*HTML_HANDLE, $base_dir, $base_name, $pagetitle); + close(*HTML_HANDLE); + + # Write overview frame + html_create(*HTML_HANDLE, + "$rel_dir/$base_name.gcov.overview.$html_ext"); + write_overview(*HTML_HANDLE, $base_dir, $base_name, $pagetitle, + scalar(@source)); + close(*HTML_HANDLE); + + return ($lines_found, $lines_hit, $fn_found, $fn_hit, $br_found, + $br_hit, $testdata, $testfncdata, $testbrdata); +} + + +# +# read_info_file(info_filename) +# +# Read in the contents of the .info file specified by INFO_FILENAME. Data will +# be returned as a reference to a hash containing the following mappings: +# +# %result: for each filename found in file -> \%data +# +# %data: "test" -> \%testdata +# "sum" -> \%sumcount +# "func" -> \%funcdata +# "found" -> $lines_found (number of instrumented lines found in file) +# "hit" -> $lines_hit (number of executed lines in file) +# "f_found" -> $fn_found (number of instrumented functions found in file) +# "f_hit" -> $fn_hit (number of executed functions in file) +# "b_found" -> $br_found (number of instrumented branches found in file) +# "b_hit" -> $br_hit (number of executed branches in file) +# "check" -> \%checkdata +# "testfnc" -> \%testfncdata +# "sumfnc" -> \%sumfnccount +# "testbr" -> \%testbrdata +# "sumbr" -> \%sumbrcount +# +# %testdata : name of test affecting this file -> \%testcount +# %testfncdata: name of test affecting this file -> \%testfnccount +# %testbrdata: name of test affecting this file -> \%testbrcount +# +# %testcount : line number -> execution count for a single test +# %testfnccount: function name -> execution count for a single test +# %testbrcount : line number -> branch coverage data for a single test +# %sumcount : line number -> execution count for all tests +# %sumfnccount : function name -> execution count for all tests +# %sumbrcount : line number -> branch coverage data for all tests +# %funcdata : function name -> line number +# %checkdata : line number -> checksum of source code line +# $brdata : vector of items: block, branch, taken +# +# Note that .info file sections referring to the same file and test name +# will automatically be combined by adding all execution counts. +# +# Note that if INFO_FILENAME ends with ".gz", it is assumed that the file +# is compressed using GZIP. If available, GUNZIP will be used to decompress +# this file. +# +# Die on error. +# + +sub read_info_file($) +{ + my $tracefile = $_[0]; # Name of tracefile + my %result; # Resulting hash: file -> data + my $data; # Data handle for current entry + my $testdata; # " " + my $testcount; # " " + my $sumcount; # " " + my $funcdata; # " " + my $checkdata; # " " + my $testfncdata; + my $testfnccount; + my $sumfnccount; + my $testbrdata; + my $testbrcount; + my $sumbrcount; + my $line; # Current line read from .info file + my $testname; # Current test name + my $filename; # Current filename + my $hitcount; # Count for lines hit + my $count; # Execution count of current line + my $negative; # If set, warn about negative counts + my $changed_testname; # If set, warn about changed testname + my $line_checksum; # Checksum of current line + my $br_found; + my $br_hit; + local *INFO_HANDLE; # Filehandle for .info file + + info("Reading data file $tracefile\n"); + + # Check if file exists and is readable + stat($_[0]); + if (!(-r _)) + { + die("ERROR: cannot read file $_[0]!\n"); + } + + # Check if this is really a plain file + if (!(-f _)) + { + die("ERROR: not a plain file: $_[0]!\n"); + } + + # Check for .gz extension + if ($_[0] =~ /\.gz$/) + { + # Check for availability of GZIP tool + system_no_output(1, "gunzip" ,"-h") + and die("ERROR: gunzip command not available!\n"); + + # Check integrity of compressed file + system_no_output(1, "gunzip", "-t", $_[0]) + and die("ERROR: integrity check failed for ". + "compressed file $_[0]!\n"); + + # Open compressed file + open(INFO_HANDLE, "-|", "gunzip -c '$_[0]'") + or die("ERROR: cannot start gunzip to decompress ". + "file $_[0]!\n"); + } + else + { + # Open decompressed file + open(INFO_HANDLE, "<", $_[0]) + or die("ERROR: cannot read file $_[0]!\n"); + } + + $testname = ""; + while () + { + chomp($_); + $line = $_; + + # Switch statement + foreach ($line) + { + /^TN:([^,]*)(,diff)?/ && do + { + # Test name information found + $testname = defined($1) ? $1 : ""; + if ($testname =~ s/\W/_/g) + { + $changed_testname = 1; + } + $testname .= $2 if (defined($2)); + last; + }; + + /^[SK]F:(.*)/ && do + { + # Filename information found + # Retrieve data for new entry + $filename = $1; + + $data = $result{$filename}; + ($testdata, $sumcount, $funcdata, $checkdata, + $testfncdata, $sumfnccount, $testbrdata, + $sumbrcount) = + get_info_entry($data); + + if (defined($testname)) + { + $testcount = $testdata->{$testname}; + $testfnccount = $testfncdata->{$testname}; + $testbrcount = $testbrdata->{$testname}; + } + else + { + $testcount = {}; + $testfnccount = {}; + $testbrcount = {}; + } + last; + }; + + /^DA:(\d+),(-?\d+)(,[^,\s]+)?/ && do + { + # Fix negative counts + $count = $2 < 0 ? 0 : $2; + if ($2 < 0) + { + $negative = 1; + } + # Execution count found, add to structure + # Add summary counts + $sumcount->{$1} += $count; + + # Add test-specific counts + if (defined($testname)) + { + $testcount->{$1} += $count; + } + + # Store line checksum if available + if (defined($3)) + { + $line_checksum = substr($3, 1); + + # Does it match a previous definition + if (defined($checkdata->{$1}) && + ($checkdata->{$1} ne + $line_checksum)) + { + die("ERROR: checksum mismatch ". + "at $filename:$1\n"); + } + + $checkdata->{$1} = $line_checksum; + } + last; + }; + + /^FN:(\d+),([^,]+)/ && do + { + last if (!$func_coverage); + + # Function data found, add to structure + $funcdata->{$2} = $1; + + # Also initialize function call data + if (!defined($sumfnccount->{$2})) { + $sumfnccount->{$2} = 0; + } + if (defined($testname)) + { + if (!defined($testfnccount->{$2})) { + $testfnccount->{$2} = 0; + } + } + last; + }; + + /^FNDA:(\d+),([^,]+)/ && do + { + last if (!$func_coverage); + # Function call count found, add to structure + # Add summary counts + $sumfnccount->{$2} += $1; + + # Add test-specific counts + if (defined($testname)) + { + $testfnccount->{$2} += $1; + } + last; + }; + + /^BRDA:(\d+),(\d+),(\d+),(\d+|-)/ && do { + # Branch coverage data found + my ($line, $block, $branch, $taken) = + ($1, $2, $3, $4); + + last if (!$br_coverage); + $sumbrcount->{$line} = + br_ivec_push($sumbrcount->{$line}, + $block, $branch, $taken); + + # Add test-specific counts + if (defined($testname)) { + $testbrcount->{$line} = + br_ivec_push( + $testbrcount->{$line}, + $block, $branch, + $taken); + } + last; + }; + + /^end_of_record/ && do + { + # Found end of section marker + if ($filename) + { + # Store current section data + if (defined($testname)) + { + $testdata->{$testname} = + $testcount; + $testfncdata->{$testname} = + $testfnccount; + $testbrdata->{$testname} = + $testbrcount; + } + + set_info_entry($data, $testdata, + $sumcount, $funcdata, + $checkdata, $testfncdata, + $sumfnccount, + $testbrdata, + $sumbrcount); + $result{$filename} = $data; + last; + } + }; + + # default + last; + } + } + close(INFO_HANDLE); + + # Calculate lines_found and lines_hit for each file + foreach $filename (keys(%result)) + { + $data = $result{$filename}; + + ($testdata, $sumcount, undef, undef, $testfncdata, + $sumfnccount, $testbrdata, $sumbrcount) = + get_info_entry($data); + + # Filter out empty files + if (scalar(keys(%{$sumcount})) == 0) + { + delete($result{$filename}); + next; + } + # Filter out empty test cases + foreach $testname (keys(%{$testdata})) + { + if (!defined($testdata->{$testname}) || + scalar(keys(%{$testdata->{$testname}})) == 0) + { + delete($testdata->{$testname}); + delete($testfncdata->{$testname}); + } + } + + $data->{"found"} = scalar(keys(%{$sumcount})); + $hitcount = 0; + + foreach (keys(%{$sumcount})) + { + if ($sumcount->{$_} > 0) { $hitcount++; } + } + + $data->{"hit"} = $hitcount; + + # Get found/hit values for function call data + $data->{"f_found"} = scalar(keys(%{$sumfnccount})); + $hitcount = 0; + + foreach (keys(%{$sumfnccount})) { + if ($sumfnccount->{$_} > 0) { + $hitcount++; + } + } + $data->{"f_hit"} = $hitcount; + + # Get found/hit values for branch data + ($br_found, $br_hit) = get_br_found_and_hit($sumbrcount); + + $data->{"b_found"} = $br_found; + $data->{"b_hit"} = $br_hit; + } + + if (scalar(keys(%result)) == 0) + { + die("ERROR: no valid records found in tracefile $tracefile\n"); + } + if ($negative) + { + warn("WARNING: negative counts found in tracefile ". + "$tracefile\n"); + } + if ($changed_testname) + { + warn("WARNING: invalid characters removed from testname in ". + "tracefile $tracefile\n"); + } + + return(\%result); +} + + +# +# get_info_entry(hash_ref) +# +# Retrieve data from an entry of the structure generated by read_info_file(). +# Return a list of references to hashes: +# (test data hash ref, sum count hash ref, funcdata hash ref, checkdata hash +# ref, testfncdata hash ref, sumfnccount hash ref, lines found, lines hit, +# functions found, functions hit) +# + +sub get_info_entry($) +{ + my $testdata_ref = $_[0]->{"test"}; + my $sumcount_ref = $_[0]->{"sum"}; + my $funcdata_ref = $_[0]->{"func"}; + my $checkdata_ref = $_[0]->{"check"}; + my $testfncdata = $_[0]->{"testfnc"}; + my $sumfnccount = $_[0]->{"sumfnc"}; + my $testbrdata = $_[0]->{"testbr"}; + my $sumbrcount = $_[0]->{"sumbr"}; + my $lines_found = $_[0]->{"found"}; + my $lines_hit = $_[0]->{"hit"}; + my $fn_found = $_[0]->{"f_found"}; + my $fn_hit = $_[0]->{"f_hit"}; + my $br_found = $_[0]->{"b_found"}; + my $br_hit = $_[0]->{"b_hit"}; + + return ($testdata_ref, $sumcount_ref, $funcdata_ref, $checkdata_ref, + $testfncdata, $sumfnccount, $testbrdata, $sumbrcount, + $lines_found, $lines_hit, $fn_found, $fn_hit, + $br_found, $br_hit); +} + + +# +# set_info_entry(hash_ref, testdata_ref, sumcount_ref, funcdata_ref, +# checkdata_ref, testfncdata_ref, sumfcncount_ref, +# testbrdata_ref, sumbrcount_ref[,lines_found, +# lines_hit, f_found, f_hit, $b_found, $b_hit]) +# +# Update the hash referenced by HASH_REF with the provided data references. +# + +sub set_info_entry($$$$$$$$$;$$$$$$) +{ + my $data_ref = $_[0]; + + $data_ref->{"test"} = $_[1]; + $data_ref->{"sum"} = $_[2]; + $data_ref->{"func"} = $_[3]; + $data_ref->{"check"} = $_[4]; + $data_ref->{"testfnc"} = $_[5]; + $data_ref->{"sumfnc"} = $_[6]; + $data_ref->{"testbr"} = $_[7]; + $data_ref->{"sumbr"} = $_[8]; + + if (defined($_[9])) { $data_ref->{"found"} = $_[9]; } + if (defined($_[10])) { $data_ref->{"hit"} = $_[10]; } + if (defined($_[11])) { $data_ref->{"f_found"} = $_[11]; } + if (defined($_[12])) { $data_ref->{"f_hit"} = $_[12]; } + if (defined($_[13])) { $data_ref->{"b_found"} = $_[13]; } + if (defined($_[14])) { $data_ref->{"b_hit"} = $_[14]; } +} + + +# +# add_counts(data1_ref, data2_ref) +# +# DATA1_REF and DATA2_REF are references to hashes containing a mapping +# +# line number -> execution count +# +# Return a list (RESULT_REF, LINES_FOUND, LINES_HIT) where RESULT_REF +# is a reference to a hash containing the combined mapping in which +# execution counts are added. +# + +sub add_counts($$) +{ + my $data1_ref = $_[0]; # Hash 1 + my $data2_ref = $_[1]; # Hash 2 + my %result; # Resulting hash + my $line; # Current line iteration scalar + my $data1_count; # Count of line in hash1 + my $data2_count; # Count of line in hash2 + my $found = 0; # Total number of lines found + my $hit = 0; # Number of lines with a count > 0 + + foreach $line (keys(%$data1_ref)) + { + $data1_count = $data1_ref->{$line}; + $data2_count = $data2_ref->{$line}; + + # Add counts if present in both hashes + if (defined($data2_count)) { $data1_count += $data2_count; } + + # Store sum in %result + $result{$line} = $data1_count; + + $found++; + if ($data1_count > 0) { $hit++; } + } + + # Add lines unique to data2_ref + foreach $line (keys(%$data2_ref)) + { + # Skip lines already in data1_ref + if (defined($data1_ref->{$line})) { next; } + + # Copy count from data2_ref + $result{$line} = $data2_ref->{$line}; + + $found++; + if ($result{$line} > 0) { $hit++; } + } + + return (\%result, $found, $hit); +} + + +# +# merge_checksums(ref1, ref2, filename) +# +# REF1 and REF2 are references to hashes containing a mapping +# +# line number -> checksum +# +# Merge checksum lists defined in REF1 and REF2 and return reference to +# resulting hash. Die if a checksum for a line is defined in both hashes +# but does not match. +# + +sub merge_checksums($$$) +{ + my $ref1 = $_[0]; + my $ref2 = $_[1]; + my $filename = $_[2]; + my %result; + my $line; + + foreach $line (keys(%{$ref1})) + { + if (defined($ref2->{$line}) && + ($ref1->{$line} ne $ref2->{$line})) + { + die("ERROR: checksum mismatch at $filename:$line\n"); + } + $result{$line} = $ref1->{$line}; + } + + foreach $line (keys(%{$ref2})) + { + $result{$line} = $ref2->{$line}; + } + + return \%result; +} + + +# +# merge_func_data(funcdata1, funcdata2, filename) +# + +sub merge_func_data($$$) +{ + my ($funcdata1, $funcdata2, $filename) = @_; + my %result; + my $func; + + if (defined($funcdata1)) { + %result = %{$funcdata1}; + } + + foreach $func (keys(%{$funcdata2})) { + my $line1 = $result{$func}; + my $line2 = $funcdata2->{$func}; + + if (defined($line1) && ($line1 != $line2)) { + warn("WARNING: function data mismatch at ". + "$filename:$line2\n"); + next; + } + $result{$func} = $line2; + } + + return \%result; +} + + +# +# add_fnccount(fnccount1, fnccount2) +# +# Add function call count data. Return list (fnccount_added, f_found, f_hit) +# + +sub add_fnccount($$) +{ + my ($fnccount1, $fnccount2) = @_; + my %result; + my $fn_found; + my $fn_hit; + my $function; + + if (defined($fnccount1)) { + %result = %{$fnccount1}; + } + foreach $function (keys(%{$fnccount2})) { + $result{$function} += $fnccount2->{$function}; + } + $fn_found = scalar(keys(%result)); + $fn_hit = 0; + foreach $function (keys(%result)) { + if ($result{$function} > 0) { + $fn_hit++; + } + } + + return (\%result, $fn_found, $fn_hit); +} + +# +# add_testfncdata(testfncdata1, testfncdata2) +# +# Add function call count data for several tests. Return reference to +# added_testfncdata. +# + +sub add_testfncdata($$) +{ + my ($testfncdata1, $testfncdata2) = @_; + my %result; + my $testname; + + foreach $testname (keys(%{$testfncdata1})) { + if (defined($testfncdata2->{$testname})) { + my $fnccount; + + # Function call count data for this testname exists + # in both data sets: add + ($fnccount) = add_fnccount( + $testfncdata1->{$testname}, + $testfncdata2->{$testname}); + $result{$testname} = $fnccount; + next; + } + # Function call count data for this testname is unique to + # data set 1: copy + $result{$testname} = $testfncdata1->{$testname}; + } + + # Add count data for testnames unique to data set 2 + foreach $testname (keys(%{$testfncdata2})) { + if (!defined($result{$testname})) { + $result{$testname} = $testfncdata2->{$testname}; + } + } + return \%result; +} + + +# +# brcount_to_db(brcount) +# +# Convert brcount data to the following format: +# +# db: line number -> block hash +# block hash: block number -> branch hash +# branch hash: branch number -> taken value +# + +sub brcount_to_db($) +{ + my ($brcount) = @_; + my $line; + my $db; + + # Add branches from first count to database + foreach $line (keys(%{$brcount})) { + my $brdata = $brcount->{$line}; + my $i; + my $num = br_ivec_len($brdata); + + for ($i = 0; $i < $num; $i++) { + my ($block, $branch, $taken) = br_ivec_get($brdata, $i); + + $db->{$line}->{$block}->{$branch} = $taken; + } + } + + return $db; +} + + +# +# db_to_brcount(db) +# +# Convert branch coverage data back to brcount format. +# + +sub db_to_brcount($) +{ + my ($db) = @_; + my $line; + my $brcount = {}; + my $br_found = 0; + my $br_hit = 0; + + # Convert database back to brcount format + foreach $line (sort({$a <=> $b} keys(%{$db}))) { + my $ldata = $db->{$line}; + my $brdata; + my $block; + + foreach $block (sort({$a <=> $b} keys(%{$ldata}))) { + my $bdata = $ldata->{$block}; + my $branch; + + foreach $branch (sort({$a <=> $b} keys(%{$bdata}))) { + my $taken = $bdata->{$branch}; + + $br_found++; + $br_hit++ if ($taken ne "-" && $taken > 0); + $brdata = br_ivec_push($brdata, $block, + $branch, $taken); + } + } + $brcount->{$line} = $brdata; + } + + return ($brcount, $br_found, $br_hit); +} + + +# +# combine_brcount(brcount1, brcount2, type) +# +# If add is BR_ADD, add branch coverage data and return list (brcount_added, +# br_found, br_hit). If add is BR_SUB, subtract the taken values of brcount2 +# from brcount1 and return (brcount_sub, br_found, br_hit). +# + +sub combine_brcount($$$) +{ + my ($brcount1, $brcount2, $type) = @_; + my $line; + my $block; + my $branch; + my $taken; + my $db; + my $br_found = 0; + my $br_hit = 0; + my $result; + + # Convert branches from first count to database + $db = brcount_to_db($brcount1); + # Combine values from database and second count + foreach $line (keys(%{$brcount2})) { + my $brdata = $brcount2->{$line}; + my $num = br_ivec_len($brdata); + my $i; + + for ($i = 0; $i < $num; $i++) { + ($block, $branch, $taken) = br_ivec_get($brdata, $i); + my $new_taken = $db->{$line}->{$block}->{$branch}; + + if ($type == $BR_ADD) { + $new_taken = br_taken_add($new_taken, $taken); + } elsif ($type == $BR_SUB) { + $new_taken = br_taken_sub($new_taken, $taken); + } + $db->{$line}->{$block}->{$branch} = $new_taken + if (defined($new_taken)); + } + } + # Convert database back to brcount format + ($result, $br_found, $br_hit) = db_to_brcount($db); + + return ($result, $br_found, $br_hit); +} + + +# +# add_testbrdata(testbrdata1, testbrdata2) +# +# Add branch coverage data for several tests. Return reference to +# added_testbrdata. +# + +sub add_testbrdata($$) +{ + my ($testbrdata1, $testbrdata2) = @_; + my %result; + my $testname; + + foreach $testname (keys(%{$testbrdata1})) { + if (defined($testbrdata2->{$testname})) { + my $brcount; + + # Branch coverage data for this testname exists + # in both data sets: add + ($brcount) = combine_brcount($testbrdata1->{$testname}, + $testbrdata2->{$testname}, $BR_ADD); + $result{$testname} = $brcount; + next; + } + # Branch coverage data for this testname is unique to + # data set 1: copy + $result{$testname} = $testbrdata1->{$testname}; + } + + # Add count data for testnames unique to data set 2 + foreach $testname (keys(%{$testbrdata2})) { + if (!defined($result{$testname})) { + $result{$testname} = $testbrdata2->{$testname}; + } + } + return \%result; +} + + +# +# combine_info_entries(entry_ref1, entry_ref2, filename) +# +# Combine .info data entry hashes referenced by ENTRY_REF1 and ENTRY_REF2. +# Return reference to resulting hash. +# + +sub combine_info_entries($$$) +{ + my $entry1 = $_[0]; # Reference to hash containing first entry + my $testdata1; + my $sumcount1; + my $funcdata1; + my $checkdata1; + my $testfncdata1; + my $sumfnccount1; + my $testbrdata1; + my $sumbrcount1; + + my $entry2 = $_[1]; # Reference to hash containing second entry + my $testdata2; + my $sumcount2; + my $funcdata2; + my $checkdata2; + my $testfncdata2; + my $sumfnccount2; + my $testbrdata2; + my $sumbrcount2; + + my %result; # Hash containing combined entry + my %result_testdata; + my $result_sumcount = {}; + my $result_funcdata; + my $result_testfncdata; + my $result_sumfnccount; + my $result_testbrdata; + my $result_sumbrcount; + my $lines_found; + my $lines_hit; + my $fn_found; + my $fn_hit; + my $br_found; + my $br_hit; + + my $testname; + my $filename = $_[2]; + + # Retrieve data + ($testdata1, $sumcount1, $funcdata1, $checkdata1, $testfncdata1, + $sumfnccount1, $testbrdata1, $sumbrcount1) = get_info_entry($entry1); + ($testdata2, $sumcount2, $funcdata2, $checkdata2, $testfncdata2, + $sumfnccount2, $testbrdata2, $sumbrcount2) = get_info_entry($entry2); + + # Merge checksums + $checkdata1 = merge_checksums($checkdata1, $checkdata2, $filename); + + # Combine funcdata + $result_funcdata = merge_func_data($funcdata1, $funcdata2, $filename); + + # Combine function call count data + $result_testfncdata = add_testfncdata($testfncdata1, $testfncdata2); + ($result_sumfnccount, $fn_found, $fn_hit) = + add_fnccount($sumfnccount1, $sumfnccount2); + + # Combine branch coverage data + $result_testbrdata = add_testbrdata($testbrdata1, $testbrdata2); + ($result_sumbrcount, $br_found, $br_hit) = + combine_brcount($sumbrcount1, $sumbrcount2, $BR_ADD); + + # Combine testdata + foreach $testname (keys(%{$testdata1})) + { + if (defined($testdata2->{$testname})) + { + # testname is present in both entries, requires + # combination + ($result_testdata{$testname}) = + add_counts($testdata1->{$testname}, + $testdata2->{$testname}); + } + else + { + # testname only present in entry1, add to result + $result_testdata{$testname} = $testdata1->{$testname}; + } + + # update sum count hash + ($result_sumcount, $lines_found, $lines_hit) = + add_counts($result_sumcount, + $result_testdata{$testname}); + } + + foreach $testname (keys(%{$testdata2})) + { + # Skip testnames already covered by previous iteration + if (defined($testdata1->{$testname})) { next; } + + # testname only present in entry2, add to result hash + $result_testdata{$testname} = $testdata2->{$testname}; + + # update sum count hash + ($result_sumcount, $lines_found, $lines_hit) = + add_counts($result_sumcount, + $result_testdata{$testname}); + } + + # Calculate resulting sumcount + + # Store result + set_info_entry(\%result, \%result_testdata, $result_sumcount, + $result_funcdata, $checkdata1, $result_testfncdata, + $result_sumfnccount, $result_testbrdata, + $result_sumbrcount, $lines_found, $lines_hit, + $fn_found, $fn_hit, $br_found, $br_hit); + + return(\%result); +} + + +# +# combine_info_files(info_ref1, info_ref2) +# +# Combine .info data in hashes referenced by INFO_REF1 and INFO_REF2. Return +# reference to resulting hash. +# + +sub combine_info_files($$) +{ + my %hash1 = %{$_[0]}; + my %hash2 = %{$_[1]}; + my $filename; + + foreach $filename (keys(%hash2)) + { + if ($hash1{$filename}) + { + # Entry already exists in hash1, combine them + $hash1{$filename} = + combine_info_entries($hash1{$filename}, + $hash2{$filename}, + $filename); + } + else + { + # Entry is unique in both hashes, simply add to + # resulting hash + $hash1{$filename} = $hash2{$filename}; + } + } + + return(\%hash1); +} + + +# +# get_prefix(min_dir, filename_list) +# +# Search FILENAME_LIST for a directory prefix which is common to as many +# list entries as possible, so that removing this prefix will minimize the +# sum of the lengths of all resulting shortened filenames while observing +# that no filename has less than MIN_DIR parent directories. +# + +sub get_prefix($@) +{ + my ($min_dir, @filename_list) = @_; + my %prefix; # mapping: prefix -> sum of lengths + my $current; # Temporary iteration variable + + # Find list of prefixes + foreach (@filename_list) + { + # Need explicit assignment to get a copy of $_ so that + # shortening the contained prefix does not affect the list + $current = $_; + while ($current = shorten_prefix($current)) + { + $current .= "/"; + + # Skip rest if the remaining prefix has already been + # added to hash + if (exists($prefix{$current})) { last; } + + # Initialize with 0 + $prefix{$current}="0"; + } + + } + + # Remove all prefixes that would cause filenames to have less than + # the minimum number of parent directories + foreach my $filename (@filename_list) { + my $dir = dirname($filename); + + for (my $i = 0; $i < $min_dir; $i++) { + delete($prefix{$dir."/"}); + $dir = shorten_prefix($dir); + } + } + + # Check if any prefix remains + return undef if (!%prefix); + + # Calculate sum of lengths for all prefixes + foreach $current (keys(%prefix)) + { + foreach (@filename_list) + { + # Add original length + $prefix{$current} += length($_); + + # Check whether prefix matches + if (substr($_, 0, length($current)) eq $current) + { + # Subtract prefix length for this filename + $prefix{$current} -= length($current); + } + } + } + + # Find and return prefix with minimal sum + $current = (keys(%prefix))[0]; + + foreach (keys(%prefix)) + { + if ($prefix{$_} < $prefix{$current}) + { + $current = $_; + } + } + + $current =~ s/\/$//; + + return($current); +} + + +# +# shorten_prefix(prefix) +# +# Return PREFIX shortened by last directory component. +# + +sub shorten_prefix($) +{ + my @list = split("/", $_[0]); + + pop(@list); + return join("/", @list); +} + + + +# +# get_dir_list(filename_list) +# +# Return sorted list of directories for each entry in given FILENAME_LIST. +# + +sub get_dir_list(@) +{ + my %result; + + foreach (@_) + { + $result{shorten_prefix($_)} = ""; + } + + return(sort(keys(%result))); +} + + +# +# get_relative_base_path(subdirectory) +# +# Return a relative path string which references the base path when applied +# in SUBDIRECTORY. +# +# Example: get_relative_base_path("fs/mm") -> "../../" +# + +sub get_relative_base_path($) +{ + my $result = ""; + my $index; + + # Make an empty directory path a special case + if (!$_[0]) { return(""); } + + # Count number of /s in path + $index = ($_[0] =~ s/\//\//g); + + # Add a ../ to $result for each / in the directory path + 1 + for (; $index>=0; $index--) + { + $result .= "../"; + } + + return $result; +} + + +# +# read_testfile(test_filename) +# +# Read in file TEST_FILENAME which contains test descriptions in the format: +# +# TN: +# TD: +# +# for each test case. Return a reference to a hash containing a mapping +# +# test name -> test description. +# +# Die on error. +# + +sub read_testfile($) +{ + my %result; + my $test_name; + my $changed_testname; + local *TEST_HANDLE; + + open(TEST_HANDLE, "<", $_[0]) + or die("ERROR: cannot open $_[0]!\n"); + + while () + { + chomp($_); + + # Match lines beginning with TN: + if (/^TN:\s+(.*?)\s*$/) + { + # Store name for later use + $test_name = $1; + if ($test_name =~ s/\W/_/g) + { + $changed_testname = 1; + } + } + + # Match lines beginning with TD: + if (/^TD:\s+(.*?)\s*$/) + { + if (!defined($test_name)) { + die("ERROR: Found test description without prior test name in $_[0]:$.\n"); + } + # Check for empty line + if ($1) + { + # Add description to hash + $result{$test_name} .= " $1"; + } + else + { + # Add empty line + $result{$test_name} .= "\n\n"; + } + } + } + + close(TEST_HANDLE); + + if ($changed_testname) + { + warn("WARNING: invalid characters removed from testname in ". + "descriptions file $_[0]\n"); + } + + return \%result; +} + + +# +# escape_html(STRING) +# +# Return a copy of STRING in which all occurrences of HTML special characters +# are escaped. +# + +sub escape_html($) +{ + my $string = $_[0]; + + if (!$string) { return ""; } + + $string =~ s/&/&/g; # & -> & + $string =~ s/ < + $string =~ s/>/>/g; # > -> > + $string =~ s/\"/"/g; # " -> " + + while ($string =~ /^([^\t]*)(\t)/) + { + my $replacement = " "x($tab_size - (length($1) % $tab_size)); + $string =~ s/^([^\t]*)(\t)/$1$replacement/; + } + + $string =~ s/\n/
/g; # \n ->
+ + return $string; +} + + +# +# get_date_string() +# +# Return the current date in the form: yyyy-mm-dd +# + +sub get_date_string() +{ + my $year; + my $month; + my $day; + my $hour; + my $min; + my $sec; + + ($year, $month, $day, $hour, $min, $sec) = + (localtime())[5, 4, 3, 2, 1, 0]; + + return sprintf("%d-%02d-%02d %02d:%02d:%02d", $year+1900, $month+1, + $day, $hour, $min, $sec); +} + + +# +# create_sub_dir(dir_name) +# +# Create subdirectory DIR_NAME if it does not already exist, including all its +# parent directories. +# +# Die on error. +# + +sub create_sub_dir($) +{ + my ($dir) = @_; + + system("mkdir", "-p" ,$dir) + and die("ERROR: cannot create directory $dir!\n"); +} + + +# +# write_description_file(descriptions, overall_found, overall_hit, +# total_fn_found, total_fn_hit, total_br_found, +# total_br_hit) +# +# Write HTML file containing all test case descriptions. DESCRIPTIONS is a +# reference to a hash containing a mapping +# +# test case name -> test case description +# +# Die on error. +# + +sub write_description_file($$$$$$$) +{ + my %description = %{$_[0]}; + my $found = $_[1]; + my $hit = $_[2]; + my $fn_found = $_[3]; + my $fn_hit = $_[4]; + my $br_found = $_[5]; + my $br_hit = $_[6]; + my $test_name; + local *HTML_HANDLE; + + html_create(*HTML_HANDLE,"descriptions.$html_ext"); + write_html_prolog(*HTML_HANDLE, "", "LCOV - test case descriptions"); + write_header(*HTML_HANDLE, 3, "", "", $found, $hit, $fn_found, + $fn_hit, $br_found, $br_hit, 0); + + write_test_table_prolog(*HTML_HANDLE, + "Test case descriptions - alphabetical list"); + + foreach $test_name (sort(keys(%description))) + { + my $desc = $description{$test_name}; + + $desc = escape_html($desc) if (!$rc_desc_html); + write_test_table_entry(*HTML_HANDLE, $test_name, $desc); + } + + write_test_table_epilog(*HTML_HANDLE); + write_html_epilog(*HTML_HANDLE, ""); + + close(*HTML_HANDLE); +} + + + +# +# write_png_files() +# +# Create all necessary .png files for the HTML-output in the current +# directory. .png-files are used as bar graphs. +# +# Die on error. +# + +sub write_png_files() +{ + my %data; + local *PNG_HANDLE; + + $data{"ruby.png"} = + [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, + 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, + 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, + 0x45, 0x07, 0xd2, 0x07, 0x11, 0x0f, 0x18, 0x10, 0x5d, 0x57, + 0x34, 0x6e, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, + 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, + 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, + 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, + 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x35, 0x2f, + 0x00, 0x00, 0x00, 0xd0, 0x33, 0x9a, 0x9d, 0x00, 0x00, 0x00, + 0x0a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x01, 0xe5, 0x27, 0xde, 0xfc, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, + 0x82]; + $data{"amber.png"} = + [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, + 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, + 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, + 0x45, 0x07, 0xd2, 0x07, 0x11, 0x0f, 0x28, 0x04, 0x98, 0xcb, + 0xd6, 0xe0, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, + 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, + 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, + 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, + 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xe0, 0x50, + 0x00, 0x00, 0x00, 0xa2, 0x7a, 0xda, 0x7e, 0x00, 0x00, 0x00, + 0x0a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x01, 0xe5, 0x27, 0xde, 0xfc, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, + 0x82]; + $data{"emerald.png"} = + [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, + 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, + 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, + 0x45, 0x07, 0xd2, 0x07, 0x11, 0x0f, 0x22, 0x2b, 0xc9, 0xf5, + 0x03, 0x33, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, + 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, + 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, + 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, + 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0x1b, 0xea, 0x59, + 0x0a, 0x0a, 0x0a, 0x0f, 0xba, 0x50, 0x83, 0x00, 0x00, 0x00, + 0x0a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x01, 0xe5, 0x27, 0xde, 0xfc, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, + 0x82]; + $data{"snow.png"} = + [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, + 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, + 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, + 0x45, 0x07, 0xd2, 0x07, 0x11, 0x0f, 0x1e, 0x1d, 0x75, 0xbc, + 0xef, 0x55, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, + 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, + 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, + 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, + 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x55, 0xc2, 0xd3, 0x7e, 0x00, 0x00, 0x00, + 0x0a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x01, 0xe5, 0x27, 0xde, 0xfc, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, + 0x82]; + $data{"glass.png"} = + [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, + 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, + 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, + 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, + 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x55, 0xc2, 0xd3, 0x7e, 0x00, 0x00, 0x00, + 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, + 0x00, 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x00, 0x88, + 0x05, 0x1d, 0x48, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, + 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, + 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, + 0x4d, 0x45, 0x07, 0xd2, 0x07, 0x13, 0x0f, 0x08, 0x19, 0xc4, + 0x40, 0x56, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x49, 0x44, 0x41, + 0x54, 0x78, 0x9c, 0x63, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x01, 0x48, 0xaf, 0xa4, 0x71, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82]; + $data{"updown.png"} = + [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, + 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0a, + 0x00, 0x00, 0x00, 0x0e, 0x08, 0x06, 0x00, 0x00, 0x00, 0x16, + 0xa3, 0x8d, 0xab, 0x00, 0x00, 0x00, 0x3c, 0x49, 0x44, 0x41, + 0x54, 0x28, 0xcf, 0x63, 0x60, 0x40, 0x03, 0xff, 0xa1, 0x00, + 0x5d, 0x9c, 0x11, 0x5d, 0x11, 0x8a, 0x24, 0x23, 0x23, 0x23, + 0x86, 0x42, 0x6c, 0xa6, 0x20, 0x2b, 0x66, 0xc4, 0xa7, 0x08, + 0x59, 0x31, 0x23, 0x21, 0x45, 0x30, 0xc0, 0xc4, 0x30, 0x60, + 0x80, 0xfa, 0x6e, 0x24, 0x3e, 0x78, 0x48, 0x0a, 0x70, 0x62, + 0xa2, 0x90, 0x81, 0xd8, 0x44, 0x01, 0x00, 0xe9, 0x5c, 0x2f, + 0xf5, 0xe2, 0x9d, 0x0f, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82] if ($sort); + foreach (keys(%data)) + { + open(PNG_HANDLE, ">", $_) + or die("ERROR: cannot create $_!\n"); + binmode(PNG_HANDLE); + print(PNG_HANDLE map(chr,@{$data{$_}})); + close(PNG_HANDLE); + } +} + + +# +# write_htaccess_file() +# + +sub write_htaccess_file() +{ + local *HTACCESS_HANDLE; + my $htaccess_data; + + open(*HTACCESS_HANDLE, ">", ".htaccess") + or die("ERROR: cannot open .htaccess for writing!\n"); + + $htaccess_data = (<<"END_OF_HTACCESS") +AddEncoding x-gzip .html +END_OF_HTACCESS + ; + + print(HTACCESS_HANDLE $htaccess_data); + close(*HTACCESS_HANDLE); +} + + +# +# write_css_file() +# +# Write the cascading style sheet file gcov.css to the current directory. +# This file defines basic layout attributes of all generated HTML pages. +# + +sub write_css_file() +{ + local *CSS_HANDLE; + + # Check for a specified external style sheet file + if ($css_filename) + { + # Simply copy that file + system("cp", $css_filename, "gcov.css") + and die("ERROR: cannot copy file $css_filename!\n"); + return; + } + + open(CSS_HANDLE, ">", "gcov.css") + or die ("ERROR: cannot open gcov.css for writing!\n"); + + + # ************************************************************* + + my $css_data = ($_=<<"END_OF_CSS") + /* All views: initial background and text color */ + body + { + color: #000000; + background-color: #FFFFFF; + } + + /* All views: standard link format*/ + a:link + { + color: #284FA8; + text-decoration: underline; + } + + /* All views: standard link - visited format */ + a:visited + { + color: #00CB40; + text-decoration: underline; + } + + /* All views: standard link - activated format */ + a:active + { + color: #FF0040; + text-decoration: underline; + } + + /* All views: main title format */ + td.title + { + text-align: center; + padding-bottom: 10px; + font-family: sans-serif; + font-size: 20pt; + font-style: italic; + font-weight: bold; + } + + /* All views: header item format */ + td.headerItem + { + text-align: right; + padding-right: 6px; + font-family: sans-serif; + font-weight: bold; + vertical-align: top; + white-space: nowrap; + } + + /* All views: header item value format */ + td.headerValue + { + text-align: left; + color: #284FA8; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; + } + + /* All views: header item coverage table heading */ + td.headerCovTableHead + { + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + font-size: 80%; + white-space: nowrap; + } + + /* All views: header item coverage table entry */ + td.headerCovTableEntry + { + text-align: right; + color: #284FA8; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; + padding-left: 12px; + padding-right: 4px; + background-color: #DAE7FE; + } + + /* All views: header item coverage table entry for high coverage rate */ + td.headerCovTableEntryHi + { + text-align: right; + color: #000000; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; + padding-left: 12px; + padding-right: 4px; + background-color: #A7FC9D; + } + + /* All views: header item coverage table entry for medium coverage rate */ + td.headerCovTableEntryMed + { + text-align: right; + color: #000000; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; + padding-left: 12px; + padding-right: 4px; + background-color: #FFEA20; + } + + /* All views: header item coverage table entry for ow coverage rate */ + td.headerCovTableEntryLo + { + text-align: right; + color: #000000; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; + padding-left: 12px; + padding-right: 4px; + background-color: #FF0000; + } + + /* All views: header legend value for legend entry */ + td.headerValueLeg + { + text-align: left; + color: #000000; + font-family: sans-serif; + font-size: 80%; + white-space: nowrap; + padding-top: 4px; + } + + /* All views: color of horizontal ruler */ + td.ruler + { + background-color: #6688D4; + } + + /* All views: version string format */ + td.versionInfo + { + text-align: center; + padding-top: 2px; + font-family: sans-serif; + font-style: italic; + } + + /* Directory view/File view (all)/Test case descriptions: + table headline format */ + td.tableHead + { + text-align: center; + color: #FFFFFF; + background-color: #6688D4; + font-family: sans-serif; + font-size: 120%; + font-weight: bold; + white-space: nowrap; + padding-left: 4px; + padding-right: 4px; + } + + span.tableHeadSort + { + padding-right: 4px; + } + + /* Directory view/File view (all): filename entry format */ + td.coverFile + { + text-align: left; + padding-left: 10px; + padding-right: 20px; + color: #284FA8; + background-color: #DAE7FE; + font-family: monospace; + } + + /* Directory view/File view (all): bar-graph entry format*/ + td.coverBar + { + padding-left: 10px; + padding-right: 10px; + background-color: #DAE7FE; + } + + /* Directory view/File view (all): bar-graph outline color */ + td.coverBarOutline + { + background-color: #000000; + } + + /* Directory view/File view (all): percentage entry for files with + high coverage rate */ + td.coverPerHi + { + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #A7FC9D; + font-weight: bold; + font-family: sans-serif; + } + + /* Directory view/File view (all): line count entry for files with + high coverage rate */ + td.coverNumHi + { + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #A7FC9D; + white-space: nowrap; + font-family: sans-serif; + } + + /* Directory view/File view (all): percentage entry for files with + medium coverage rate */ + td.coverPerMed + { + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #FFEA20; + font-weight: bold; + font-family: sans-serif; + } + + /* Directory view/File view (all): line count entry for files with + medium coverage rate */ + td.coverNumMed + { + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #FFEA20; + white-space: nowrap; + font-family: sans-serif; + } + + /* Directory view/File view (all): percentage entry for files with + low coverage rate */ + td.coverPerLo + { + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #FF0000; + font-weight: bold; + font-family: sans-serif; + } + + /* Directory view/File view (all): line count entry for files with + low coverage rate */ + td.coverNumLo + { + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #FF0000; + white-space: nowrap; + font-family: sans-serif; + } + + /* File view (all): "show/hide details" link format */ + a.detail:link + { + color: #B8D0FF; + font-size:80%; + } + + /* File view (all): "show/hide details" link - visited format */ + a.detail:visited + { + color: #B8D0FF; + font-size:80%; + } + + /* File view (all): "show/hide details" link - activated format */ + a.detail:active + { + color: #FFFFFF; + font-size:80%; + } + + /* File view (detail): test name entry */ + td.testName + { + text-align: right; + padding-right: 10px; + background-color: #DAE7FE; + font-family: sans-serif; + } + + /* File view (detail): test percentage entry */ + td.testPer + { + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #DAE7FE; + font-family: sans-serif; + } + + /* File view (detail): test lines count entry */ + td.testNum + { + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #DAE7FE; + font-family: sans-serif; + } + + /* Test case descriptions: test name format*/ + dt + { + font-family: sans-serif; + font-weight: bold; + } + + /* Test case descriptions: description table body */ + td.testDescription + { + padding-top: 10px; + padding-left: 30px; + padding-bottom: 10px; + padding-right: 30px; + background-color: #DAE7FE; + } + + /* Source code view: function entry */ + td.coverFn + { + text-align: left; + padding-left: 10px; + padding-right: 20px; + color: #284FA8; + background-color: #DAE7FE; + font-family: monospace; + } + + /* Source code view: function entry zero count*/ + td.coverFnLo + { + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #FF0000; + font-weight: bold; + font-family: sans-serif; + } + + /* Source code view: function entry nonzero count*/ + td.coverFnHi + { + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #DAE7FE; + font-weight: bold; + font-family: sans-serif; + } + + /* Source code view: source code format */ + pre.source + { + font-family: monospace; + white-space: pre; + margin-top: 2px; + } + + /* Source code view: line number format */ + span.lineNum + { + background-color: #EFE383; + } + + /* Source code view: format for lines which were executed */ + td.lineCov, + span.lineCov + { + background-color: #CAD7FE; + } + + /* Source code view: format for Cov legend */ + span.coverLegendCov + { + padding-left: 10px; + padding-right: 10px; + padding-bottom: 2px; + background-color: #CAD7FE; + } + + /* Source code view: format for lines which were not executed */ + td.lineNoCov, + span.lineNoCov + { + background-color: #FF6230; + } + + /* Source code view: format for NoCov legend */ + span.coverLegendNoCov + { + padding-left: 10px; + padding-right: 10px; + padding-bottom: 2px; + background-color: #FF6230; + } + + /* Source code view (function table): standard link - visited format */ + td.lineNoCov > a:visited, + td.lineCov > a:visited + { + color: black; + text-decoration: underline; + } + + /* Source code view: format for lines which were executed only in a + previous version */ + span.lineDiffCov + { + background-color: #B5F7AF; + } + + /* Source code view: format for branches which were executed + * and taken */ + span.branchCov + { + background-color: #CAD7FE; + } + + /* Source code view: format for branches which were executed + * but not taken */ + span.branchNoCov + { + background-color: #FF6230; + } + + /* Source code view: format for branches which were not executed */ + span.branchNoExec + { + background-color: #FF6230; + } + + /* Source code view: format for the source code heading line */ + pre.sourceHeading + { + white-space: pre; + font-family: monospace; + font-weight: bold; + margin: 0px; + } + + /* All views: header legend value for low rate */ + td.headerValueLegL + { + font-family: sans-serif; + text-align: center; + white-space: nowrap; + padding-left: 4px; + padding-right: 2px; + background-color: #FF0000; + font-size: 80%; + } + + /* All views: header legend value for med rate */ + td.headerValueLegM + { + font-family: sans-serif; + text-align: center; + white-space: nowrap; + padding-left: 2px; + padding-right: 2px; + background-color: #FFEA20; + font-size: 80%; + } + + /* All views: header legend value for hi rate */ + td.headerValueLegH + { + font-family: sans-serif; + text-align: center; + white-space: nowrap; + padding-left: 2px; + padding-right: 4px; + background-color: #A7FC9D; + font-size: 80%; + } + + /* All views except source code view: legend format for low coverage */ + span.coverLegendCovLo + { + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; + background-color: #FF0000; + } + + /* All views except source code view: legend format for med coverage */ + span.coverLegendCovMed + { + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; + background-color: #FFEA20; + } + + /* All views except source code view: legend format for hi coverage */ + span.coverLegendCovHi + { + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; + background-color: #A7FC9D; + } +END_OF_CSS + ; + + # ************************************************************* + + + # Remove leading tab from all lines + $css_data =~ s/^\t//gm; + + print(CSS_HANDLE $css_data); + + close(CSS_HANDLE); +} + + +# +# get_bar_graph_code(base_dir, cover_found, cover_hit) +# +# Return a string containing HTML code which implements a bar graph display +# for a coverage rate of cover_hit * 100 / cover_found. +# + +sub get_bar_graph_code($$$) +{ + my ($base_dir, $found, $hit) = @_; + my $rate; + my $alt; + my $width; + my $remainder; + my $png_name; + my $graph_code; + + # Check number of instrumented lines + if ($_[1] == 0) { return ""; } + + $alt = rate($hit, $found, "%"); + $width = rate($hit, $found, undef, 0); + $remainder = 100 - $width; + + # Decide which .png file to use + $png_name = $rate_png[classify_rate($found, $hit, $med_limit, + $hi_limit)]; + + if ($width == 0) + { + # Zero coverage + $graph_code = (<$alt +END_OF_HTML + ; + } + elsif ($width == 100) + { + # Full coverage + $graph_code = (<$alt +END_OF_HTML + ; + } + else + { + # Positive coverage + $graph_code = (<$alt$alt +END_OF_HTML + ; + } + + # Remove leading tabs from all lines + $graph_code =~ s/^\t+//gm; + chomp($graph_code); + + return($graph_code); +} + +# +# sub classify_rate(found, hit, med_limit, high_limit) +# +# Return 0 for low rate, 1 for medium rate and 2 for hi rate. +# + +sub classify_rate($$$$) +{ + my ($found, $hit, $med, $hi) = @_; + my $rate; + + if ($found == 0) { + return 2; + } + $rate = rate($hit, $found); + if ($rate < $med) { + return 0; + } elsif ($rate < $hi) { + return 1; + } + return 2; +} + + +# +# write_html(filehandle, html_code) +# +# Write out HTML_CODE to FILEHANDLE while removing a leading tabulator mark +# in each line of HTML_CODE. +# + +sub write_html(*$) +{ + local *HTML_HANDLE = $_[0]; + my $html_code = $_[1]; + + # Remove leading tab from all lines + $html_code =~ s/^\t//gm; + + print(HTML_HANDLE $html_code) + or die("ERROR: cannot write HTML data ($!)\n"); +} + + +# +# write_html_prolog(filehandle, base_dir, pagetitle) +# +# Write an HTML prolog common to all HTML files to FILEHANDLE. PAGETITLE will +# be used as HTML page title. BASE_DIR contains a relative path which points +# to the base directory. +# + +sub write_html_prolog(*$$) +{ + my $basedir = $_[1]; + my $pagetitle = $_[2]; + my $prolog; + + $prolog = $html_prolog; + $prolog =~ s/\@pagetitle\@/$pagetitle/g; + $prolog =~ s/\@basedir\@/$basedir/g; + + write_html($_[0], $prolog); +} + + +# +# write_header_prolog(filehandle, base_dir) +# +# Write beginning of page header HTML code. +# + +sub write_header_prolog(*$) +{ + # ************************************************************* + + write_html($_[0], < + $title + + + + + +END_OF_HTML + ; + + # ************************************************************* +} + + +# +# write_header_line(handle, content) +# +# Write a header line with the specified table contents. +# + +sub write_header_line(*@) +{ + my ($handle, @content) = @_; + my $entry; + + write_html($handle, " \n"); + foreach $entry (@content) { + my ($width, $class, $text, $colspan) = @{$entry}; + + if (defined($width)) { + $width = " width=\"$width\""; + } else { + $width = ""; + } + if (defined($class)) { + $class = " class=\"$class\""; + } else { + $class = ""; + } + if (defined($colspan)) { + $colspan = " colspan=\"$colspan\""; + } else { + $colspan = ""; + } + $text = "" if (!defined($text)); + write_html($handle, + " $text\n"); + } + write_html($handle, " \n"); +} + + +# +# write_header_epilog(filehandle, base_dir) +# +# Write end of page header HTML code. +# + +sub write_header_epilog(*$) +{ + # ************************************************************* + + write_html($_[0], < +
+ + + + + + +END_OF_HTML + ; + + # ************************************************************* +} + + +# +# write_file_table_prolog(handle, file_heading, ([heading, num_cols], ...)) +# +# Write heading for file table. +# + +sub write_file_table_prolog(*$@) +{ + my ($handle, $file_heading, @columns) = @_; + my $num_columns = 0; + my $file_width; + my $col; + my $width; + + $width = 20 if (scalar(@columns) == 1); + $width = 10 if (scalar(@columns) == 2); + $width = 8 if (scalar(@columns) > 2); + + foreach $col (@columns) { + my ($heading, $cols) = @{$col}; + + $num_columns += $cols; + } + $file_width = 100 - $num_columns * $width; + + # Table definition + write_html($handle, < + + + + +END_OF_HTML + # Empty first row + foreach $col (@columns) { + my ($heading, $cols) = @{$col}; + + while ($cols-- > 0) { + write_html($handle, < +END_OF_HTML + } + } + # Next row + write_html($handle, < + + + +END_OF_HTML + # Heading row + foreach $col (@columns) { + my ($heading, $cols) = @{$col}; + my $colspan = ""; + + $colspan = " colspan=$cols" if ($cols > 1); + write_html($handle, <$heading +END_OF_HTML + } + write_html($handle, < +END_OF_HTML +} + + +# write_file_table_entry(handle, base_dir, filename, page_link, +# ([ found, hit, med_limit, hi_limit, graph ], ..) +# +# Write an entry of the file table. +# + +sub write_file_table_entry(*$$$@) +{ + my ($handle, $base_dir, $filename, $page_link, @entries) = @_; + my $file_code; + my $entry; + my $esc_filename = escape_html($filename); + + # Add link to source if provided + if (defined($page_link) && $page_link ne "") { + $file_code = "$esc_filename"; + } else { + $file_code = $esc_filename; + } + + # First column: filename + write_html($handle, < + +END_OF_HTML + # Columns as defined + foreach $entry (@entries) { + my ($found, $hit, $med, $hi, $graph) = @{$entry}; + my $bar_graph; + my $class; + my $rate; + + # Generate bar graph if requested + if ($graph) { + $bar_graph = get_bar_graph_code($base_dir, $found, + $hit); + write_html($handle, < + $bar_graph + +END_OF_HTML + } + # Get rate color and text + if ($found == 0) { + $rate = "-"; + $class = "Hi"; + } else { + $rate = rate($hit, $found, " %"); + $class = $rate_name[classify_rate($found, $hit, + $med, $hi)]; + } + write_html($handle, <$rate + +END_OF_HTML + } + # End of row + write_html($handle, < +END_OF_HTML +} + + +# +# write_file_table_detail_entry(filehandle, test_name, ([found, hit], ...)) +# +# Write entry for detail section in file table. +# + +sub write_file_table_detail_entry(*$@) +{ + my ($handle, $test, @entries) = @_; + my $entry; + + if ($test eq "") { + $test = "<unnamed>"; + } elsif ($test =~ /^(.*),diff$/) { + $test = $1." (converted)"; + } + # Testname + write_html($handle, < + +END_OF_HTML + # Test data + foreach $entry (@entries) { + my ($found, $hit) = @{$entry}; + my $rate = rate($hit, $found, " %"); + + write_html($handle, <$rate + +END_OF_HTML + } + + write_html($handle, < + +END_OF_HTML + + # ************************************************************* +} + + +# +# write_file_table_epilog(filehandle) +# +# Write end of file table HTML code. +# + +sub write_file_table_epilog(*) +{ + # ************************************************************* + + write_html($_[0], < + +
+ +END_OF_HTML + ; + + # ************************************************************* +} + + +# +# write_test_table_prolog(filehandle, table_heading) +# +# Write heading for test case description table. +# + +sub write_test_table_prolog(*$) +{ + # ************************************************************* + + write_html($_[0], < +

$file_heading$file_code$hit / $found$test$hit / $found
+ + + + + + + + + + + + +

$_[1]
+
+END_OF_HTML + ; + + # ************************************************************* +} + + +# +# write_test_table_entry(filehandle, test_name, test_description) +# +# Write entry for the test table. +# + +sub write_test_table_entry(*$$) +{ + # ************************************************************* + + write_html($_[0], <$_[1]  +
$_[2]

+END_OF_HTML + ; + + # ************************************************************* +} + + +# +# write_test_table_epilog(filehandle) +# +# Write end of test description table HTML code. +# + +sub write_test_table_epilog(*) +{ + # ************************************************************* + + write_html($_[0], < +
+ +
+ +END_OF_HTML + ; + + # ************************************************************* +} + + +sub fmt_centered($$) +{ + my ($width, $text) = @_; + my $w0 = length($text); + my $w1 = int(($width - $w0) / 2); + my $w2 = $width - $w0 - $w1; + + return (" "x$w1).$text.(" "x$w2); +} + + +# +# write_source_prolog(filehandle) +# +# Write start of source code table. +# + +sub write_source_prolog(*) +{ + my $lineno_heading = " "; + my $branch_heading = ""; + my $line_heading = fmt_centered($line_field_width, "Line data"); + my $source_heading = " Source code"; + + if ($br_coverage) { + $branch_heading = fmt_centered($br_field_width, "Branch data"). + " "; + } + # ************************************************************* + + write_html($_[0], < + +
+ + + +

${lineno_heading}${branch_heading}${line_heading} ${source_heading}
+
+END_OF_HTML
+	;
+
+	# *************************************************************
+}
+
+
+#
+# get_branch_blocks(brdata)
+#
+# Group branches that belong to the same basic block.
+#
+# Returns: [block1, block2, ...]
+# block:   [branch1, branch2, ...]
+# branch:  [block_num, branch_num, taken_count, text_length, open, close]
+#
+
+sub get_branch_blocks($)
+{
+	my ($brdata) = @_;
+	my $last_block_num;
+	my $block = [];
+	my @blocks;
+	my $i;
+	my $num = br_ivec_len($brdata);
+
+	# Group branches
+	for ($i = 0; $i < $num; $i++) {
+		my ($block_num, $branch, $taken) = br_ivec_get($brdata, $i);
+		my $br;
+
+		if (defined($last_block_num) && $block_num != $last_block_num) {
+			push(@blocks, $block);
+			$block = [];
+		}
+		$br = [$block_num, $branch, $taken, 3, 0, 0];
+		push(@{$block}, $br);
+		$last_block_num = $block_num;
+	}
+	push(@blocks, $block) if (scalar(@{$block}) > 0);
+
+	# Add braces to first and last branch in group
+	foreach $block (@blocks) {
+		$block->[0]->[$BR_OPEN] = 1;
+		$block->[0]->[$BR_LEN]++;
+		$block->[scalar(@{$block}) - 1]->[$BR_CLOSE] = 1;
+		$block->[scalar(@{$block}) - 1]->[$BR_LEN]++;
+	}
+
+	return @blocks;
+}
+
+#
+# get_block_len(block)
+#
+# Calculate total text length of all branches in a block of branches.
+#
+
+sub get_block_len($)
+{
+	my ($block) = @_;
+	my $len = 0;
+	my $branch;
+
+	foreach $branch (@{$block}) {
+		$len += $branch->[$BR_LEN];
+	}
+
+	return $len;
+}
+
+
+#
+# get_branch_html(brdata)
+#
+# Return a list of HTML lines which represent the specified branch coverage
+# data in source code view.
+#
+
+sub get_branch_html($)
+{
+	my ($brdata) = @_;
+	my @blocks = get_branch_blocks($brdata);
+	my $block;
+	my $branch;
+	my $line_len = 0;
+	my $line = [];	# [branch2|" ", branch|" ", ...]
+	my @lines;	# [line1, line2, ...]
+	my @result;
+
+	# Distribute blocks to lines
+	foreach $block (@blocks) {
+		my $block_len = get_block_len($block);
+
+		# Does this block fit into the current line?
+		if ($line_len + $block_len <= $br_field_width) {
+			# Add it
+			$line_len += $block_len;
+			push(@{$line}, @{$block});
+			next;
+		} elsif ($block_len <= $br_field_width) {
+			# It would fit if the line was empty - add it to new
+			# line
+			push(@lines, $line);
+			$line_len = $block_len;
+			$line = [ @{$block} ];
+			next;
+		}
+		# Split the block into several lines
+		foreach $branch (@{$block}) {
+			if ($line_len + $branch->[$BR_LEN] >= $br_field_width) {
+				# Start a new line
+				if (($line_len + 1 <= $br_field_width) &&
+				    scalar(@{$line}) > 0 &&
+				    !$line->[scalar(@$line) - 1]->[$BR_CLOSE]) {
+					# Try to align branch symbols to be in
+					# one # row
+					push(@{$line}, " ");
+				}
+				push(@lines, $line);
+				$line_len = 0;
+				$line = [];
+			}
+			push(@{$line}, $branch);
+			$line_len += $branch->[$BR_LEN];
+		}
+	}
+	push(@lines, $line);
+
+	# Convert to HTML
+	foreach $line (@lines) {
+		my $current = "";
+		my $current_len = 0;
+
+		foreach $branch (@$line) {
+			# Skip alignment space
+			if ($branch eq " ") {
+				$current .= " ";
+				$current_len++;
+				next;
+			}
+
+			my ($block_num, $br_num, $taken, $len, $open, $close) =
+			   @{$branch};
+			my $class;
+			my $title;
+			my $text;
+
+			if ($taken eq '-') {
+				$class	= "branchNoExec";
+				$text	= " # ";
+				$title	= "Branch $br_num was not executed";
+			} elsif ($taken == 0) {
+				$class	= "branchNoCov";
+				$text	= " - ";
+				$title	= "Branch $br_num was not taken";
+			} else {
+				$class	= "branchCov";
+				$text	= " + ";
+				$title	= "Branch $br_num was taken $taken ".
+					  "time";
+				$title .= "s" if ($taken > 1);
+			}
+			$current .= "[" if ($open);
+			$current .= "";
+			$current .= $text."";
+			$current .= "]" if ($close);
+			$current_len += $len;
+		}
+
+		# Right-align result text
+		if ($current_len < $br_field_width) {
+			$current = (" "x($br_field_width - $current_len)).
+				   $current;
+		}
+		push(@result, $current);
+	}
+
+	return @result;
+}
+
+
+#
+# format_count(count, width)
+#
+# Return a right-aligned representation of count that fits in width characters.
+#
+
+sub format_count($$)
+{
+	my ($count, $width) = @_;
+	my $result;
+	my $exp;
+
+	$result = sprintf("%*.0f", $width, $count);
+	while (length($result) > $width) {
+		last if ($count < 10);
+		$exp++;
+		$count = int($count/10);
+		$result = sprintf("%*s", $width, ">$count*10^$exp");
+	}
+	return $result;
+}
+
+#
+# write_source_line(filehandle, line_num, source, hit_count, converted,
+#                   brdata, add_anchor)
+#
+# Write formatted source code line. Return a line in a format as needed
+# by gen_png()
+#
+
+sub write_source_line(*$$$$$$)
+{
+	my ($handle, $line, $source, $count, $converted, $brdata,
+	    $add_anchor) = @_;
+	my $source_format;
+	my $count_format;
+	my $result;
+	my $anchor_start = "";
+	my $anchor_end = "";
+	my $count_field_width = $line_field_width - 1;
+	my @br_html;
+	my $html;
+
+	# Get branch HTML data for this line
+	@br_html = get_branch_html($brdata) if ($br_coverage);
+
+	if (!defined($count)) {
+		$result		= "";
+		$source_format	= "";
+		$count_format	= " "x$count_field_width;
+	}
+	elsif ($count == 0) {
+		$result		= $count;
+		$source_format	= '';
+		$count_format	= format_count($count, $count_field_width);
+	}
+	elsif ($converted && defined($highlight)) {
+		$result		= "*".$count;
+		$source_format	= '';
+		$count_format	= format_count($count, $count_field_width);
+	}
+	else {
+		$result		= $count;
+		$source_format	= '';
+		$count_format	= format_count($count, $count_field_width);
+	}
+	$result .= ":".$source;
+
+	# Write out a line number navigation anchor every $nav_resolution
+	# lines if necessary
+	if ($add_anchor)
+	{
+		$anchor_start	= "";
+		$anchor_end	= "";
+	}
+
+
+	# *************************************************************
+
+	$html = $anchor_start;
+	$html .= "".sprintf("%8d", $line)." ";
+	$html .= shift(@br_html).":" if ($br_coverage);
+	$html .= "$source_format$count_format : ";
+	$html .= escape_html($source);
+	$html .= "" if ($source_format);
+	$html .= $anchor_end."\n";
+
+	write_html($handle, $html);
+
+	if ($br_coverage) {
+		# Add lines for overlong branch information
+		foreach (@br_html) {
+			write_html($handle, "".
+				   "         $_\n");
+		}
+	}
+	# *************************************************************
+
+	return($result);
+}
+
+
+#
+# write_source_epilog(filehandle)
+#
+# Write end of source code table.
+#
+
+sub write_source_epilog(*)
+{
+	# *************************************************************
+
+	write_html($_[0], <
+	      
+	    
+	  
+	  
+ +END_OF_HTML + ; + + # ************************************************************* +} + + +# +# write_html_epilog(filehandle, base_dir[, break_frames]) +# +# Write HTML page footer to FILEHANDLE. BREAK_FRAMES should be set when +# this page is embedded in a frameset, clicking the URL link will then +# break this frameset. +# + +sub write_html_epilog(*$;$) +{ + my $basedir = $_[1]; + my $break_code = ""; + my $epilog; + + if (defined($_[2])) + { + $break_code = " target=\"_parent\""; + } + + # ************************************************************* + + write_html($_[0], < + + Generated by: $lcov_version + +
+END_OF_HTML + ; + + $epilog = $html_epilog; + $epilog =~ s/\@basedir\@/$basedir/g; + + write_html($_[0], $epilog); +} + + +# +# write_frameset(filehandle, basedir, basename, pagetitle) +# +# + +sub write_frameset(*$$$) +{ + my $frame_width = $overview_width + 40; + + # ************************************************************* + + write_html($_[0], < + + + + + + $_[3] + + + + + + + + <center>Frames not supported by your browser!<br></center> + + + + +END_OF_HTML + ; + + # ************************************************************* +} + + +# +# sub write_overview_line(filehandle, basename, line, link) +# +# + +sub write_overview_line(*$$$) +{ + my $y1 = $_[2] - 1; + my $y2 = $y1 + $nav_resolution - 1; + my $x2 = $overview_width - 1; + + # ************************************************************* + + write_html($_[0], < +END_OF_HTML + ; + + # ************************************************************* +} + + +# +# write_overview(filehandle, basedir, basename, pagetitle, lines) +# +# + +sub write_overview(*$$$$) +{ + my $index; + my $max_line = $_[4] - 1; + my $offset; + + # ************************************************************* + + write_html($_[0], < + + + + + $_[3] + + + + + + +END_OF_HTML + ; + + # ************************************************************* + + # Make $offset the next higher multiple of $nav_resolution + $offset = ($nav_offset + $nav_resolution - 1) / $nav_resolution; + $offset = sprintf("%d", $offset ) * $nav_resolution; + + # Create image map for overview image + for ($index = 1; $index <= $_[4]; $index += $nav_resolution) + { + # Enforce nav_offset + if ($index < $offset + 1) + { + write_overview_line($_[0], $_[2], $index, 1); + } + else + { + write_overview_line($_[0], $_[2], $index, $index - $offset); + } + } + + # ************************************************************* + + write_html($_[0], < + +
+ Top

+ Overview +
+ + +END_OF_HTML + ; + + # ************************************************************* +} + + +sub max($$) +{ + my ($a, $b) = @_; + + return $a if ($a > $b); + return $b; +} + + +# +# write_header(filehandle, type, trunc_file_name, rel_file_name, lines_found, +# lines_hit, funcs_found, funcs_hit, sort_type) +# +# Write a complete standard page header. TYPE may be (0, 1, 2, 3, 4) +# corresponding to (directory view header, file view header, source view +# header, test case description header, function view header) +# + +sub write_header(*$$$$$$$$$$) +{ + local *HTML_HANDLE = $_[0]; + my $type = $_[1]; + my $trunc_name = $_[2]; + my $rel_filename = $_[3]; + my $lines_found = $_[4]; + my $lines_hit = $_[5]; + my $fn_found = $_[6]; + my $fn_hit = $_[7]; + my $br_found = $_[8]; + my $br_hit = $_[9]; + my $sort_type = $_[10]; + my $base_dir; + my $view; + my $test; + my $base_name; + my $style; + my $rate; + my @row_left; + my @row_right; + my $num_rows; + my $i; + my $esc_trunc_name = escape_html($trunc_name); + + $base_name = basename($rel_filename); + + # Prepare text for "current view" field + if ($type == $HDR_DIR) + { + # Main overview + $base_dir = ""; + $view = $overview_title; + } + elsif ($type == $HDR_FILE) + { + # Directory overview + $base_dir = get_relative_base_path($rel_filename); + $view = "". + "$overview_title - $esc_trunc_name"; + } + elsif ($type == $HDR_SOURCE || $type == $HDR_FUNC) + { + # File view + my $dir_name = dirname($rel_filename); + my $esc_base_name = escape_html($base_name); + my $esc_dir_name = escape_html($dir_name); + + $base_dir = get_relative_base_path($dir_name); + if ($frames) + { + # Need to break frameset when clicking any of these + # links + $view = "$overview_title - ". + "". + "$esc_dir_name - $esc_base_name"; + } + else + { + $view = "". + "$overview_title - ". + "". + "$esc_dir_name - $esc_base_name"; + } + + # Add function suffix + if ($func_coverage) { + $view .= ""; + if ($type == $HDR_SOURCE) { + if ($sort) { + $view .= " (source / functions)"; + } else { + $view .= " (source / functions)"; + } + } elsif ($type == $HDR_FUNC) { + $view .= " (source / functions)"; + } + $view .= ""; + } + } + elsif ($type == $HDR_TESTDESC) + { + # Test description header + $base_dir = ""; + $view = "". + "$overview_title - test case descriptions"; + } + + # Prepare text for "test" field + $test = escape_html($test_title); + + # Append link to test description page if available + if (%test_description && ($type != $HDR_TESTDESC)) + { + if ($frames && ($type == $HDR_SOURCE || $type == $HDR_FUNC)) + { + # Need to break frameset when clicking this link + $test .= " ( ". + "". + "view descriptions )"; + } + else + { + $test .= " ( ". + "". + "view descriptions )"; + } + } + + # Write header + write_header_prolog(*HTML_HANDLE, $base_dir); + + # Left row + push(@row_left, [[ "10%", "headerItem", "Current view:" ], + [ "35%", "headerValue", $view ]]); + push(@row_left, [[undef, "headerItem", "Test:"], + [undef, "headerValue", $test]]); + push(@row_left, [[undef, "headerItem", "Date:"], + [undef, "headerValue", $date]]); + + # Right row + if ($legend && ($type == $HDR_SOURCE || $type == $HDR_FUNC)) { + my $text = <hit
+ not hit +END_OF_HTML + if ($br_coverage) { + $text .= <+
taken + - not taken + # not executed +END_OF_HTML + } + push(@row_left, [[undef, "headerItem", "Legend:"], + [undef, "headerValueLeg", $text]]); + } elsif ($legend && ($type != $HDR_TESTDESC)) { + my $text = <low: < $med_limit % + medium: >= $med_limit % + high: >= $hi_limit % +END_OF_HTML + push(@row_left, [[undef, "headerItem", "Legend:"], + [undef, "headerValueLeg", $text]]); + } + if ($type == $HDR_TESTDESC) { + push(@row_right, [[ "55%" ]]); + } else { + push(@row_right, [["15%", undef, undef ], + ["10%", "headerCovTableHead", "Hit" ], + ["10%", "headerCovTableHead", "Total" ], + ["15%", "headerCovTableHead", "Coverage"]]); + } + # Line coverage + $style = $rate_name[classify_rate($lines_found, $lines_hit, + $med_limit, $hi_limit)]; + $rate = rate($lines_hit, $lines_found, " %"); + push(@row_right, [[undef, "headerItem", "Lines:"], + [undef, "headerCovTableEntry", $lines_hit], + [undef, "headerCovTableEntry", $lines_found], + [undef, "headerCovTableEntry$style", $rate]]) + if ($type != $HDR_TESTDESC); + # Function coverage + if ($func_coverage) { + $style = $rate_name[classify_rate($fn_found, $fn_hit, + $fn_med_limit, $fn_hi_limit)]; + $rate = rate($fn_hit, $fn_found, " %"); + push(@row_right, [[undef, "headerItem", "Functions:"], + [undef, "headerCovTableEntry", $fn_hit], + [undef, "headerCovTableEntry", $fn_found], + [undef, "headerCovTableEntry$style", $rate]]) + if ($type != $HDR_TESTDESC); + } + # Branch coverage + if ($br_coverage) { + $style = $rate_name[classify_rate($br_found, $br_hit, + $br_med_limit, $br_hi_limit)]; + $rate = rate($br_hit, $br_found, " %"); + push(@row_right, [[undef, "headerItem", "Branches:"], + [undef, "headerCovTableEntry", $br_hit], + [undef, "headerCovTableEntry", $br_found], + [undef, "headerCovTableEntry$style", $rate]]) + if ($type != $HDR_TESTDESC); + } + + # Print rows + $num_rows = max(scalar(@row_left), scalar(@row_right)); + for ($i = 0; $i < $num_rows; $i++) { + my $left = $row_left[$i]; + my $right = $row_right[$i]; + + if (!defined($left)) { + $left = [[undef, undef, undef], [undef, undef, undef]]; + } + if (!defined($right)) { + $right = []; + } + write_header_line(*HTML_HANDLE, @{$left}, + [ $i == 0 ? "5%" : undef, undef, undef], + @{$right}); + } + + # Fourth line + write_header_epilog(*HTML_HANDLE, $base_dir); +} + + +# +# get_sorted_keys(hash_ref, sort_type) +# + +sub get_sorted_keys($$) +{ + my ($hash, $type) = @_; + + if ($type == $SORT_FILE) { + # Sort by name + return sort(keys(%{$hash})); + } elsif ($type == $SORT_LINE) { + # Sort by line coverage + return sort({$hash->{$a}[7] <=> $hash->{$b}[7]} keys(%{$hash})); + } elsif ($type == $SORT_FUNC) { + # Sort by function coverage; + return sort({$hash->{$a}[8] <=> $hash->{$b}[8]} keys(%{$hash})); + } elsif ($type == $SORT_BRANCH) { + # Sort by br coverage; + return sort({$hash->{$a}[9] <=> $hash->{$b}[9]} keys(%{$hash})); + } +} + +sub get_sort_code($$$) +{ + my ($link, $alt, $base) = @_; + my $png; + my $link_start; + my $link_end; + + if (!defined($link)) { + $png = "glass.png"; + $link_start = ""; + $link_end = ""; + } else { + $png = "updown.png"; + $link_start = ''; + $link_end = ""; + } + + return ' '.$link_start. + ''.$link_end.''; +} + +sub get_file_code($$$$) +{ + my ($type, $text, $sort_button, $base) = @_; + my $result = $text; + my $link; + + if ($sort_button) { + if ($type == $HEAD_NO_DETAIL) { + $link = "index.$html_ext"; + } else { + $link = "index-detail.$html_ext"; + } + } + $result .= get_sort_code($link, "Sort by name", $base); + + return $result; +} + +sub get_line_code($$$$$) +{ + my ($type, $sort_type, $text, $sort_button, $base) = @_; + my $result = $text; + my $sort_link; + + if ($type == $HEAD_NO_DETAIL) { + # Just text + if ($sort_button) { + $sort_link = "index-sort-l.$html_ext"; + } + } elsif ($type == $HEAD_DETAIL_HIDDEN) { + # Text + link to detail view + $result .= ' ( show details )'; + if ($sort_button) { + $sort_link = "index-sort-l.$html_ext"; + } + } else { + # Text + link to standard view + $result .= ' ( hide details )'; + if ($sort_button) { + $sort_link = "index-detail-sort-l.$html_ext"; + } + } + # Add sort button + $result .= get_sort_code($sort_link, "Sort by line coverage", $base); + + return $result; +} + +sub get_func_code($$$$) +{ + my ($type, $text, $sort_button, $base) = @_; + my $result = $text; + my $link; + + if ($sort_button) { + if ($type == $HEAD_NO_DETAIL) { + $link = "index-sort-f.$html_ext"; + } else { + $link = "index-detail-sort-f.$html_ext"; + } + } + $result .= get_sort_code($link, "Sort by function coverage", $base); + return $result; +} + +sub get_br_code($$$$) +{ + my ($type, $text, $sort_button, $base) = @_; + my $result = $text; + my $link; + + if ($sort_button) { + if ($type == $HEAD_NO_DETAIL) { + $link = "index-sort-b.$html_ext"; + } else { + $link = "index-detail-sort-b.$html_ext"; + } + } + $result .= get_sort_code($link, "Sort by branch coverage", $base); + return $result; +} + +# +# write_file_table(filehandle, base_dir, overview, testhash, testfnchash, +# testbrhash, fileview, sort_type) +# +# Write a complete file table. OVERVIEW is a reference to a hash containing +# the following mapping: +# +# filename -> "lines_found,lines_hit,funcs_found,funcs_hit,page_link, +# func_link" +# +# TESTHASH is a reference to the following hash: +# +# filename -> \%testdata +# %testdata: name of test affecting this file -> \%testcount +# %testcount: line number -> execution count for a single test +# +# Heading of first column is "Filename" if FILEVIEW is true, "Directory name" +# otherwise. +# + +sub write_file_table(*$$$$$$$) +{ + local *HTML_HANDLE = $_[0]; + my $base_dir = $_[1]; + my $overview = $_[2]; + my $testhash = $_[3]; + my $testfnchash = $_[4]; + my $testbrhash = $_[5]; + my $fileview = $_[6]; + my $sort_type = $_[7]; + my $filename; + my $bar_graph; + my $hit; + my $found; + my $fn_found; + my $fn_hit; + my $br_found; + my $br_hit; + my $page_link; + my $testname; + my $testdata; + my $testfncdata; + my $testbrdata; + my %affecting_tests; + my $line_code = ""; + my $func_code; + my $br_code; + my $file_code; + my @head_columns; + + # Determine HTML code for column headings + if (($base_dir ne "") && $show_details) + { + my $detailed = keys(%{$testhash}); + + $file_code = get_file_code($detailed ? $HEAD_DETAIL_HIDDEN : + $HEAD_NO_DETAIL, + $fileview ? "Filename" : "Directory", + $sort && $sort_type != $SORT_FILE, + $base_dir); + $line_code = get_line_code($detailed ? $HEAD_DETAIL_SHOWN : + $HEAD_DETAIL_HIDDEN, + $sort_type, + "Line Coverage", + $sort && $sort_type != $SORT_LINE, + $base_dir); + $func_code = get_func_code($detailed ? $HEAD_DETAIL_HIDDEN : + $HEAD_NO_DETAIL, + "Functions", + $sort && $sort_type != $SORT_FUNC, + $base_dir); + $br_code = get_br_code($detailed ? $HEAD_DETAIL_HIDDEN : + $HEAD_NO_DETAIL, + "Branches", + $sort && $sort_type != $SORT_BRANCH, + $base_dir); + } else { + $file_code = get_file_code($HEAD_NO_DETAIL, + $fileview ? "Filename" : "Directory", + $sort && $sort_type != $SORT_FILE, + $base_dir); + $line_code = get_line_code($HEAD_NO_DETAIL, $sort_type, "Line Coverage", + $sort && $sort_type != $SORT_LINE, + $base_dir); + $func_code = get_func_code($HEAD_NO_DETAIL, "Functions", + $sort && $sort_type != $SORT_FUNC, + $base_dir); + $br_code = get_br_code($HEAD_NO_DETAIL, "Branches", + $sort && $sort_type != $SORT_BRANCH, + $base_dir); + } + push(@head_columns, [ $line_code, 3 ]); + push(@head_columns, [ $func_code, 2]) if ($func_coverage); + push(@head_columns, [ $br_code, 2]) if ($br_coverage); + + write_file_table_prolog(*HTML_HANDLE, $file_code, @head_columns); + + foreach $filename (get_sorted_keys($overview, $sort_type)) + { + my @columns; + ($found, $hit, $fn_found, $fn_hit, $br_found, $br_hit, + $page_link) = @{$overview->{$filename}}; + + # Line coverage + push(@columns, [$found, $hit, $med_limit, $hi_limit, 1]); + # Function coverage + if ($func_coverage) { + push(@columns, [$fn_found, $fn_hit, $fn_med_limit, + $fn_hi_limit, 0]); + } + # Branch coverage + if ($br_coverage) { + push(@columns, [$br_found, $br_hit, $br_med_limit, + $br_hi_limit, 0]); + } + write_file_table_entry(*HTML_HANDLE, $base_dir, $filename, + $page_link, @columns); + + $testdata = $testhash->{$filename}; + $testfncdata = $testfnchash->{$filename}; + $testbrdata = $testbrhash->{$filename}; + + # Check whether we should write test specific coverage + # as well + if (!($show_details && $testdata)) { next; } + + # Filter out those tests that actually affect this file + %affecting_tests = %{ get_affecting_tests($testdata, + $testfncdata, $testbrdata) }; + + # Does any of the tests affect this file at all? + if (!%affecting_tests) { next; } + + foreach $testname (keys(%affecting_tests)) + { + my @results; + ($found, $hit, $fn_found, $fn_hit, $br_found, $br_hit) = + split(",", $affecting_tests{$testname}); + + # Insert link to description of available + if ($test_description{$testname}) + { + $testname = "". + "$testname"; + } + + push(@results, [$found, $hit]); + push(@results, [$fn_found, $fn_hit]) if ($func_coverage); + push(@results, [$br_found, $br_hit]) if ($br_coverage); + write_file_table_detail_entry(*HTML_HANDLE, $testname, + @results); + } + } + + write_file_table_epilog(*HTML_HANDLE); +} + + +# +# get_found_and_hit(hash) +# +# Return the count for entries (found) and entries with an execution count +# greater than zero (hit) in a hash (linenumber -> execution count) as +# a list (found, hit) +# + +sub get_found_and_hit($) +{ + my %hash = %{$_[0]}; + my $found = 0; + my $hit = 0; + + # Calculate sum + $found = 0; + $hit = 0; + + foreach (keys(%hash)) + { + $found++; + if ($hash{$_}>0) { $hit++; } + } + + return ($found, $hit); +} + + +# +# get_func_found_and_hit(sumfnccount) +# +# Return (f_found, f_hit) for sumfnccount +# + +sub get_func_found_and_hit($) +{ + my ($sumfnccount) = @_; + my $function; + my $fn_found; + my $fn_hit; + + $fn_found = scalar(keys(%{$sumfnccount})); + $fn_hit = 0; + foreach $function (keys(%{$sumfnccount})) { + if ($sumfnccount->{$function} > 0) { + $fn_hit++; + } + } + return ($fn_found, $fn_hit); +} + + +# +# br_taken_to_num(taken) +# +# Convert a branch taken value .info format to number format. +# + +sub br_taken_to_num($) +{ + my ($taken) = @_; + + return 0 if ($taken eq '-'); + return $taken + 1; +} + + +# +# br_num_to_taken(taken) +# +# Convert a branch taken value in number format to .info format. +# + +sub br_num_to_taken($) +{ + my ($taken) = @_; + + return '-' if ($taken == 0); + return $taken - 1; +} + + +# +# br_taken_add(taken1, taken2) +# +# Return the result of taken1 + taken2 for 'branch taken' values. +# + +sub br_taken_add($$) +{ + my ($t1, $t2) = @_; + + return $t1 if (!defined($t2)); + return $t2 if (!defined($t1)); + return $t1 if ($t2 eq '-'); + return $t2 if ($t1 eq '-'); + return $t1 + $t2; +} + + +# +# br_taken_sub(taken1, taken2) +# +# Return the result of taken1 - taken2 for 'branch taken' values. Return 0 +# if the result would become negative. +# + +sub br_taken_sub($$) +{ + my ($t1, $t2) = @_; + + return $t1 if (!defined($t2)); + return undef if (!defined($t1)); + return $t1 if ($t1 eq '-'); + return $t1 if ($t2 eq '-'); + return 0 if $t2 > $t1; + return $t1 - $t2; +} + + +# +# br_ivec_len(vector) +# +# Return the number of entries in the branch coverage vector. +# + +sub br_ivec_len($) +{ + my ($vec) = @_; + + return 0 if (!defined($vec)); + return (length($vec) * 8 / $BR_VEC_WIDTH) / $BR_VEC_ENTRIES; +} + + +# +# br_ivec_get(vector, number) +# +# Return an entry from the branch coverage vector. +# + +sub br_ivec_get($$) +{ + my ($vec, $num) = @_; + my $block; + my $branch; + my $taken; + my $offset = $num * $BR_VEC_ENTRIES; + + # Retrieve data from vector + $block = vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH); + $block = -1 if ($block == $BR_VEC_MAX); + $branch = vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH); + $taken = vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH); + + # Decode taken value from an integer + $taken = br_num_to_taken($taken); + + return ($block, $branch, $taken); +} + + +# +# br_ivec_push(vector, block, branch, taken) +# +# Add an entry to the branch coverage vector. If an entry with the same +# branch ID already exists, add the corresponding taken values. +# + +sub br_ivec_push($$$$) +{ + my ($vec, $block, $branch, $taken) = @_; + my $offset; + my $num = br_ivec_len($vec); + my $i; + + $vec = "" if (!defined($vec)); + $block = $BR_VEC_MAX if $block < 0; + + # Check if branch already exists in vector + for ($i = 0; $i < $num; $i++) { + my ($v_block, $v_branch, $v_taken) = br_ivec_get($vec, $i); + $v_block = $BR_VEC_MAX if $v_block < 0; + + next if ($v_block != $block || $v_branch != $branch); + + # Add taken counts + $taken = br_taken_add($taken, $v_taken); + last; + } + + $offset = $i * $BR_VEC_ENTRIES; + $taken = br_taken_to_num($taken); + + # Add to vector + vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH) = $block; + vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH) = $branch; + vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH) = $taken; + + return $vec; +} + + +# +# get_br_found_and_hit(sumbrcount) +# +# Return (br_found, br_hit) for sumbrcount +# + +sub get_br_found_and_hit($) +{ + my ($sumbrcount) = @_; + my $line; + my $br_found = 0; + my $br_hit = 0; + + foreach $line (keys(%{$sumbrcount})) { + my $brdata = $sumbrcount->{$line}; + my $i; + my $num = br_ivec_len($brdata); + + for ($i = 0; $i < $num; $i++) { + my $taken; + + (undef, undef, $taken) = br_ivec_get($brdata, $i); + + $br_found++; + $br_hit++ if ($taken ne "-" && $taken > 0); + } + } + + return ($br_found, $br_hit); +} + + +# +# get_affecting_tests(testdata, testfncdata, testbrdata) +# +# HASHREF contains a mapping filename -> (linenumber -> exec count). Return +# a hash containing mapping filename -> "lines found, lines hit" for each +# filename which has a nonzero hit count. +# + +sub get_affecting_tests($$$) +{ + my ($testdata, $testfncdata, $testbrdata) = @_; + my $testname; + my $testcount; + my $testfnccount; + my $testbrcount; + my %result; + my $found; + my $hit; + my $fn_found; + my $fn_hit; + my $br_found; + my $br_hit; + + foreach $testname (keys(%{$testdata})) + { + # Get (line number -> count) hash for this test case + $testcount = $testdata->{$testname}; + $testfnccount = $testfncdata->{$testname}; + $testbrcount = $testbrdata->{$testname}; + + # Calculate sum + ($found, $hit) = get_found_and_hit($testcount); + ($fn_found, $fn_hit) = get_func_found_and_hit($testfnccount); + ($br_found, $br_hit) = get_br_found_and_hit($testbrcount); + + if ($hit>0) + { + $result{$testname} = "$found,$hit,$fn_found,$fn_hit,". + "$br_found,$br_hit"; + } + } + + return(\%result); +} + + +sub get_hash_reverse($) +{ + my ($hash) = @_; + my %result; + + foreach (keys(%{$hash})) { + $result{$hash->{$_}} = $_; + } + + return \%result; +} + +# +# write_source(filehandle, source_filename, count_data, checksum_data, +# converted_data, func_data, sumbrcount) +# +# Write an HTML view of a source code file. Returns a list containing +# data as needed by gen_png(). +# +# Die on error. +# + +sub write_source($$$$$$$) +{ + local *HTML_HANDLE = $_[0]; + local *SOURCE_HANDLE; + my $source_filename = $_[1]; + my %count_data; + my $line_number; + my @result; + my $checkdata = $_[3]; + my $converted = $_[4]; + my $funcdata = $_[5]; + my $sumbrcount = $_[6]; + my $datafunc = get_hash_reverse($funcdata); + my $add_anchor; + my @file; + + if ($_[2]) + { + %count_data = %{$_[2]}; + } + + if (!open(SOURCE_HANDLE, "<", $source_filename)) { + my @lines; + my $last_line = 0; + + if (!$ignore[$ERROR_SOURCE]) { + die("ERROR: cannot read $source_filename\n"); + } + + # Continue without source file + warn("WARNING: cannot read $source_filename!\n"); + + @lines = sort( { $a <=> $b } keys(%count_data)); + if (@lines) { + $last_line = $lines[scalar(@lines) - 1]; + } + return ( ":" ) if ($last_line < 1); + + # Simulate gcov behavior + for ($line_number = 1; $line_number <= $last_line; + $line_number++) { + push(@file, "/* EOF */"); + } + } else { + @file = ; + } + + write_source_prolog(*HTML_HANDLE); + $line_number = 0; + foreach (@file) { + $line_number++; + chomp($_); + + # Also remove CR from line-end + s/\015$//; + + # Source code matches coverage data? + if (defined($checkdata->{$line_number}) && + ($checkdata->{$line_number} ne md5_base64($_))) + { + die("ERROR: checksum mismatch at $source_filename:". + "$line_number\n"); + } + + $add_anchor = 0; + if ($frames) { + if (($line_number - 1) % $nav_resolution == 0) { + $add_anchor = 1; + } + } + if ($func_coverage) { + if ($line_number == 1) { + $add_anchor = 1; + } elsif (defined($datafunc->{$line_number + + $func_offset})) { + $add_anchor = 1; + } + } + push (@result, + write_source_line(HTML_HANDLE, $line_number, + $_, $count_data{$line_number}, + $converted->{$line_number}, + $sumbrcount->{$line_number}, $add_anchor)); + } + + close(SOURCE_HANDLE); + write_source_epilog(*HTML_HANDLE); + return(@result); +} + + +sub funcview_get_func_code($$$) +{ + my ($name, $base, $type) = @_; + my $result; + my $link; + + if ($sort && $type == 1) { + $link = "$name.func.$html_ext"; + } + $result = "Function Name"; + $result .= get_sort_code($link, "Sort by function name", $base); + + return $result; +} + +sub funcview_get_count_code($$$) +{ + my ($name, $base, $type) = @_; + my $result; + my $link; + + if ($sort && $type == 0) { + $link = "$name.func-sort-c.$html_ext"; + } + $result = "Hit count"; + $result .= get_sort_code($link, "Sort by hit count", $base); + + return $result; +} + +# +# funcview_get_sorted(funcdata, sumfncdata, sort_type) +# +# Depending on the value of sort_type, return a list of functions sorted +# by name (type 0) or by the associated call count (type 1). +# + +sub funcview_get_sorted($$$) +{ + my ($funcdata, $sumfncdata, $type) = @_; + + if ($type == 0) { + return sort(keys(%{$funcdata})); + } + return sort({ + $sumfncdata->{$b} == $sumfncdata->{$a} ? + $a cmp $b : $sumfncdata->{$a} <=> $sumfncdata->{$b} + } keys(%{$sumfncdata})); +} + +# +# write_function_table(filehandle, source_file, sumcount, funcdata, +# sumfnccount, testfncdata, sumbrcount, testbrdata, +# base_name, base_dir, sort_type) +# +# Write an HTML table listing all functions in a source file, including +# also function call counts and line coverages inside of each function. +# +# Die on error. +# + +sub write_function_table(*$$$$$$$$$$) +{ + local *HTML_HANDLE = $_[0]; + my $source = $_[1]; + my $sumcount = $_[2]; + my $funcdata = $_[3]; + my $sumfncdata = $_[4]; + my $testfncdata = $_[5]; + my $sumbrcount = $_[6]; + my $testbrdata = $_[7]; + my $name = $_[8]; + my $base = $_[9]; + my $type = $_[10]; + my $func; + my $func_code; + my $count_code; + + # Get HTML code for headings + $func_code = funcview_get_func_code($name, $base, $type); + $count_code = funcview_get_count_code($name, $base, $type); + write_html(*HTML_HANDLE, < + + + + + + +END_OF_HTML + ; + + # Get a sorted table + foreach $func (funcview_get_sorted($funcdata, $sumfncdata, $type)) { + if (!defined($funcdata->{$func})) + { + next; + } + + my $startline = $funcdata->{$func} - $func_offset; + my $name = $func; + my $count = $sumfncdata->{$name}; + my $countstyle; + + # Escape special characters + $name = escape_html($name); + if ($startline < 1) { + $startline = 1; + } + if ($count == 0) { + $countstyle = "coverFnLo"; + } else { + $countstyle = "coverFnHi"; + } + + write_html(*HTML_HANDLE, < + + + +END_OF_HTML + ; + } + write_html(*HTML_HANDLE, < +
+ +END_OF_HTML + ; +} + + +# +# info(printf_parameter) +# +# Use printf to write PRINTF_PARAMETER to stdout only when the $quiet flag +# is not set. +# + +sub info(@) +{ + if (!$quiet) + { + # Print info string + printf(@_); + } +} + + +# +# subtract_counts(data_ref, base_ref) +# + +sub subtract_counts($$) +{ + my %data = %{$_[0]}; + my %base = %{$_[1]}; + my $line; + my $data_count; + my $base_count; + my $hit = 0; + my $found = 0; + + foreach $line (keys(%data)) + { + $found++; + $data_count = $data{$line}; + $base_count = $base{$line}; + + if (defined($base_count)) + { + $data_count -= $base_count; + + # Make sure we don't get negative numbers + if ($data_count<0) { $data_count = 0; } + } + + $data{$line} = $data_count; + if ($data_count > 0) { $hit++; } + } + + return (\%data, $found, $hit); +} + + +# +# subtract_fnccounts(data, base) +# +# Subtract function call counts found in base from those in data. +# Return (data, f_found, f_hit). +# + +sub subtract_fnccounts($$) +{ + my %data; + my %base; + my $func; + my $data_count; + my $base_count; + my $fn_hit = 0; + my $fn_found = 0; + + %data = %{$_[0]} if (defined($_[0])); + %base = %{$_[1]} if (defined($_[1])); + foreach $func (keys(%data)) { + $fn_found++; + $data_count = $data{$func}; + $base_count = $base{$func}; + + if (defined($base_count)) { + $data_count -= $base_count; + + # Make sure we don't get negative numbers + if ($data_count < 0) { + $data_count = 0; + } + } + + $data{$func} = $data_count; + if ($data_count > 0) { + $fn_hit++; + } + } + + return (\%data, $fn_found, $fn_hit); +} + + +# +# apply_baseline(data_ref, baseline_ref) +# +# Subtract the execution counts found in the baseline hash referenced by +# BASELINE_REF from actual data in DATA_REF. +# + +sub apply_baseline($$) +{ + my %data_hash = %{$_[0]}; + my %base_hash = %{$_[1]}; + my $filename; + my $testname; + my $data; + my $data_testdata; + my $data_funcdata; + my $data_checkdata; + my $data_testfncdata; + my $data_testbrdata; + my $data_count; + my $data_testfnccount; + my $data_testbrcount; + my $base; + my $base_checkdata; + my $base_sumfnccount; + my $base_sumbrcount; + my $base_count; + my $sumcount; + my $sumfnccount; + my $sumbrcount; + my $found; + my $hit; + my $fn_found; + my $fn_hit; + my $br_found; + my $br_hit; + + foreach $filename (keys(%data_hash)) + { + # Get data set for data and baseline + $data = $data_hash{$filename}; + $base = $base_hash{$filename}; + + # Skip data entries for which no base entry exists + if (!defined($base)) + { + next; + } + + # Get set entries for data and baseline + ($data_testdata, undef, $data_funcdata, $data_checkdata, + $data_testfncdata, undef, $data_testbrdata) = + get_info_entry($data); + (undef, $base_count, undef, $base_checkdata, undef, + $base_sumfnccount, undef, $base_sumbrcount) = + get_info_entry($base); + + # Check for compatible checksums + merge_checksums($data_checkdata, $base_checkdata, $filename); + + # sumcount has to be calculated anew + $sumcount = {}; + $sumfnccount = {}; + $sumbrcount = {}; + + # For each test case, subtract test specific counts + foreach $testname (keys(%{$data_testdata})) + { + # Get counts of both data and baseline + $data_count = $data_testdata->{$testname}; + $data_testfnccount = $data_testfncdata->{$testname}; + $data_testbrcount = $data_testbrdata->{$testname}; + + ($data_count, undef, $hit) = + subtract_counts($data_count, $base_count); + ($data_testfnccount) = + subtract_fnccounts($data_testfnccount, + $base_sumfnccount); + ($data_testbrcount) = + combine_brcount($data_testbrcount, + $base_sumbrcount, $BR_SUB); + + + # Check whether this test case did hit any line at all + if ($hit > 0) + { + # Write back resulting hash + $data_testdata->{$testname} = $data_count; + $data_testfncdata->{$testname} = + $data_testfnccount; + $data_testbrdata->{$testname} = + $data_testbrcount; + } + else + { + # Delete test case which did not impact this + # file + delete($data_testdata->{$testname}); + delete($data_testfncdata->{$testname}); + delete($data_testbrdata->{$testname}); + } + + # Add counts to sum of counts + ($sumcount, $found, $hit) = + add_counts($sumcount, $data_count); + ($sumfnccount, $fn_found, $fn_hit) = + add_fnccount($sumfnccount, $data_testfnccount); + ($sumbrcount, $br_found, $br_hit) = + combine_brcount($sumbrcount, $data_testbrcount, + $BR_ADD); + } + + # Write back resulting entry + set_info_entry($data, $data_testdata, $sumcount, $data_funcdata, + $data_checkdata, $data_testfncdata, $sumfnccount, + $data_testbrdata, $sumbrcount, $found, $hit, + $fn_found, $fn_hit, $br_found, $br_hit); + + $data_hash{$filename} = $data; + } + + return (\%data_hash); +} + + +# +# remove_unused_descriptions() +# +# Removes all test descriptions from the global hash %test_description which +# are not present in %info_data. +# + +sub remove_unused_descriptions() +{ + my $filename; # The current filename + my %test_list; # Hash containing found test names + my $test_data; # Reference to hash test_name -> count_data + my $before; # Initial number of descriptions + my $after; # Remaining number of descriptions + + $before = scalar(keys(%test_description)); + + foreach $filename (keys(%info_data)) + { + ($test_data) = get_info_entry($info_data{$filename}); + foreach (keys(%{$test_data})) + { + $test_list{$_} = ""; + } + } + + # Remove descriptions for tests which are not in our list + foreach (keys(%test_description)) + { + if (!defined($test_list{$_})) + { + delete($test_description{$_}); + } + } + + $after = scalar(keys(%test_description)); + if ($after < $before) + { + info("Removed ".($before - $after). + " unused descriptions, $after remaining.\n"); + } +} + + +# +# apply_prefix(filename, prefix) +# +# If FILENAME begins with PREFIX, remove PREFIX from FILENAME and return +# resulting string, otherwise return FILENAME. +# + +sub apply_prefix($$) +{ + my $filename = $_[0]; + my $prefix = $_[1]; + + if (defined($prefix) && ($prefix ne "")) + { + if ($filename =~ /^\Q$prefix\E\/(.*)$/) + { + return substr($filename, length($prefix) + 1); + } + } + + return $filename; +} + + +# +# system_no_output(mode, parameters) +# +# Call an external program using PARAMETERS while suppressing depending on +# the value of MODE: +# +# MODE & 1: suppress STDOUT +# MODE & 2: suppress STDERR +# +# Return 0 on success, non-zero otherwise. +# + +sub system_no_output($@) +{ + my $mode = shift; + my $result; + local *OLD_STDERR; + local *OLD_STDOUT; + + # Save old stdout and stderr handles + ($mode & 1) && open(OLD_STDOUT, ">>&", "STDOUT"); + ($mode & 2) && open(OLD_STDERR, ">>&", "STDERR"); + + # Redirect to /dev/null + ($mode & 1) && open(STDOUT, ">", "/dev/null"); + ($mode & 2) && open(STDERR, ">", "/dev/null"); + + system(@_); + $result = $?; + + # Close redirected handles + ($mode & 1) && close(STDOUT); + ($mode & 2) && close(STDERR); + + # Restore old handles + ($mode & 1) && open(STDOUT, ">>&", "OLD_STDOUT"); + ($mode & 2) && open(STDERR, ">>&", "OLD_STDERR"); + + return $result; +} + + +# +# read_config(filename) +# +# Read configuration file FILENAME and return a reference to a hash containing +# all valid key=value pairs found. +# + +sub read_config($) +{ + my $filename = $_[0]; + my %result; + my $key; + my $value; + local *HANDLE; + + if (!open(HANDLE, "<", $filename)) + { + warn("WARNING: cannot read configuration file $filename\n"); + return undef; + } + while () + { + chomp; + # Skip comments + s/#.*//; + # Remove leading blanks + s/^\s+//; + # Remove trailing blanks + s/\s+$//; + next unless length; + ($key, $value) = split(/\s*=\s*/, $_, 2); + if (defined($key) && defined($value)) + { + $result{$key} = $value; + } + else + { + warn("WARNING: malformed statement in line $. ". + "of configuration file $filename\n"); + } + } + close(HANDLE); + return \%result; +} + + +# +# apply_config(REF) +# +# REF is a reference to a hash containing the following mapping: +# +# key_string => var_ref +# +# where KEY_STRING is a keyword and VAR_REF is a reference to an associated +# variable. If the global configuration hashes CONFIG or OPT_RC contain a value +# for keyword KEY_STRING, VAR_REF will be assigned the value for that keyword. +# + +sub apply_config($) +{ + my $ref = $_[0]; + + foreach (keys(%{$ref})) + { + if (defined($opt_rc{$_})) { + ${$ref->{$_}} = $opt_rc{$_}; + } elsif (defined($config->{$_})) { + ${$ref->{$_}} = $config->{$_}; + } + } +} + + +# +# get_html_prolog(FILENAME) +# +# If FILENAME is defined, return contents of file. Otherwise return default +# HTML prolog. Die on error. +# + +sub get_html_prolog($) +{ + my $filename = $_[0]; + my $result = ""; + + if (defined($filename)) + { + local *HANDLE; + + open(HANDLE, "<", $filename) + or die("ERROR: cannot open html prolog $filename!\n"); + while () + { + $result .= $_; + } + close(HANDLE); + } + else + { + $result = < + + + + + + \@pagetitle\@ + + + + + +END_OF_HTML + ; + } + + return $result; +} + + +# +# get_html_epilog(FILENAME) +# +# If FILENAME is defined, return contents of file. Otherwise return default +# HTML epilog. Die on error. +# +sub get_html_epilog($) +{ + my $filename = $_[0]; + my $result = ""; + + if (defined($filename)) + { + local *HANDLE; + + open(HANDLE, "<", $filename) + or die("ERROR: cannot open html epilog $filename!\n"); + while () + { + $result .= $_; + } + close(HANDLE); + } + else + { + $result = < + +END_OF_HTML + ; + } + + return $result; + +} + +sub warn_handler($) +{ + my ($msg) = @_; + + warn("$tool_name: $msg"); +} + +sub die_handler($) +{ + my ($msg) = @_; + + die("$tool_name: $msg"); +} + +# +# parse_ignore_errors(@ignore_errors) +# +# Parse user input about which errors to ignore. +# + +sub parse_ignore_errors(@) +{ + my (@ignore_errors) = @_; + my @items; + my $item; + + return if (!@ignore_errors); + + foreach $item (@ignore_errors) { + $item =~ s/\s//g; + if ($item =~ /,/) { + # Split and add comma-separated parameters + push(@items, split(/,/, $item)); + } else { + # Add single parameter + push(@items, $item); + } + } + foreach $item (@items) { + my $item_id = $ERROR_ID{lc($item)}; + + if (!defined($item_id)) { + die("ERROR: unknown argument for --ignore-errors: ". + "$item\n"); + } + $ignore[$item_id] = 1; + } +} + +# +# rate(hit, found[, suffix, precision, width]) +# +# Return the coverage rate [0..100] for HIT and FOUND values. 0 is only +# returned when HIT is 0. 100 is only returned when HIT equals FOUND. +# PRECISION specifies the precision of the result. SUFFIX defines a +# string that is appended to the result if FOUND is non-zero. Spaces +# are added to the start of the resulting string until it is at least WIDTH +# characters wide. +# + +sub rate($$;$$$) +{ + my ($hit, $found, $suffix, $precision, $width) = @_; + my $rate; + + # Assign defaults if necessary + $precision = 1 if (!defined($precision)); + $suffix = "" if (!defined($suffix)); + $width = 0 if (!defined($width)); + + return sprintf("%*s", $width, "-") if (!defined($found) || $found == 0); + $rate = sprintf("%.*f", $precision, $hit * 100 / $found); + + # Adjust rates if necessary + if ($rate == 0 && $hit > 0) { + $rate = sprintf("%.*f", $precision, 1 / 10 ** $precision); + } elsif ($rate == 100 && $hit != $found) { + $rate = sprintf("%.*f", $precision, 100 - 1 / 10 ** $precision); + } + + return sprintf("%*s", $width, $rate.$suffix); +} diff --git a/utils/lcov-1.11/bin/geninfo b/utils/lcov-1.11/bin/geninfo new file mode 100755 index 00000000..1f029632 --- /dev/null +++ b/utils/lcov-1.11/bin/geninfo @@ -0,0 +1,3755 @@ +#!/usr/bin/perl -w +# +# Copyright (c) International Business Machines Corp., 2002,2012 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# geninfo +# +# This script generates .info files from data files as created by code +# instrumented with gcc's built-in profiling mechanism. Call it with +# --help and refer to the geninfo man page to get information on usage +# and available options. +# +# +# Authors: +# 2002-08-23 created by Peter Oberparleiter +# IBM Lab Boeblingen +# based on code by Manoj Iyer and +# Megan Bock +# IBM Austin +# 2002-09-05 / Peter Oberparleiter: implemented option that allows file list +# 2003-04-16 / Peter Oberparleiter: modified read_gcov so that it can also +# parse the new gcov format which is to be introduced in gcc 3.3 +# 2003-04-30 / Peter Oberparleiter: made info write to STDERR, not STDOUT +# 2003-07-03 / Peter Oberparleiter: added line checksum support, added +# --no-checksum +# 2003-09-18 / Nigel Hinds: capture branch coverage data from GCOV +# 2003-12-11 / Laurent Deniel: added --follow option +# workaround gcov (<= 3.2.x) bug with empty .da files +# 2004-01-03 / Laurent Deniel: Ignore empty .bb files +# 2004-02-16 / Andreas Krebbel: Added support for .gcno/.gcda files and +# gcov versioning +# 2004-08-09 / Peter Oberparleiter: added configuration file support +# 2008-07-14 / Tom Zoerner: added --function-coverage command line option +# 2008-08-13 / Peter Oberparleiter: modified function coverage +# implementation (now enabled per default) +# + +use strict; +use File::Basename; +use File::Spec::Functions qw /abs2rel catdir file_name_is_absolute splitdir + splitpath catpath/; +use Getopt::Long; +use Digest::MD5 qw(md5_base64); +if( $^O eq "msys" ) +{ + require File::Spec::Win32; +} + +# Constants +our $lcov_version = 'LCOV version 1.11'; +our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; +our $gcov_tool = "gcov"; +our $tool_name = basename($0); + +our $GCOV_VERSION_4_7_0 = 0x40700; +our $GCOV_VERSION_3_4_0 = 0x30400; +our $GCOV_VERSION_3_3_0 = 0x30300; +our $GCNO_FUNCTION_TAG = 0x01000000; +our $GCNO_LINES_TAG = 0x01450000; +our $GCNO_FILE_MAGIC = 0x67636e6f; +our $BBG_FILE_MAGIC = 0x67626267; + +# Error classes which users may specify to ignore during processing +our $ERROR_GCOV = 0; +our $ERROR_SOURCE = 1; +our $ERROR_GRAPH = 2; +our %ERROR_ID = ( + "gcov" => $ERROR_GCOV, + "source" => $ERROR_SOURCE, + "graph" => $ERROR_GRAPH, +); + +our $EXCL_START = "LCOV_EXCL_START"; +our $EXCL_STOP = "LCOV_EXCL_STOP"; +our $EXCL_LINE = "LCOV_EXCL_LINE"; + +# Marker to exclude branch coverage but keep function and line coveage +our $EXCL_BR_START = "LCOV_EXCL_BR_START"; +our $EXCL_BR_STOP = "LCOV_EXCL_BR_STOP"; +our $EXCL_BR_LINE = "LCOV_EXCL_BR_LINE"; + +# Compatibility mode values +our $COMPAT_VALUE_OFF = 0; +our $COMPAT_VALUE_ON = 1; +our $COMPAT_VALUE_AUTO = 2; + +# Compatibility mode value names +our %COMPAT_NAME_TO_VALUE = ( + "off" => $COMPAT_VALUE_OFF, + "on" => $COMPAT_VALUE_ON, + "auto" => $COMPAT_VALUE_AUTO, +); + +# Compatiblity modes +our $COMPAT_MODE_LIBTOOL = 1 << 0; +our $COMPAT_MODE_HAMMER = 1 << 1; +our $COMPAT_MODE_SPLIT_CRC = 1 << 2; + +# Compatibility mode names +our %COMPAT_NAME_TO_MODE = ( + "libtool" => $COMPAT_MODE_LIBTOOL, + "hammer" => $COMPAT_MODE_HAMMER, + "split_crc" => $COMPAT_MODE_SPLIT_CRC, + "android_4_4_0" => $COMPAT_MODE_SPLIT_CRC, +); + +# Map modes to names +our %COMPAT_MODE_TO_NAME = ( + $COMPAT_MODE_LIBTOOL => "libtool", + $COMPAT_MODE_HAMMER => "hammer", + $COMPAT_MODE_SPLIT_CRC => "split_crc", +); + +# Compatibility mode default values +our %COMPAT_MODE_DEFAULTS = ( + $COMPAT_MODE_LIBTOOL => $COMPAT_VALUE_ON, + $COMPAT_MODE_HAMMER => $COMPAT_VALUE_AUTO, + $COMPAT_MODE_SPLIT_CRC => $COMPAT_VALUE_AUTO, +); + +# Compatibility mode auto-detection routines +sub compat_hammer_autodetect(); +our %COMPAT_MODE_AUTO = ( + $COMPAT_MODE_HAMMER => \&compat_hammer_autodetect, + $COMPAT_MODE_SPLIT_CRC => 1, # will be done later +); + +our $BR_LINE = 0; +our $BR_BLOCK = 1; +our $BR_BRANCH = 2; +our $BR_TAKEN = 3; +our $BR_VEC_ENTRIES = 4; +our $BR_VEC_WIDTH = 32; +our $BR_VEC_MAX = vec(pack('b*', 1 x $BR_VEC_WIDTH), 0, $BR_VEC_WIDTH); + +our $UNNAMED_BLOCK = -1; + +# Prototypes +sub print_usage(*); +sub gen_info($); +sub process_dafile($$); +sub match_filename($@); +sub solve_ambiguous_match($$$); +sub split_filename($); +sub solve_relative_path($$); +sub read_gcov_header($); +sub read_gcov_file($); +sub info(@); +sub get_gcov_version(); +sub system_no_output($@); +sub read_config($); +sub apply_config($); +sub get_exclusion_data($); +sub apply_exclusion_data($$); +sub process_graphfile($$); +sub filter_fn_name($); +sub warn_handler($); +sub die_handler($); +sub graph_error($$); +sub graph_expect($); +sub graph_read(*$;$$); +sub graph_skip(*$;$); +sub sort_uniq(@); +sub sort_uniq_lex(@); +sub graph_cleanup($); +sub graph_find_base($); +sub graph_from_bb($$$); +sub graph_add_order($$$); +sub read_bb_word(*;$); +sub read_bb_value(*;$); +sub read_bb_string(*$); +sub read_bb($); +sub read_bbg_word(*;$); +sub read_bbg_value(*;$); +sub read_bbg_string(*); +sub read_bbg_lines_record(*$$$$$); +sub read_bbg($); +sub read_gcno_word(*;$$); +sub read_gcno_value(*$;$$); +sub read_gcno_string(*$); +sub read_gcno_lines_record(*$$$$$$); +sub determine_gcno_split_crc($$$); +sub read_gcno_function_record(*$$$$); +sub read_gcno($); +sub get_gcov_capabilities(); +sub get_overall_line($$$$); +sub print_overall_rate($$$$$$$$$); +sub br_gvec_len($); +sub br_gvec_get($$); +sub debug($); +sub int_handler(); +sub parse_ignore_errors(@); +sub is_external($); +sub compat_name($); +sub parse_compat_modes($); +sub is_compat($); +sub is_compat_auto($); + + +# Global variables +our $gcov_version; +our $gcov_version_string; +our $graph_file_extension; +our $data_file_extension; +our @data_directory; +our $test_name = ""; +our $quiet; +our $help; +our $output_filename; +our $base_directory; +our $version; +our $follow; +our $checksum; +our $no_checksum; +our $opt_compat_libtool; +our $opt_no_compat_libtool; +our $rc_adjust_src_path;# Regexp specifying parts to remove from source path +our $adjust_src_pattern; +our $adjust_src_replace; +our $adjust_testname; +our $config; # Configuration file contents +our @ignore_errors; # List of errors to ignore (parameter) +our @ignore; # List of errors to ignore (array) +our $initial; +our $no_recursion = 0; +our $maxdepth; +our $no_markers = 0; +our $opt_derive_func_data = 0; +our $opt_external = 1; +our $opt_no_external; +our $debug = 0; +our $gcov_caps; +our @gcov_options; +our @internal_dirs; +our $opt_config_file; +our $opt_gcov_all_blocks = 1; +our $opt_compat; +our %opt_rc; +our %compat_value; +our $gcno_split_crc; +our $func_coverage = 1; +our $br_coverage = 0; +our $rc_auto_base = 1; + +our $cwd = `pwd`; +chomp($cwd); + + +# +# Code entry point +# + +# Register handler routine to be called when interrupted +$SIG{"INT"} = \&int_handler; +$SIG{__WARN__} = \&warn_handler; +$SIG{__DIE__} = \&die_handler; + +# Prettify version string +$lcov_version =~ s/\$\s*Revision\s*:?\s*(\S+)\s*\$/$1/; + +# Set LC_ALL so that gcov output will be in a unified format +$ENV{"LC_ALL"} = "C"; + +# Check command line for a configuration file name +Getopt::Long::Configure("pass_through", "no_auto_abbrev"); +GetOptions("config-file=s" => \$opt_config_file, + "rc=s%" => \%opt_rc); +Getopt::Long::Configure("default"); + +# Remove spaces around rc options +while (my ($key, $value) = each(%opt_rc)) { + delete($opt_rc{$key}); + + $key =~ s/^\s+|\s+$//g; + $value =~ s/^\s+|\s+$//g; + + $opt_rc{$key} = $value; +} + +# Read configuration file if available +if (defined($opt_config_file)) { + $config = read_config($opt_config_file); +} elsif (defined($ENV{"HOME"}) && (-r $ENV{"HOME"}."/.lcovrc")) +{ + $config = read_config($ENV{"HOME"}."/.lcovrc"); +} +elsif (-r "/etc/lcovrc") +{ + $config = read_config("/etc/lcovrc"); +} + +if ($config || %opt_rc) +{ + # Copy configuration file and --rc values to variables + apply_config({ + "geninfo_gcov_tool" => \$gcov_tool, + "geninfo_adjust_testname" => \$adjust_testname, + "geninfo_checksum" => \$checksum, + "geninfo_no_checksum" => \$no_checksum, # deprecated + "geninfo_compat_libtool" => \$opt_compat_libtool, + "geninfo_external" => \$opt_external, + "geninfo_gcov_all_blocks" => \$opt_gcov_all_blocks, + "geninfo_compat" => \$opt_compat, + "geninfo_adjust_src_path" => \$rc_adjust_src_path, + "geninfo_auto_base" => \$rc_auto_base, + "lcov_function_coverage" => \$func_coverage, + "lcov_branch_coverage" => \$br_coverage, + }); + + # Merge options + if (defined($no_checksum)) + { + $checksum = ($no_checksum ? 0 : 1); + $no_checksum = undef; + } + + # Check regexp + if (defined($rc_adjust_src_path)) { + my ($pattern, $replace) = split(/\s*=>\s*/, + $rc_adjust_src_path); + local $SIG{__DIE__}; + eval '$adjust_src_pattern = qr>'.$pattern.'>;'; + if (!defined($adjust_src_pattern)) { + my $msg = $@; + + chomp($msg); + $msg =~ s/at \(eval.*$//; + warn("WARNING: invalid pattern in ". + "geninfo_adjust_src_path: $msg\n"); + } elsif (!defined($replace)) { + # If no replacement is specified, simply remove pattern + $adjust_src_replace = ""; + } else { + $adjust_src_replace = $replace; + } + } +} + +# Parse command line options +if (!GetOptions("test-name|t=s" => \$test_name, + "output-filename|o=s" => \$output_filename, + "checksum" => \$checksum, + "no-checksum" => \$no_checksum, + "base-directory|b=s" => \$base_directory, + "version|v" =>\$version, + "quiet|q" => \$quiet, + "help|h|?" => \$help, + "follow|f" => \$follow, + "compat-libtool" => \$opt_compat_libtool, + "no-compat-libtool" => \$opt_no_compat_libtool, + "gcov-tool=s" => \$gcov_tool, + "ignore-errors=s" => \@ignore_errors, + "initial|i" => \$initial, + "no-recursion" => \$no_recursion, + "no-markers" => \$no_markers, + "derive-func-data" => \$opt_derive_func_data, + "debug" => \$debug, + "external" => \$opt_external, + "no-external" => \$opt_no_external, + "compat=s" => \$opt_compat, + "config-file=s" => \$opt_config_file, + "rc=s%" => \%opt_rc, + )) +{ + print(STDERR "Use $tool_name --help to get usage information\n"); + exit(1); +} +else +{ + # Merge options + if (defined($no_checksum)) + { + $checksum = ($no_checksum ? 0 : 1); + $no_checksum = undef; + } + + if (defined($opt_no_compat_libtool)) + { + $opt_compat_libtool = ($opt_no_compat_libtool ? 0 : 1); + $opt_no_compat_libtool = undef; + } + + if (defined($opt_no_external)) { + $opt_external = 0; + $opt_no_external = undef; + } +} + +@data_directory = @ARGV; + +# Check for help option +if ($help) +{ + print_usage(*STDOUT); + exit(0); +} + +# Check for version option +if ($version) +{ + print("$tool_name: $lcov_version\n"); + exit(0); +} + +# Check gcov tool +if (system_no_output(3, $gcov_tool, "--help") == -1) +{ + die("ERROR: need tool $gcov_tool!\n"); +} + +($gcov_version, $gcov_version_string) = get_gcov_version(); + +# Determine gcov options +$gcov_caps = get_gcov_capabilities(); +push(@gcov_options, "-b") if ($gcov_caps->{'branch-probabilities'} && + ($br_coverage || $func_coverage)); +push(@gcov_options, "-c") if ($gcov_caps->{'branch-counts'} && + $br_coverage); +push(@gcov_options, "-a") if ($gcov_caps->{'all-blocks'} && + $opt_gcov_all_blocks && $br_coverage); +push(@gcov_options, "-p") if ($gcov_caps->{'preserve-paths'}); + +# Determine compatibility modes +parse_compat_modes($opt_compat); + +# Determine which errors the user wants us to ignore +parse_ignore_errors(@ignore_errors); + +# Make sure test names only contain valid characters +if ($test_name =~ s/\W/_/g) +{ + warn("WARNING: invalid characters removed from testname!\n"); +} + +# Adjust test name to include uname output if requested +if ($adjust_testname) +{ + $test_name .= "__".`uname -a`; + $test_name =~ s/\W/_/g; +} + +# Make sure base_directory contains an absolute path specification +if ($base_directory) +{ + $base_directory = solve_relative_path($cwd, $base_directory); +} + +# Check for follow option +if ($follow) +{ + $follow = "-follow" +} +else +{ + $follow = ""; +} + +# Determine checksum mode +if (defined($checksum)) +{ + # Normalize to boolean + $checksum = ($checksum ? 1 : 0); +} +else +{ + # Default is off + $checksum = 0; +} + +# Determine max depth for recursion +if ($no_recursion) +{ + $maxdepth = "-maxdepth 1"; +} +else +{ + $maxdepth = ""; +} + +# Check for directory name +if (!@data_directory) +{ + die("No directory specified\n". + "Use $tool_name --help to get usage information\n"); +} +else +{ + foreach (@data_directory) + { + stat($_); + if (!-r _) + { + die("ERROR: cannot read $_!\n"); + } + } +} + +if ($gcov_version < $GCOV_VERSION_3_4_0) +{ + if (is_compat($COMPAT_MODE_HAMMER)) + { + $data_file_extension = ".da"; + $graph_file_extension = ".bbg"; + } + else + { + $data_file_extension = ".da"; + $graph_file_extension = ".bb"; + } +} +else +{ + $data_file_extension = ".gcda"; + $graph_file_extension = ".gcno"; +} + +# Check output filename +if (defined($output_filename) && ($output_filename ne "-")) +{ + # Initially create output filename, data is appended + # for each data file processed + local *DUMMY_HANDLE; + open(DUMMY_HANDLE, ">", $output_filename) + or die("ERROR: cannot create $output_filename!\n"); + close(DUMMY_HANDLE); + + # Make $output_filename an absolute path because we're going + # to change directories while processing files + if (!($output_filename =~ /^\/(.*)$/)) + { + $output_filename = $cwd."/".$output_filename; + } +} + +# Build list of directories to identify external files +foreach my $entry(@data_directory, $base_directory) { + next if (!defined($entry)); + push(@internal_dirs, solve_relative_path($cwd, $entry)); +} + +# Do something +foreach my $entry (@data_directory) { + gen_info($entry); +} + +if ($initial && $br_coverage) { + warn("Note: --initial does not generate branch coverage ". + "data\n"); +} +info("Finished .info-file creation\n"); + +exit(0); + + + +# +# print_usage(handle) +# +# Print usage information. +# + +sub print_usage(*) +{ + local *HANDLE = $_[0]; + + print(HANDLE < +# +# For each source file name referenced in the data file, there is a section +# containing source code and coverage data: +# +# SF: +# FN:, for each function +# DA:, for each instrumented line +# LH: greater than 0 +# LF: +# +# Sections are separated by: +# +# end_of_record +# +# In addition to the main source code file there are sections for each +# #included file containing executable code. Note that the absolute path +# of a source file is generated by interpreting the contents of the respective +# graph file. Relative filenames are prefixed with the directory in which the +# graph file is found. Note also that symbolic links to the graph file will be +# resolved so that the actual file path is used instead of the path to a link. +# This approach is necessary for the mechanism to work with the /proc/gcov +# files. +# +# Die on error. +# + +sub gen_info($) +{ + my $directory = $_[0]; + my @file_list; + my $file; + my $prefix; + my $type; + my $ext; + + if ($initial) { + $type = "graph"; + $ext = $graph_file_extension; + } else { + $type = "data"; + $ext = $data_file_extension; + } + + if (-d $directory) + { + info("Scanning $directory for $ext files ...\n"); + + @file_list = `find "$directory" $maxdepth $follow -name \\*$ext -type f 2>/dev/null`; + chomp(@file_list); + if (!@file_list) { + warn("WARNING: no $ext files found in $directory - ". + "skipping!\n"); + return; + } + $prefix = get_common_prefix(1, @file_list); + info("Found %d %s files in %s\n", $#file_list+1, $type, + $directory); + } + else + { + @file_list = ($directory); + $prefix = ""; + } + + # Process all files in list + foreach $file (@file_list) { + # Process file + if ($initial) { + process_graphfile($file, $prefix); + } else { + process_dafile($file, $prefix); + } + } +} + + +# +# derive_data(contentdata, funcdata, bbdata) +# +# Calculate function coverage data by combining line coverage data and the +# list of lines belonging to a function. +# +# contentdata: [ instr1, count1, source1, instr2, count2, source2, ... ] +# instr: Instrumentation flag for line n +# count: Execution count for line n +# source: Source code for line n +# +# funcdata: [ count1, func1, count2, func2, ... ] +# count: Execution count for function number n +# func: Function name for function number n +# +# bbdata: function_name -> [ line1, line2, ... ] +# line: Line number belonging to the corresponding function +# + +sub derive_data($$$) +{ + my ($contentdata, $funcdata, $bbdata) = @_; + my @gcov_content = @{$contentdata}; + my @gcov_functions = @{$funcdata}; + my %fn_count; + my %ln_fn; + my $line; + my $maxline; + my %fn_name; + my $fn; + my $count; + + if (!defined($bbdata)) { + return @gcov_functions; + } + + # First add existing function data + while (@gcov_functions) { + $count = shift(@gcov_functions); + $fn = shift(@gcov_functions); + + $fn_count{$fn} = $count; + } + + # Convert line coverage data to function data + foreach $fn (keys(%{$bbdata})) { + my $line_data = $bbdata->{$fn}; + my $line; + my $fninstr = 0; + + if ($fn eq "") { + next; + } + # Find the lowest line count for this function + $count = 0; + foreach $line (@$line_data) { + my $linstr = $gcov_content[ ( $line - 1 ) * 3 + 0 ]; + my $lcount = $gcov_content[ ( $line - 1 ) * 3 + 1 ]; + + next if (!$linstr); + $fninstr = 1; + if (($lcount > 0) && + (($count == 0) || ($lcount < $count))) { + $count = $lcount; + } + } + next if (!$fninstr); + $fn_count{$fn} = $count; + } + + + # Check if we got data for all functions + foreach $fn (keys(%fn_name)) { + if ($fn eq "") { + next; + } + if (defined($fn_count{$fn})) { + next; + } + warn("WARNING: no derived data found for function $fn\n"); + } + + # Convert hash to list in @gcov_functions format + foreach $fn (sort(keys(%fn_count))) { + push(@gcov_functions, $fn_count{$fn}, $fn); + } + + return @gcov_functions; +} + +# +# get_filenames(directory, pattern) +# +# Return a list of filenames found in directory which match the specified +# pattern. +# +# Die on error. +# + +sub get_filenames($$) +{ + my ($dirname, $pattern) = @_; + my @result; + my $directory; + local *DIR; + + opendir(DIR, $dirname) or + die("ERROR: cannot read directory $dirname\n"); + while ($directory = readdir(DIR)) { + push(@result, $directory) if ($directory =~ /$pattern/); + } + closedir(DIR); + + return @result; +} + +# +# process_dafile(da_filename, dir) +# +# Create a .info file for a single data file. +# +# Die on error. +# + +sub process_dafile($$) +{ + my ($file, $dir) = @_; + my $da_filename; # Name of data file to process + my $da_dir; # Directory of data file + my $source_dir; # Directory of source file + my $da_basename; # data filename without ".da/.gcda" extension + my $bb_filename; # Name of respective graph file + my $bb_basename; # Basename of the original graph file + my $graph; # Contents of graph file + my $instr; # Contents of graph file part 2 + my $gcov_error; # Error code of gcov tool + my $object_dir; # Directory containing all object files + my $source_filename; # Name of a source code file + my $gcov_file; # Name of a .gcov file + my @gcov_content; # Content of a .gcov file + my $gcov_branches; # Branch content of a .gcov file + my @gcov_functions; # Function calls of a .gcov file + my @gcov_list; # List of generated .gcov files + my $line_number; # Line number count + my $lines_hit; # Number of instrumented lines hit + my $lines_found; # Number of instrumented lines found + my $funcs_hit; # Number of instrumented functions hit + my $funcs_found; # Number of instrumented functions found + my $br_hit; + my $br_found; + my $source; # gcov source header information + my $object; # gcov object header information + my @matches; # List of absolute paths matching filename + my $base_dir; # Base directory for current file + my @tmp_links; # Temporary links to be cleaned up + my @result; + my $index; + my $da_renamed; # If data file is to be renamed + local *INFO_HANDLE; + + info("Processing %s\n", abs2rel($file, $dir)); + # Get path to data file in absolute and normalized form (begins with /, + # contains no more ../ or ./) + $da_filename = solve_relative_path($cwd, $file); + + # Get directory and basename of data file + ($da_dir, $da_basename) = split_filename($da_filename); + + $source_dir = $da_dir; + if (is_compat($COMPAT_MODE_LIBTOOL)) { + # Avoid files from .libs dirs + $source_dir =~ s/\.libs$//; + } + + if (-z $da_filename) + { + $da_renamed = 1; + } + else + { + $da_renamed = 0; + } + + # Construct base_dir for current file + if ($base_directory) + { + $base_dir = $base_directory; + } + else + { + $base_dir = $source_dir; + } + + # Check for writable $base_dir (gcov will try to write files there) + stat($base_dir); + if (!-w _) + { + die("ERROR: cannot write to directory $base_dir!\n"); + } + + # Construct name of graph file + $bb_basename = $da_basename.$graph_file_extension; + $bb_filename = "$da_dir/$bb_basename"; + + # Find out the real location of graph file in case we're just looking at + # a link + while (readlink($bb_filename)) + { + my $last_dir = dirname($bb_filename); + + $bb_filename = readlink($bb_filename); + $bb_filename = solve_relative_path($last_dir, $bb_filename); + } + + # Ignore empty graph file (e.g. source file with no statement) + if (-z $bb_filename) + { + warn("WARNING: empty $bb_filename (skipped)\n"); + return; + } + + # Read contents of graph file into hash. We need it later to find out + # the absolute path to each .gcov file created as well as for + # information about functions and their source code positions. + if ($gcov_version < $GCOV_VERSION_3_4_0) + { + if (is_compat($COMPAT_MODE_HAMMER)) + { + ($instr, $graph) = read_bbg($bb_filename); + } + else + { + ($instr, $graph) = read_bb($bb_filename); + } + } + else + { + ($instr, $graph) = read_gcno($bb_filename); + } + + # Try to find base directory automatically if requested by user + if ($rc_auto_base) { + $base_dir = find_base_from_graph($base_dir, $instr, $graph); + } + + ($instr, $graph) = adjust_graph_filenames($base_dir, $instr, $graph); + + # Set $object_dir to real location of object files. This may differ + # from $da_dir if the graph file is just a link to the "real" object + # file location. + $object_dir = dirname($bb_filename); + + # Is the data file in a different directory? (this happens e.g. with + # the gcov-kernel patch) + if ($object_dir ne $da_dir) + { + # Need to create link to data file in $object_dir + system("ln", "-s", $da_filename, + "$object_dir/$da_basename$data_file_extension") + and die ("ERROR: cannot create link $object_dir/". + "$da_basename$data_file_extension!\n"); + push(@tmp_links, + "$object_dir/$da_basename$data_file_extension"); + # Need to create link to graph file if basename of link + # and file are different (CONFIG_MODVERSION compat) + if ((basename($bb_filename) ne $bb_basename) && + (! -e "$object_dir/$bb_basename")) { + symlink($bb_filename, "$object_dir/$bb_basename") or + warn("WARNING: cannot create link ". + "$object_dir/$bb_basename\n"); + push(@tmp_links, "$object_dir/$bb_basename"); + } + } + + # Change to directory containing data files and apply GCOV + debug("chdir($base_dir)\n"); + chdir($base_dir); + + if ($da_renamed) + { + # Need to rename empty data file to workaround + # gcov <= 3.2.x bug (Abort) + system_no_output(3, "mv", "$da_filename", "$da_filename.ori") + and die ("ERROR: cannot rename $da_filename\n"); + } + + # Execute gcov command and suppress standard output + $gcov_error = system_no_output(1, $gcov_tool, $da_filename, + "-o", $object_dir, @gcov_options); + + if ($da_renamed) + { + system_no_output(3, "mv", "$da_filename.ori", "$da_filename") + and die ("ERROR: cannot rename $da_filename.ori"); + } + + # Clean up temporary links + foreach (@tmp_links) { + unlink($_); + } + + if ($gcov_error) + { + if ($ignore[$ERROR_GCOV]) + { + warn("WARNING: GCOV failed for $da_filename!\n"); + return; + } + die("ERROR: GCOV failed for $da_filename!\n"); + } + + # Collect data from resulting .gcov files and create .info file + @gcov_list = get_filenames('.', '\.gcov$'); + + # Check for files + if (!@gcov_list) + { + warn("WARNING: gcov did not create any files for ". + "$da_filename!\n"); + } + + # Check whether we're writing to a single file + if ($output_filename) + { + if ($output_filename eq "-") + { + *INFO_HANDLE = *STDOUT; + } + else + { + # Append to output file + open(INFO_HANDLE, ">>", $output_filename) + or die("ERROR: cannot write to ". + "$output_filename!\n"); + } + } + else + { + # Open .info file for output + open(INFO_HANDLE, ">", "$da_filename.info") + or die("ERROR: cannot create $da_filename.info!\n"); + } + + # Write test name + printf(INFO_HANDLE "TN:%s\n", $test_name); + + # Traverse the list of generated .gcov files and combine them into a + # single .info file + foreach $gcov_file (sort(@gcov_list)) + { + my $i; + my $num; + + # Skip gcov file for gcc built-in code + next if ($gcov_file eq ".gcov"); + + ($source, $object) = read_gcov_header($gcov_file); + + if (!defined($source)) { + # Derive source file name from gcov file name if + # header format could not be parsed + $source = $gcov_file; + $source =~ s/\.gcov$//; + } + + $source = solve_relative_path($base_dir, $source); + + if (defined($adjust_src_pattern)) { + # Apply transformation as specified by user + $source =~ s/$adjust_src_pattern/$adjust_src_replace/g; + } + + # gcov will happily create output even if there's no source code + # available - this interferes with checksum creation so we need + # to pull the emergency brake here. + if (! -r $source && $checksum) + { + if ($ignore[$ERROR_SOURCE]) + { + warn("WARNING: could not read source file ". + "$source\n"); + next; + } + die("ERROR: could not read source file $source\n"); + } + + @matches = match_filename($source, keys(%{$instr})); + + # Skip files that are not mentioned in the graph file + if (!@matches) + { + warn("WARNING: cannot find an entry for ".$gcov_file. + " in $graph_file_extension file, skipping ". + "file!\n"); + unlink($gcov_file); + next; + } + + # Read in contents of gcov file + @result = read_gcov_file($gcov_file); + if (!defined($result[0])) { + warn("WARNING: skipping unreadable file ". + $gcov_file."\n"); + unlink($gcov_file); + next; + } + @gcov_content = @{$result[0]}; + $gcov_branches = $result[1]; + @gcov_functions = @{$result[2]}; + + # Skip empty files + if (!@gcov_content) + { + warn("WARNING: skipping empty file ".$gcov_file."\n"); + unlink($gcov_file); + next; + } + + if (scalar(@matches) == 1) + { + # Just one match + $source_filename = $matches[0]; + } + else + { + # Try to solve the ambiguity + $source_filename = solve_ambiguous_match($gcov_file, + \@matches, \@gcov_content); + } + + # Skip external files if requested + if (!$opt_external) { + if (is_external($source_filename)) { + info(" ignoring data for external file ". + "$source_filename\n"); + unlink($gcov_file); + next; + } + } + + # Write absolute path of source file + printf(INFO_HANDLE "SF:%s\n", $source_filename); + + # If requested, derive function coverage data from + # line coverage data of the first line of a function + if ($opt_derive_func_data) { + @gcov_functions = + derive_data(\@gcov_content, \@gcov_functions, + $graph->{$source_filename}); + } + + # Write function-related information + if (defined($graph->{$source_filename})) + { + my $fn_data = $graph->{$source_filename}; + my $fn; + + foreach $fn (sort + {$fn_data->{$a}->[0] <=> $fn_data->{$b}->[0]} + keys(%{$fn_data})) { + my $ln_data = $fn_data->{$fn}; + my $line = $ln_data->[0]; + + # Skip empty function + if ($fn eq "") { + next; + } + # Remove excluded functions + if (!$no_markers) { + my $gfn; + my $found = 0; + + foreach $gfn (@gcov_functions) { + if ($gfn eq $fn) { + $found = 1; + last; + } + } + if (!$found) { + next; + } + } + + # Normalize function name + $fn = filter_fn_name($fn); + + print(INFO_HANDLE "FN:$line,$fn\n"); + } + } + + #-- + #-- FNDA: , + #-- FNF: overall count of functions + #-- FNH: overall count of functions with non-zero call count + #-- + $funcs_found = 0; + $funcs_hit = 0; + while (@gcov_functions) + { + my $count = shift(@gcov_functions); + my $fn = shift(@gcov_functions); + + $fn = filter_fn_name($fn); + printf(INFO_HANDLE "FNDA:$count,$fn\n"); + $funcs_found++; + $funcs_hit++ if ($count > 0); + } + if ($funcs_found > 0) { + printf(INFO_HANDLE "FNF:%s\n", $funcs_found); + printf(INFO_HANDLE "FNH:%s\n", $funcs_hit); + } + + # Write coverage information for each instrumented branch: + # + # BRDA:,,, + # + # where 'taken' is the number of times the branch was taken + # or '-' if the block to which the branch belongs was never + # executed + $br_found = 0; + $br_hit = 0; + $num = br_gvec_len($gcov_branches); + for ($i = 0; $i < $num; $i++) { + my ($line, $block, $branch, $taken) = + br_gvec_get($gcov_branches, $i); + + $block = $BR_VEC_MAX if ($block < 0); + print(INFO_HANDLE "BRDA:$line,$block,$branch,$taken\n"); + $br_found++; + $br_hit++ if ($taken ne '-' && $taken > 0); + } + if ($br_found > 0) { + printf(INFO_HANDLE "BRF:%s\n", $br_found); + printf(INFO_HANDLE "BRH:%s\n", $br_hit); + } + + # Reset line counters + $line_number = 0; + $lines_found = 0; + $lines_hit = 0; + + # Write coverage information for each instrumented line + # Note: @gcov_content contains a list of (flag, count, source) + # tuple for each source code line + while (@gcov_content) + { + $line_number++; + + # Check for instrumented line + if ($gcov_content[0]) + { + $lines_found++; + printf(INFO_HANDLE "DA:".$line_number.",". + $gcov_content[1].($checksum ? + ",". md5_base64($gcov_content[2]) : ""). + "\n"); + + # Increase $lines_hit in case of an execution + # count>0 + if ($gcov_content[1] > 0) { $lines_hit++; } + } + + # Remove already processed data from array + splice(@gcov_content,0,3); + } + + # Write line statistics and section separator + printf(INFO_HANDLE "LF:%s\n", $lines_found); + printf(INFO_HANDLE "LH:%s\n", $lines_hit); + print(INFO_HANDLE "end_of_record\n"); + + # Remove .gcov file after processing + unlink($gcov_file); + } + + if (!($output_filename && ($output_filename eq "-"))) + { + close(INFO_HANDLE); + } + + # Change back to initial directory + chdir($cwd); +} + + +# +# solve_relative_path(path, dir) +# +# Solve relative path components of DIR which, if not absolute, resides in PATH. +# + +sub solve_relative_path($$) +{ + my $path = $_[0]; + my $dir = $_[1]; + my $volume; + my $directories; + my $filename; + my @dirs; # holds path elements + my $result; + + # Convert from Windows path to msys path + if( $^O eq "msys" ) + { + # search for a windows drive letter at the beginning + ($volume, $directories, $filename) = File::Spec::Win32->splitpath( $dir ); + if( $volume ne '' ) + { + my $uppercase_volume; + # transform c/d\../e/f\g to Windows style c\d\..\e\f\g + $dir = File::Spec::Win32->canonpath( $dir ); + # use Win32 module to retrieve path components + # $uppercase_volume is not used any further + ( $uppercase_volume, $directories, $filename ) = File::Spec::Win32->splitpath( $dir ); + @dirs = File::Spec::Win32->splitdir( $directories ); + + # prepend volume, since in msys C: is always mounted to /c + $volume =~ s|^([a-zA-Z]+):|/\L$1\E|; + unshift( @dirs, $volume ); + + # transform to Unix style '/' path + $directories = File::Spec->catdir( @dirs ); + $dir = File::Spec->catpath( '', $directories, $filename ); + } else { + # eliminate '\' path separators + $dir = File::Spec->canonpath( $dir ); + } + } + + $result = $dir; + # Prepend path if not absolute + if ($dir =~ /^[^\/]/) + { + $result = "$path/$result"; + } + + # Remove // + $result =~ s/\/\//\//g; + + # Remove . + $result =~ s/\/\.\//\//g; + $result =~ s/\/\.$/\//g; + + # Remove trailing / + $result =~ s/\/$//g; + + # Solve .. + while ($result =~ s/\/[^\/]+\/\.\.\//\//) + { + } + + # Remove preceding .. + $result =~ s/^\/\.\.\//\//g; + + return $result; +} + + +# +# match_filename(gcov_filename, list) +# +# Return a list of those entries of LIST which match the relative filename +# GCOV_FILENAME. +# + +sub match_filename($@) +{ + my ($filename, @list) = @_; + my ($vol, $dir, $file) = splitpath($filename); + my @comp = splitdir($dir); + my $comps = scalar(@comp); + my $entry; + my @result; + +entry: + foreach $entry (@list) { + my ($evol, $edir, $efile) = splitpath($entry); + my @ecomp; + my $ecomps; + my $i; + + # Filename component must match + if ($efile ne $file) { + next; + } + # Check directory components last to first for match + @ecomp = splitdir($edir); + $ecomps = scalar(@ecomp); + if ($ecomps < $comps) { + next; + } + for ($i = 0; $i < $comps; $i++) { + if ($comp[$comps - $i - 1] ne + $ecomp[$ecomps - $i - 1]) { + next entry; + } + } + push(@result, $entry), + } + + return @result; +} + +# +# solve_ambiguous_match(rel_filename, matches_ref, gcov_content_ref) +# +# Try to solve ambiguous matches of mapping (gcov file) -> (source code) file +# by comparing source code provided in the GCOV file with that of the files +# in MATCHES. REL_FILENAME identifies the relative filename of the gcov +# file. +# +# Return the one real match or die if there is none. +# + +sub solve_ambiguous_match($$$) +{ + my $rel_name = $_[0]; + my $matches = $_[1]; + my $content = $_[2]; + my $filename; + my $index; + my $no_match; + local *SOURCE; + + # Check the list of matches + foreach $filename (@$matches) + { + + # Compare file contents + open(SOURCE, "<", $filename) + or die("ERROR: cannot read $filename!\n"); + + $no_match = 0; + for ($index = 2; ; $index += 3) + { + chomp; + + # Also remove CR from line-end + s/\015$//; + + if ($_ ne @$content[$index]) + { + $no_match = 1; + last; + } + } + + close(SOURCE); + + if (!$no_match) + { + info("Solved source file ambiguity for $rel_name\n"); + return $filename; + } + } + + die("ERROR: could not match gcov data for $rel_name!\n"); +} + + +# +# split_filename(filename) +# +# Return (path, filename, extension) for a given FILENAME. +# + +sub split_filename($) +{ + my @path_components = split('/', $_[0]); + my @file_components = split('\.', pop(@path_components)); + my $extension = pop(@file_components); + + return (join("/",@path_components), join(".",@file_components), + $extension); +} + + +# +# read_gcov_header(gcov_filename) +# +# Parse file GCOV_FILENAME and return a list containing the following +# information: +# +# (source, object) +# +# where: +# +# source: complete relative path of the source code file (gcc >= 3.3 only) +# object: name of associated graph file +# +# Die on error. +# + +sub read_gcov_header($) +{ + my $source; + my $object; + local *INPUT; + + if (!open(INPUT, "<", $_[0])) + { + if ($ignore_errors[$ERROR_GCOV]) + { + warn("WARNING: cannot read $_[0]!\n"); + return (undef,undef); + } + die("ERROR: cannot read $_[0]!\n"); + } + + while () + { + chomp($_); + + # Also remove CR from line-end + s/\015$//; + + if (/^\s+-:\s+0:Source:(.*)$/) + { + # Source: header entry + $source = $1; + } + elsif (/^\s+-:\s+0:Object:(.*)$/) + { + # Object: header entry + $object = $1; + } + else + { + last; + } + } + + close(INPUT); + + return ($source, $object); +} + + +# +# br_gvec_len(vector) +# +# Return the number of entries in the branch coverage vector. +# + +sub br_gvec_len($) +{ + my ($vec) = @_; + + return 0 if (!defined($vec)); + return (length($vec) * 8 / $BR_VEC_WIDTH) / $BR_VEC_ENTRIES; +} + + +# +# br_gvec_get(vector, number) +# +# Return an entry from the branch coverage vector. +# + +sub br_gvec_get($$) +{ + my ($vec, $num) = @_; + my $line; + my $block; + my $branch; + my $taken; + my $offset = $num * $BR_VEC_ENTRIES; + + # Retrieve data from vector + $line = vec($vec, $offset + $BR_LINE, $BR_VEC_WIDTH); + $block = vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH); + $block = -1 if ($block == $BR_VEC_MAX); + $branch = vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH); + $taken = vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH); + + # Decode taken value from an integer + if ($taken == 0) { + $taken = "-"; + } else { + $taken--; + } + + return ($line, $block, $branch, $taken); +} + + +# +# br_gvec_push(vector, line, block, branch, taken) +# +# Add an entry to the branch coverage vector. +# + +sub br_gvec_push($$$$$) +{ + my ($vec, $line, $block, $branch, $taken) = @_; + my $offset; + + $vec = "" if (!defined($vec)); + $offset = br_gvec_len($vec) * $BR_VEC_ENTRIES; + $block = $BR_VEC_MAX if $block < 0; + + # Encode taken value into an integer + if ($taken eq "-") { + $taken = 0; + } else { + $taken++; + } + + # Add to vector + vec($vec, $offset + $BR_LINE, $BR_VEC_WIDTH) = $line; + vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH) = $block; + vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH) = $branch; + vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH) = $taken; + + return $vec; +} + + +# +# read_gcov_file(gcov_filename) +# +# Parse file GCOV_FILENAME (.gcov file format) and return the list: +# (reference to gcov_content, reference to gcov_branch, reference to gcov_func) +# +# gcov_content is a list of 3 elements +# (flag, count, source) for each source code line: +# +# $result[($line_number-1)*3+0] = instrumentation flag for line $line_number +# $result[($line_number-1)*3+1] = execution count for line $line_number +# $result[($line_number-1)*3+2] = source code text for line $line_number +# +# gcov_branch is a vector of 4 4-byte long elements for each branch: +# line number, block number, branch number, count + 1 or 0 +# +# gcov_func is a list of 2 elements +# (number of calls, function name) for each function +# +# Die on error. +# + +sub read_gcov_file($) +{ + my $filename = $_[0]; + my @result = (); + my $branches = ""; + my @functions = (); + my $number; + my $exclude_flag = 0; + my $exclude_line = 0; + my $exclude_br_flag = 0; + my $exclude_branch = 0; + my $last_block = $UNNAMED_BLOCK; + my $last_line = 0; + local *INPUT; + + if (!open(INPUT, "<", $filename)) { + if ($ignore_errors[$ERROR_GCOV]) + { + warn("WARNING: cannot read $filename!\n"); + return (undef, undef, undef); + } + die("ERROR: cannot read $filename!\n"); + } + + if ($gcov_version < $GCOV_VERSION_3_3_0) + { + # Expect gcov format as used in gcc < 3.3 + while () + { + chomp($_); + + # Also remove CR from line-end + s/\015$//; + + if (/^branch\s+(\d+)\s+taken\s+=\s+(\d+)/) { + next if (!$br_coverage); + next if ($exclude_line); + next if ($exclude_branch); + $branches = br_gvec_push($branches, $last_line, + $last_block, $1, $2); + } elsif (/^branch\s+(\d+)\s+never\s+executed/) { + next if (!$br_coverage); + next if ($exclude_line); + next if ($exclude_branch); + $branches = br_gvec_push($branches, $last_line, + $last_block, $1, '-'); + } + elsif (/^call/ || /^function/) + { + # Function call return data + } + else + { + $last_line++; + # Check for exclusion markers + if (!$no_markers) { + if (/$EXCL_STOP/) { + $exclude_flag = 0; + } elsif (/$EXCL_START/) { + $exclude_flag = 1; + } + if (/$EXCL_LINE/ || $exclude_flag) { + $exclude_line = 1; + } else { + $exclude_line = 0; + } + } + # Check for exclusion markers (branch exclude) + if (!$no_markers) { + if (/$EXCL_BR_STOP/) { + $exclude_br_flag = 0; + } elsif (/$EXCL_BR_START/) { + $exclude_br_flag = 1; + } + if (/$EXCL_BR_LINE/ || $exclude_br_flag) { + $exclude_branch = 1; + } else { + $exclude_branch = 0; + } + } + # Source code execution data + if (/^\t\t(.*)$/) + { + # Uninstrumented line + push(@result, 0); + push(@result, 0); + push(@result, $1); + next; + } + $number = (split(" ",substr($_, 0, 16)))[0]; + + # Check for zero count which is indicated + # by ###### + if ($number eq "######") { $number = 0; } + + if ($exclude_line) { + # Register uninstrumented line instead + push(@result, 0); + push(@result, 0); + } else { + push(@result, 1); + push(@result, $number); + } + push(@result, substr($_, 16)); + } + } + } + else + { + # Expect gcov format as used in gcc >= 3.3 + while () + { + chomp($_); + + # Also remove CR from line-end + s/\015$//; + + if (/^\s*(\d+|\$+):\s*(\d+)-block\s+(\d+)\s*$/) { + # Block information - used to group related + # branches + $last_line = $2; + $last_block = $3; + } elsif (/^branch\s+(\d+)\s+taken\s+(\d+)/) { + next if (!$br_coverage); + next if ($exclude_line); + next if ($exclude_branch); + $branches = br_gvec_push($branches, $last_line, + $last_block, $1, $2); + } elsif (/^branch\s+(\d+)\s+never\s+executed/) { + next if (!$br_coverage); + next if ($exclude_line); + next if ($exclude_branch); + $branches = br_gvec_push($branches, $last_line, + $last_block, $1, '-'); + } + elsif (/^function\s+(.+)\s+called\s+(\d+)\s+/) + { + next if (!$func_coverage); + if ($exclude_line) { + next; + } + push(@functions, $2, $1); + } + elsif (/^call/) + { + # Function call return data + } + elsif (/^\s*([^:]+):\s*([^:]+):(.*)$/) + { + my ($count, $line, $code) = ($1, $2, $3); + + $last_line = $line; + $last_block = $UNNAMED_BLOCK; + # Check for exclusion markers + if (!$no_markers) { + if (/$EXCL_STOP/) { + $exclude_flag = 0; + } elsif (/$EXCL_START/) { + $exclude_flag = 1; + } + if (/$EXCL_LINE/ || $exclude_flag) { + $exclude_line = 1; + } else { + $exclude_line = 0; + } + } + # Check for exclusion markers (branch exclude) + if (!$no_markers) { + if (/$EXCL_BR_STOP/) { + $exclude_br_flag = 0; + } elsif (/$EXCL_BR_START/) { + $exclude_br_flag = 1; + } + if (/$EXCL_BR_LINE/ || $exclude_br_flag) { + $exclude_branch = 1; + } else { + $exclude_branch = 0; + } + } + + # :: + if ($line eq "0") + { + # Extra data + } + elsif ($count eq "-") + { + # Uninstrumented line + push(@result, 0); + push(@result, 0); + push(@result, $code); + } + else + { + if ($exclude_line) { + push(@result, 0); + push(@result, 0); + } else { + # Check for zero count + if ($count =~ /^[#=]/) { + $count = 0; + } + push(@result, 1); + push(@result, $count); + } + push(@result, $code); + } + } + } + } + + close(INPUT); + if ($exclude_flag || $exclude_br_flag) { + warn("WARNING: unterminated exclusion section in $filename\n"); + } + return(\@result, $branches, \@functions); +} + + +# +# Get the GCOV tool version. Return an integer number which represents the +# GCOV version. Version numbers can be compared using standard integer +# operations. +# + +sub get_gcov_version() +{ + local *HANDLE; + my $version_string; + my $result; + + open(GCOV_PIPE, "-|", "$gcov_tool --version") + or die("ERROR: cannot retrieve gcov version!\n"); + $version_string = ; + # LLVM gcov keeps version information on the second line. + # For example, gcov --version yields: + # LLVM (http://llvm.org/): + # LLVM version 3.4svn + $version_string = if ($version_string =~ /LLVM/); + close(GCOV_PIPE); + + # Remove version information in parenthesis to cope with the following: + # - gcov (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3) + # - gcov (crosstool-NG 1.18.0) 4.7.2 + $version_string =~ s/\([^\)]*\)//g; + + $result = 0; + if ($version_string =~ /(\d+)\.(\d+)(\.(\d+))?/) + { + if (defined($4)) + { + info("Found gcov version: $1.$2.$4\n"); + $result = $1 << 16 | $2 << 8 | $4; + } + else + { + info("Found gcov version: $1.$2\n"); + $result = $1 << 16 | $2 << 8; + } + } + if ($version_string =~ /LLVM/) + { + # Map LLVM versions to the version of GCC gcov which + # they emulate + if ($result >= 0x030400) + { + info("Found LLVM gcov version 3.4, which emulates gcov version 4.2\n"); + $result = 0x040200; + } + else + { + warn("This version of LLVM's gcov is unknown. Assuming it emulates GCC gcov version 4.2.\n"); + $result = 0x040200; + } + } + return ($result, $version_string); +} + + +# +# info(printf_parameter) +# +# Use printf to write PRINTF_PARAMETER to stdout only when the $quiet flag +# is not set. +# + +sub info(@) +{ + if (!$quiet) + { + # Print info string + if (defined($output_filename) && ($output_filename eq "-")) + { + # Don't interfere with the .info output to STDOUT + printf(STDERR @_); + } + else + { + printf(@_); + } + } +} + + +# +# int_handler() +# +# Called when the script was interrupted by an INT signal (e.g. CTRl-C) +# + +sub int_handler() +{ + if ($cwd) { chdir($cwd); } + info("Aborted.\n"); + exit(1); +} + + +# +# system_no_output(mode, parameters) +# +# Call an external program using PARAMETERS while suppressing depending on +# the value of MODE: +# +# MODE & 1: suppress STDOUT +# MODE & 2: suppress STDERR +# +# Return 0 on success, non-zero otherwise. +# + +sub system_no_output($@) +{ + my $mode = shift; + my $result; + local *OLD_STDERR; + local *OLD_STDOUT; + + # Save old stdout and stderr handles + ($mode & 1) && open(OLD_STDOUT, ">>&", "STDOUT"); + ($mode & 2) && open(OLD_STDERR, ">>&", "STDERR"); + + # Redirect to /dev/null + ($mode & 1) && open(STDOUT, ">", "/dev/null"); + ($mode & 2) && open(STDERR, ">", "/dev/null"); + + debug("system(".join(' ', @_).")\n"); + system(@_); + $result = $?; + + # Close redirected handles + ($mode & 1) && close(STDOUT); + ($mode & 2) && close(STDERR); + + # Restore old handles + ($mode & 1) && open(STDOUT, ">>&", "OLD_STDOUT"); + ($mode & 2) && open(STDERR, ">>&", "OLD_STDERR"); + + return $result; +} + + +# +# read_config(filename) +# +# Read configuration file FILENAME and return a reference to a hash containing +# all valid key=value pairs found. +# + +sub read_config($) +{ + my $filename = $_[0]; + my %result; + my $key; + my $value; + local *HANDLE; + + if (!open(HANDLE, "<", $filename)) + { + warn("WARNING: cannot read configuration file $filename\n"); + return undef; + } + while () + { + chomp; + # Skip comments + s/#.*//; + # Remove leading blanks + s/^\s+//; + # Remove trailing blanks + s/\s+$//; + next unless length; + ($key, $value) = split(/\s*=\s*/, $_, 2); + if (defined($key) && defined($value)) + { + $result{$key} = $value; + } + else + { + warn("WARNING: malformed statement in line $. ". + "of configuration file $filename\n"); + } + } + close(HANDLE); + return \%result; +} + + +# +# apply_config(REF) +# +# REF is a reference to a hash containing the following mapping: +# +# key_string => var_ref +# +# where KEY_STRING is a keyword and VAR_REF is a reference to an associated +# variable. If the global configuration hashes CONFIG or OPT_RC contain a value +# for keyword KEY_STRING, VAR_REF will be assigned the value for that keyword. +# + +sub apply_config($) +{ + my $ref = $_[0]; + + foreach (keys(%{$ref})) + { + if (defined($opt_rc{$_})) { + ${$ref->{$_}} = $opt_rc{$_}; + } elsif (defined($config->{$_})) { + ${$ref->{$_}} = $config->{$_}; + } + } +} + + +# +# get_exclusion_data(filename) +# +# Scan specified source code file for exclusion markers and return +# linenumber -> 1 +# for all lines which should be excluded. +# + +sub get_exclusion_data($) +{ + my ($filename) = @_; + my %list; + my $flag = 0; + local *HANDLE; + + if (!open(HANDLE, "<", $filename)) { + warn("WARNING: could not open $filename\n"); + return undef; + } + while () { + if (/$EXCL_STOP/) { + $flag = 0; + } elsif (/$EXCL_START/) { + $flag = 1; + } + if (/$EXCL_LINE/ || $flag) { + $list{$.} = 1; + } + } + close(HANDLE); + + if ($flag) { + warn("WARNING: unterminated exclusion section in $filename\n"); + } + + return \%list; +} + + +# +# apply_exclusion_data(instr, graph) +# +# Remove lines from instr and graph data structures which are marked +# for exclusion in the source code file. +# +# Return adjusted (instr, graph). +# +# graph : file name -> function data +# function data : function name -> line data +# line data : [ line1, line2, ... ] +# +# instr : filename -> line data +# line data : [ line1, line2, ... ] +# + +sub apply_exclusion_data($$) +{ + my ($instr, $graph) = @_; + my $filename; + my %excl_data; + my $excl_read_failed = 0; + + # Collect exclusion marker data + foreach $filename (sort_uniq_lex(keys(%{$graph}), keys(%{$instr}))) { + my $excl = get_exclusion_data($filename); + + # Skip and note if file could not be read + if (!defined($excl)) { + $excl_read_failed = 1; + next; + } + + # Add to collection if there are markers + $excl_data{$filename} = $excl if (keys(%{$excl}) > 0); + } + + # Warn if not all source files could be read + if ($excl_read_failed) { + warn("WARNING: some exclusion markers may be ignored\n"); + } + + # Skip if no markers were found + return ($instr, $graph) if (keys(%excl_data) == 0); + + # Apply exclusion marker data to graph + foreach $filename (keys(%excl_data)) { + my $function_data = $graph->{$filename}; + my $excl = $excl_data{$filename}; + my $function; + + next if (!defined($function_data)); + + foreach $function (keys(%{$function_data})) { + my $line_data = $function_data->{$function}; + my $line; + my @new_data; + + # To be consistent with exclusion parser in non-initial + # case we need to remove a function if the first line + # was excluded + if ($excl->{$line_data->[0]}) { + delete($function_data->{$function}); + next; + } + # Copy only lines which are not excluded + foreach $line (@{$line_data}) { + push(@new_data, $line) if (!$excl->{$line}); + } + + # Store modified list + if (scalar(@new_data) > 0) { + $function_data->{$function} = \@new_data; + } else { + # All of this function was excluded + delete($function_data->{$function}); + } + } + + # Check if all functions of this file were excluded + if (keys(%{$function_data}) == 0) { + delete($graph->{$filename}); + } + } + + # Apply exclusion marker data to instr + foreach $filename (keys(%excl_data)) { + my $line_data = $instr->{$filename}; + my $excl = $excl_data{$filename}; + my $line; + my @new_data; + + next if (!defined($line_data)); + + # Copy only lines which are not excluded + foreach $line (@{$line_data}) { + push(@new_data, $line) if (!$excl->{$line}); + } + + # Store modified list + $instr->{$filename} = \@new_data; + } + + return ($instr, $graph); +} + + +sub process_graphfile($$) +{ + my ($file, $dir) = @_; + my $graph_filename = $file; + my $graph_dir; + my $graph_basename; + my $source_dir; + my $base_dir; + my $graph; + my $instr; + my $filename; + local *INFO_HANDLE; + + info("Processing %s\n", abs2rel($file, $dir)); + + # Get path to data file in absolute and normalized form (begins with /, + # contains no more ../ or ./) + $graph_filename = solve_relative_path($cwd, $graph_filename); + + # Get directory and basename of data file + ($graph_dir, $graph_basename) = split_filename($graph_filename); + + $source_dir = $graph_dir; + if (is_compat($COMPAT_MODE_LIBTOOL)) { + # Avoid files from .libs dirs + $source_dir =~ s/\.libs$//; + } + + # Construct base_dir for current file + if ($base_directory) + { + $base_dir = $base_directory; + } + else + { + $base_dir = $source_dir; + } + + if ($gcov_version < $GCOV_VERSION_3_4_0) + { + if (is_compat($COMPAT_MODE_HAMMER)) + { + ($instr, $graph) = read_bbg($graph_filename); + } + else + { + ($instr, $graph) = read_bb($graph_filename); + } + } + else + { + ($instr, $graph) = read_gcno($graph_filename); + } + + # Try to find base directory automatically if requested by user + if ($rc_auto_base) { + $base_dir = find_base_from_graph($base_dir, $instr, $graph); + } + + ($instr, $graph) = adjust_graph_filenames($base_dir, $instr, $graph); + + if (!$no_markers) { + # Apply exclusion marker data to graph file data + ($instr, $graph) = apply_exclusion_data($instr, $graph); + } + + # Check whether we're writing to a single file + if ($output_filename) + { + if ($output_filename eq "-") + { + *INFO_HANDLE = *STDOUT; + } + else + { + # Append to output file + open(INFO_HANDLE, ">>", $output_filename) + or die("ERROR: cannot write to ". + "$output_filename!\n"); + } + } + else + { + # Open .info file for output + open(INFO_HANDLE, ">", "$graph_filename.info") + or die("ERROR: cannot create $graph_filename.info!\n"); + } + + # Write test name + printf(INFO_HANDLE "TN:%s\n", $test_name); + foreach $filename (sort(keys(%{$instr}))) + { + my $funcdata = $graph->{$filename}; + my $line; + my $linedata; + + # Skip external files if requested + if (!$opt_external) { + if (is_external($filename)) { + info(" ignoring data for external file ". + "$filename\n"); + next; + } + } + + print(INFO_HANDLE "SF:$filename\n"); + + if (defined($funcdata) && $func_coverage) { + my @functions = sort {$funcdata->{$a}->[0] <=> + $funcdata->{$b}->[0]} + keys(%{$funcdata}); + my $func; + + # Gather list of instrumented lines and functions + foreach $func (@functions) { + $linedata = $funcdata->{$func}; + + # Print function name and starting line + print(INFO_HANDLE "FN:".$linedata->[0]. + ",".filter_fn_name($func)."\n"); + } + # Print zero function coverage data + foreach $func (@functions) { + print(INFO_HANDLE "FNDA:0,". + filter_fn_name($func)."\n"); + } + # Print function summary + print(INFO_HANDLE "FNF:".scalar(@functions)."\n"); + print(INFO_HANDLE "FNH:0\n"); + } + # Print zero line coverage data + foreach $line (@{$instr->{$filename}}) { + print(INFO_HANDLE "DA:$line,0\n"); + } + # Print line summary + print(INFO_HANDLE "LF:".scalar(@{$instr->{$filename}})."\n"); + print(INFO_HANDLE "LH:0\n"); + + print(INFO_HANDLE "end_of_record\n"); + } + if (!($output_filename && ($output_filename eq "-"))) + { + close(INFO_HANDLE); + } +} + +sub filter_fn_name($) +{ + my ($fn) = @_; + + # Remove characters used internally as function name delimiters + $fn =~ s/[,=]/_/g; + + return $fn; +} + +sub warn_handler($) +{ + my ($msg) = @_; + + warn("$tool_name: $msg"); +} + +sub die_handler($) +{ + my ($msg) = @_; + + die("$tool_name: $msg"); +} + + +# +# graph_error(filename, message) +# +# Print message about error in graph file. If ignore_graph_error is set, return. +# Otherwise abort. +# + +sub graph_error($$) +{ + my ($filename, $msg) = @_; + + if ($ignore[$ERROR_GRAPH]) { + warn("WARNING: $filename: $msg - skipping\n"); + return; + } + die("ERROR: $filename: $msg\n"); +} + +# +# graph_expect(description) +# +# If debug is set to a non-zero value, print the specified description of what +# is expected to be read next from the graph file. +# + +sub graph_expect($) +{ + my ($msg) = @_; + + if (!$debug || !defined($msg)) { + return; + } + + print(STDERR "DEBUG: expecting $msg\n"); +} + +# +# graph_read(handle, bytes[, description, peek]) +# +# Read and return the specified number of bytes from handle. Return undef +# if the number of bytes could not be read. If PEEK is non-zero, reset +# file position after read. +# + +sub graph_read(*$;$$) +{ + my ($handle, $length, $desc, $peek) = @_; + my $data; + my $result; + my $pos; + + graph_expect($desc); + if ($peek) { + $pos = tell($handle); + if ($pos == -1) { + warn("Could not get current file position: $!\n"); + return undef; + } + } + $result = read($handle, $data, $length); + if ($debug) { + my $op = $peek ? "peek" : "read"; + my $ascii = ""; + my $hex = ""; + my $i; + + print(STDERR "DEBUG: $op($length)=$result: "); + for ($i = 0; $i < length($data); $i++) { + my $c = substr($data, $i, 1);; + my $n = ord($c); + + $hex .= sprintf("%02x ", $n); + if ($n >= 32 && $n <= 127) { + $ascii .= $c; + } else { + $ascii .= "."; + } + } + print(STDERR "$hex |$ascii|"); + print(STDERR "\n"); + } + if ($peek) { + if (!seek($handle, $pos, 0)) { + warn("Could not set file position: $!\n"); + return undef; + } + } + if ($result != $length) { + return undef; + } + return $data; +} + +# +# graph_skip(handle, bytes[, description]) +# +# Read and discard the specified number of bytes from handle. Return non-zero +# if bytes could be read, zero otherwise. +# + +sub graph_skip(*$;$) +{ + my ($handle, $length, $desc) = @_; + + if (defined(graph_read($handle, $length, $desc))) { + return 1; + } + return 0; +} + +# +# sort_uniq(list) +# +# Return list in numerically ascending order and without duplicate entries. +# + +sub sort_uniq(@) +{ + my (@list) = @_; + my %hash; + + foreach (@list) { + $hash{$_} = 1; + } + return sort { $a <=> $b } keys(%hash); +} + +# +# sort_uniq_lex(list) +# +# Return list in lexically ascending order and without duplicate entries. +# + +sub sort_uniq_lex(@) +{ + my (@list) = @_; + my %hash; + + foreach (@list) { + $hash{$_} = 1; + } + return sort keys(%hash); +} + +# +# parent_dir(dir) +# +# Return parent directory for DIR. DIR must not contain relative path +# components. +# + +sub parent_dir($) +{ + my ($dir) = @_; + my ($v, $d, $f) = splitpath($dir, 1); + my @dirs = splitdir($d); + + pop(@dirs); + + return catpath($v, catdir(@dirs), $f); +} + +# +# find_base_from_graph(base_dir, instr, graph) +# +# Try to determine the base directory of the graph file specified by INSTR +# and GRAPH. The base directory is the base for all relative filenames in +# the graph file. It is defined by the current working directory at time +# of compiling the source file. +# +# This function implements a heuristic which relies on the following +# assumptions: +# - all files used for compilation are still present at their location +# - the base directory is either BASE_DIR or one of its parent directories +# - files by the same name are not present in multiple parent directories +# + +sub find_base_from_graph($$$) +{ + my ($base_dir, $instr, $graph) = @_; + my $old_base; + my $best_miss; + my $best_base; + my %rel_files; + + # Determine list of relative paths + foreach my $filename (keys(%{$instr}), keys(%{$graph})) { + next if (file_name_is_absolute($filename)); + + $rel_files{$filename} = 1; + } + + # Early exit if there are no relative paths + return $base_dir if (!%rel_files); + + do { + my $miss = 0; + + foreach my $filename (keys(%rel_files)) { + if (!-e solve_relative_path($base_dir, $filename)) { + $miss++; + } + } + + debug("base_dir=$base_dir miss=$miss\n"); + + # Exit if we find an exact match with no misses + return $base_dir if ($miss == 0); + + # No exact match, aim for the one with the least source file + # misses + if (!defined($best_base) || $miss < $best_miss) { + $best_base = $base_dir; + $best_miss = $miss; + } + + # Repeat until there's no more parent directory + $old_base = $base_dir; + $base_dir = parent_dir($base_dir); + } while ($old_base ne $base_dir); + + return $best_base; +} + +# +# adjust_graph_filenames(base_dir, instr, graph) +# +# Make relative paths in INSTR and GRAPH absolute and apply +# geninfo_adjust_src_path setting to graph file data. +# + +sub adjust_graph_filenames($$$) +{ + my ($base_dir, $instr, $graph) = @_; + + foreach my $filename (keys(%{$instr})) { + my $old_filename = $filename; + + # Convert to absolute canonical form + $filename = solve_relative_path($base_dir, $filename); + + # Apply adjustment + if (defined($adjust_src_pattern)) { + $filename =~ s/$adjust_src_pattern/$adjust_src_replace/g; + } + + if ($filename ne $old_filename) { + $instr->{$filename} = delete($instr->{$old_filename}); + } + } + + foreach my $filename (keys(%{$graph})) { + my $old_filename = $filename; + + # Make absolute + # Convert to absolute canonical form + $filename = solve_relative_path($base_dir, $filename); + + # Apply adjustment + if (defined($adjust_src_pattern)) { + $filename =~ s/$adjust_src_pattern/$adjust_src_replace/g; + } + + if ($filename ne $old_filename) { + $graph->{$filename} = delete($graph->{$old_filename}); + } + } + + return ($instr, $graph); +} + +# +# graph_cleanup(graph) +# +# Remove entries for functions with no lines. Remove duplicate line numbers. +# Sort list of line numbers numerically ascending. +# + +sub graph_cleanup($) +{ + my ($graph) = @_; + my $filename; + + foreach $filename (keys(%{$graph})) { + my $per_file = $graph->{$filename}; + my $function; + + foreach $function (keys(%{$per_file})) { + my $lines = $per_file->{$function}; + + if (scalar(@$lines) == 0) { + # Remove empty function + delete($per_file->{$function}); + next; + } + # Normalize list + $per_file->{$function} = [ sort_uniq(@$lines) ]; + } + if (scalar(keys(%{$per_file})) == 0) { + # Remove empty file + delete($graph->{$filename}); + } + } +} + +# +# graph_find_base(bb) +# +# Try to identify the filename which is the base source file for the +# specified bb data. +# + +sub graph_find_base($) +{ + my ($bb) = @_; + my %file_count; + my $basefile; + my $file; + my $func; + my $filedata; + my $count; + my $num; + + # Identify base name for this bb data. + foreach $func (keys(%{$bb})) { + $filedata = $bb->{$func}; + + foreach $file (keys(%{$filedata})) { + $count = $file_count{$file}; + + # Count file occurrence + $file_count{$file} = defined($count) ? $count + 1 : 1; + } + } + $count = 0; + $num = 0; + foreach $file (keys(%file_count)) { + if ($file_count{$file} > $count) { + # The file that contains code for the most functions + # is likely the base file + $count = $file_count{$file}; + $num = 1; + $basefile = $file; + } elsif ($file_count{$file} == $count) { + # If more than one file could be the basefile, we + # don't have a basefile + $basefile = undef; + } + } + + return $basefile; +} + +# +# graph_from_bb(bb, fileorder, bb_filename) +# +# Convert data from bb to the graph format and list of instrumented lines. +# Returns (instr, graph). +# +# bb : function name -> file data +# : undef -> file order +# file data : filename -> line data +# line data : [ line1, line2, ... ] +# +# file order : function name -> [ filename1, filename2, ... ] +# +# graph : file name -> function data +# function data : function name -> line data +# line data : [ line1, line2, ... ] +# +# instr : filename -> line data +# line data : [ line1, line2, ... ] +# + +sub graph_from_bb($$$) +{ + my ($bb, $fileorder, $bb_filename) = @_; + my $graph = {}; + my $instr = {}; + my $basefile; + my $file; + my $func; + my $filedata; + my $linedata; + my $order; + + $basefile = graph_find_base($bb); + # Create graph structure + foreach $func (keys(%{$bb})) { + $filedata = $bb->{$func}; + $order = $fileorder->{$func}; + + # Account for lines in functions + if (defined($basefile) && defined($filedata->{$basefile})) { + # If the basefile contributes to this function, + # account this function to the basefile. + $graph->{$basefile}->{$func} = $filedata->{$basefile}; + } else { + # If the basefile does not contribute to this function, + # account this function to the first file contributing + # lines. + $graph->{$order->[0]}->{$func} = + $filedata->{$order->[0]}; + } + + foreach $file (keys(%{$filedata})) { + # Account for instrumented lines + $linedata = $filedata->{$file}; + push(@{$instr->{$file}}, @$linedata); + } + } + # Clean up array of instrumented lines + foreach $file (keys(%{$instr})) { + $instr->{$file} = [ sort_uniq(@{$instr->{$file}}) ]; + } + + return ($instr, $graph); +} + +# +# graph_add_order(fileorder, function, filename) +# +# Add an entry for filename to the fileorder data set for function. +# + +sub graph_add_order($$$) +{ + my ($fileorder, $function, $filename) = @_; + my $item; + my $list; + + $list = $fileorder->{$function}; + foreach $item (@$list) { + if ($item eq $filename) { + return; + } + } + push(@$list, $filename); + $fileorder->{$function} = $list; +} + +# +# read_bb_word(handle[, description]) +# +# Read and return a word in .bb format from handle. +# + +sub read_bb_word(*;$) +{ + my ($handle, $desc) = @_; + + return graph_read($handle, 4, $desc); +} + +# +# read_bb_value(handle[, description]) +# +# Read a word in .bb format from handle and return the word and its integer +# value. +# + +sub read_bb_value(*;$) +{ + my ($handle, $desc) = @_; + my $word; + + $word = read_bb_word($handle, $desc); + return undef if (!defined($word)); + + return ($word, unpack("V", $word)); +} + +# +# read_bb_string(handle, delimiter) +# +# Read and return a string in .bb format from handle up to the specified +# delimiter value. +# + +sub read_bb_string(*$) +{ + my ($handle, $delimiter) = @_; + my $word; + my $value; + my $string = ""; + + graph_expect("string"); + do { + ($word, $value) = read_bb_value($handle, "string or delimiter"); + return undef if (!defined($value)); + if ($value != $delimiter) { + $string .= $word; + } + } while ($value != $delimiter); + $string =~ s/\0//g; + + return $string; +} + +# +# read_bb(filename) +# +# Read the contents of the specified .bb file and return (instr, graph), where: +# +# instr : filename -> line data +# line data : [ line1, line2, ... ] +# +# graph : filename -> file_data +# file_data : function name -> line_data +# line_data : [ line1, line2, ... ] +# +# See the gcov info pages of gcc 2.95 for a description of the .bb file format. +# + +sub read_bb($) +{ + my ($bb_filename) = @_; + my $minus_one = 0x80000001; + my $minus_two = 0x80000002; + my $value; + my $filename; + my $function; + my $bb = {}; + my $fileorder = {}; + my $instr; + my $graph; + local *HANDLE; + + open(HANDLE, "<", $bb_filename) or goto open_error; + binmode(HANDLE); + while (!eof(HANDLE)) { + $value = read_bb_value(*HANDLE, "data word"); + goto incomplete if (!defined($value)); + if ($value == $minus_one) { + # Source file name + graph_expect("filename"); + $filename = read_bb_string(*HANDLE, $minus_one); + goto incomplete if (!defined($filename)); + } elsif ($value == $minus_two) { + # Function name + graph_expect("function name"); + $function = read_bb_string(*HANDLE, $minus_two); + goto incomplete if (!defined($function)); + } elsif ($value > 0) { + # Line number + if (!defined($filename) || !defined($function)) { + warn("WARNING: unassigned line number ". + "$value\n"); + next; + } + push(@{$bb->{$function}->{$filename}}, $value); + graph_add_order($fileorder, $function, $filename); + } + } + close(HANDLE); + ($instr, $graph) = graph_from_bb($bb, $fileorder, $bb_filename); + graph_cleanup($graph); + + return ($instr, $graph); + +open_error: + graph_error($bb_filename, "could not open file"); + return undef; +incomplete: + graph_error($bb_filename, "reached unexpected end of file"); + return undef; +} + +# +# read_bbg_word(handle[, description]) +# +# Read and return a word in .bbg format. +# + +sub read_bbg_word(*;$) +{ + my ($handle, $desc) = @_; + + return graph_read($handle, 4, $desc); +} + +# +# read_bbg_value(handle[, description]) +# +# Read a word in .bbg format from handle and return its integer value. +# + +sub read_bbg_value(*;$) +{ + my ($handle, $desc) = @_; + my $word; + + $word = read_bbg_word($handle, $desc); + return undef if (!defined($word)); + + return unpack("N", $word); +} + +# +# read_bbg_string(handle) +# +# Read and return a string in .bbg format. +# + +sub read_bbg_string(*) +{ + my ($handle, $desc) = @_; + my $length; + my $string; + + graph_expect("string"); + # Read string length + $length = read_bbg_value($handle, "string length"); + return undef if (!defined($length)); + if ($length == 0) { + return ""; + } + # Read string + $string = graph_read($handle, $length, "string"); + return undef if (!defined($string)); + # Skip padding + graph_skip($handle, 4 - $length % 4, "string padding") or return undef; + + return $string; +} + +# +# read_bbg_lines_record(handle, bbg_filename, bb, fileorder, filename, +# function) +# +# Read a bbg format lines record from handle and add the relevant data to +# bb and fileorder. Return filename on success, undef on error. +# + +sub read_bbg_lines_record(*$$$$$) +{ + my ($handle, $bbg_filename, $bb, $fileorder, $filename, $function) = @_; + my $string; + my $lineno; + + graph_expect("lines record"); + # Skip basic block index + graph_skip($handle, 4, "basic block index") or return undef; + while (1) { + # Read line number + $lineno = read_bbg_value($handle, "line number"); + return undef if (!defined($lineno)); + if ($lineno == 0) { + # Got a marker for a new filename + graph_expect("filename"); + $string = read_bbg_string($handle); + return undef if (!defined($string)); + # Check for end of record + if ($string eq "") { + return $filename; + } + $filename = $string; + if (!exists($bb->{$function}->{$filename})) { + $bb->{$function}->{$filename} = []; + } + next; + } + # Got an actual line number + if (!defined($filename)) { + warn("WARNING: unassigned line number in ". + "$bbg_filename\n"); + next; + } + push(@{$bb->{$function}->{$filename}}, $lineno); + graph_add_order($fileorder, $function, $filename); + } +} + +# +# read_bbg(filename) +# +# Read the contents of the specified .bbg file and return the following mapping: +# graph: filename -> file_data +# file_data: function name -> line_data +# line_data: [ line1, line2, ... ] +# +# See the gcov-io.h file in the SLES 9 gcc 3.3.3 source code for a description +# of the .bbg format. +# + +sub read_bbg($) +{ + my ($bbg_filename) = @_; + my $file_magic = 0x67626267; + my $tag_function = 0x01000000; + my $tag_lines = 0x01450000; + my $word; + my $tag; + my $length; + my $function; + my $filename; + my $bb = {}; + my $fileorder = {}; + my $instr; + my $graph; + local *HANDLE; + + open(HANDLE, "<", $bbg_filename) or goto open_error; + binmode(HANDLE); + # Read magic + $word = read_bbg_value(*HANDLE, "file magic"); + goto incomplete if (!defined($word)); + # Check magic + if ($word != $file_magic) { + goto magic_error; + } + # Skip version + graph_skip(*HANDLE, 4, "version") or goto incomplete; + while (!eof(HANDLE)) { + # Read record tag + $tag = read_bbg_value(*HANDLE, "record tag"); + goto incomplete if (!defined($tag)); + # Read record length + $length = read_bbg_value(*HANDLE, "record length"); + goto incomplete if (!defined($tag)); + if ($tag == $tag_function) { + graph_expect("function record"); + # Read function name + graph_expect("function name"); + $function = read_bbg_string(*HANDLE); + goto incomplete if (!defined($function)); + $filename = undef; + # Skip function checksum + graph_skip(*HANDLE, 4, "function checksum") + or goto incomplete; + } elsif ($tag == $tag_lines) { + # Read lines record + $filename = read_bbg_lines_record(HANDLE, $bbg_filename, + $bb, $fileorder, $filename, + $function); + goto incomplete if (!defined($filename)); + } else { + # Skip record contents + graph_skip(*HANDLE, $length, "unhandled record") + or goto incomplete; + } + } + close(HANDLE); + ($instr, $graph) = graph_from_bb($bb, $fileorder, $bbg_filename); + graph_cleanup($graph); + + return ($instr, $graph); + +open_error: + graph_error($bbg_filename, "could not open file"); + return undef; +incomplete: + graph_error($bbg_filename, "reached unexpected end of file"); + return undef; +magic_error: + graph_error($bbg_filename, "found unrecognized bbg file magic"); + return undef; +} + +# +# read_gcno_word(handle[, description, peek]) +# +# Read and return a word in .gcno format. +# + +sub read_gcno_word(*;$$) +{ + my ($handle, $desc, $peek) = @_; + + return graph_read($handle, 4, $desc, $peek); +} + +# +# read_gcno_value(handle, big_endian[, description, peek]) +# +# Read a word in .gcno format from handle and return its integer value +# according to the specified endianness. If PEEK is non-zero, reset file +# position after read. +# + +sub read_gcno_value(*$;$$) +{ + my ($handle, $big_endian, $desc, $peek) = @_; + my $word; + my $pos; + + $word = read_gcno_word($handle, $desc, $peek); + return undef if (!defined($word)); + if ($big_endian) { + return unpack("N", $word); + } else { + return unpack("V", $word); + } +} + +# +# read_gcno_string(handle, big_endian) +# +# Read and return a string in .gcno format. +# + +sub read_gcno_string(*$) +{ + my ($handle, $big_endian) = @_; + my $length; + my $string; + + graph_expect("string"); + # Read string length + $length = read_gcno_value($handle, $big_endian, "string length"); + return undef if (!defined($length)); + if ($length == 0) { + return ""; + } + $length *= 4; + # Read string + $string = graph_read($handle, $length, "string and padding"); + return undef if (!defined($string)); + $string =~ s/\0//g; + + return $string; +} + +# +# read_gcno_lines_record(handle, gcno_filename, bb, fileorder, filename, +# function, big_endian) +# +# Read a gcno format lines record from handle and add the relevant data to +# bb and fileorder. Return filename on success, undef on error. +# + +sub read_gcno_lines_record(*$$$$$$) +{ + my ($handle, $gcno_filename, $bb, $fileorder, $filename, $function, + $big_endian) = @_; + my $string; + my $lineno; + + graph_expect("lines record"); + # Skip basic block index + graph_skip($handle, 4, "basic block index") or return undef; + while (1) { + # Read line number + $lineno = read_gcno_value($handle, $big_endian, "line number"); + return undef if (!defined($lineno)); + if ($lineno == 0) { + # Got a marker for a new filename + graph_expect("filename"); + $string = read_gcno_string($handle, $big_endian); + return undef if (!defined($string)); + # Check for end of record + if ($string eq "") { + return $filename; + } + $filename = $string; + if (!exists($bb->{$function}->{$filename})) { + $bb->{$function}->{$filename} = []; + } + next; + } + # Got an actual line number + if (!defined($filename)) { + warn("WARNING: unassigned line number in ". + "$gcno_filename\n"); + next; + } + # Add to list + push(@{$bb->{$function}->{$filename}}, $lineno); + graph_add_order($fileorder, $function, $filename); + } +} + +# +# determine_gcno_split_crc(handle, big_endian, rec_length) +# +# Determine if HANDLE refers to a .gcno file with a split checksum function +# record format. Return non-zero in case of split checksum format, zero +# otherwise, undef in case of read error. +# + +sub determine_gcno_split_crc($$$) +{ + my ($handle, $big_endian, $rec_length) = @_; + my $strlen; + my $overlong_string; + + return 1 if ($gcov_version >= $GCOV_VERSION_4_7_0); + return 1 if (is_compat($COMPAT_MODE_SPLIT_CRC)); + + # Heuristic: + # Decide format based on contents of next word in record: + # - pre-gcc 4.7 + # This is the function name length / 4 which should be + # less than the remaining record length + # - gcc 4.7 + # This is a checksum, likely with high-order bits set, + # resulting in a large number + $strlen = read_gcno_value($handle, $big_endian, undef, 1); + return undef if (!defined($strlen)); + $overlong_string = 1 if ($strlen * 4 >= $rec_length - 12); + + if ($overlong_string) { + if (is_compat_auto($COMPAT_MODE_SPLIT_CRC)) { + info("Auto-detected compatibility mode for split ". + "checksum .gcno file format\n"); + + return 1; + } else { + # Sanity check + warn("Found overlong string in function record: ". + "try '--compat split_crc'\n"); + } + } + + return 0; +} + +# +# read_gcno_function_record(handle, graph, big_endian, rec_length) +# +# Read a gcno format function record from handle and add the relevant data +# to graph. Return (filename, function) on success, undef on error. +# + +sub read_gcno_function_record(*$$$$) +{ + my ($handle, $bb, $fileorder, $big_endian, $rec_length) = @_; + my $filename; + my $function; + my $lineno; + my $lines; + + graph_expect("function record"); + # Skip ident and checksum + graph_skip($handle, 8, "function ident and checksum") or return undef; + # Determine if this is a function record with split checksums + if (!defined($gcno_split_crc)) { + $gcno_split_crc = determine_gcno_split_crc($handle, $big_endian, + $rec_length); + return undef if (!defined($gcno_split_crc)); + } + # Skip cfg checksum word in case of split checksums + graph_skip($handle, 4, "function cfg checksum") if ($gcno_split_crc); + # Read function name + graph_expect("function name"); + $function = read_gcno_string($handle, $big_endian); + return undef if (!defined($function)); + # Read filename + graph_expect("filename"); + $filename = read_gcno_string($handle, $big_endian); + return undef if (!defined($filename)); + # Read first line number + $lineno = read_gcno_value($handle, $big_endian, "initial line number"); + return undef if (!defined($lineno)); + # Add to list + push(@{$bb->{$function}->{$filename}}, $lineno); + graph_add_order($fileorder, $function, $filename); + + return ($filename, $function); +} + +# +# read_gcno(filename) +# +# Read the contents of the specified .gcno file and return the following +# mapping: +# graph: filename -> file_data +# file_data: function name -> line_data +# line_data: [ line1, line2, ... ] +# +# See the gcov-io.h file in the gcc 3.3 source code for a description of +# the .gcno format. +# + +sub read_gcno($) +{ + my ($gcno_filename) = @_; + my $file_magic = 0x67636e6f; + my $tag_function = 0x01000000; + my $tag_lines = 0x01450000; + my $big_endian; + my $word; + my $tag; + my $length; + my $filename; + my $function; + my $bb = {}; + my $fileorder = {}; + my $instr; + my $graph; + my $filelength; + local *HANDLE; + + open(HANDLE, "<", $gcno_filename) or goto open_error; + $filelength = (stat(HANDLE))[7]; + binmode(HANDLE); + # Read magic + $word = read_gcno_word(*HANDLE, "file magic"); + goto incomplete if (!defined($word)); + # Determine file endianness + if (unpack("N", $word) == $file_magic) { + $big_endian = 1; + } elsif (unpack("V", $word) == $file_magic) { + $big_endian = 0; + } else { + goto magic_error; + } + # Skip version and stamp + graph_skip(*HANDLE, 8, "version and stamp") or goto incomplete; + while (!eof(HANDLE)) { + my $next_pos; + my $curr_pos; + + # Read record tag + $tag = read_gcno_value(*HANDLE, $big_endian, "record tag"); + goto incomplete if (!defined($tag)); + # Read record length + $length = read_gcno_value(*HANDLE, $big_endian, + "record length"); + goto incomplete if (!defined($length)); + # Convert length to bytes + $length *= 4; + # Calculate start of next record + $next_pos = tell(HANDLE); + goto tell_error if ($next_pos == -1); + $next_pos += $length; + # Catch garbage at the end of a gcno file + if ($next_pos > $filelength) { + debug("Overlong record: file_length=$filelength ". + "rec_length=$length\n"); + warn("WARNING: $gcno_filename: Overlong record at end ". + "of file!\n"); + last; + } + # Process record + if ($tag == $tag_function) { + ($filename, $function) = read_gcno_function_record( + *HANDLE, $bb, $fileorder, $big_endian, + $length); + goto incomplete if (!defined($function)); + } elsif ($tag == $tag_lines) { + # Read lines record + $filename = read_gcno_lines_record(*HANDLE, + $gcno_filename, $bb, $fileorder, + $filename, $function, + $big_endian); + goto incomplete if (!defined($filename)); + } else { + # Skip record contents + graph_skip(*HANDLE, $length, "unhandled record") + or goto incomplete; + } + # Ensure that we are at the start of the next record + $curr_pos = tell(HANDLE); + goto tell_error if ($curr_pos == -1); + next if ($curr_pos == $next_pos); + goto record_error if ($curr_pos > $next_pos); + graph_skip(*HANDLE, $next_pos - $curr_pos, + "unhandled record content") + or goto incomplete; + } + close(HANDLE); + ($instr, $graph) = graph_from_bb($bb, $fileorder, $gcno_filename); + graph_cleanup($graph); + + return ($instr, $graph); + +open_error: + graph_error($gcno_filename, "could not open file"); + return undef; +incomplete: + graph_error($gcno_filename, "reached unexpected end of file"); + return undef; +magic_error: + graph_error($gcno_filename, "found unrecognized gcno file magic"); + return undef; +tell_error: + graph_error($gcno_filename, "could not determine file position"); + return undef; +record_error: + graph_error($gcno_filename, "found unrecognized record format"); + return undef; +} + +sub debug($) +{ + my ($msg) = @_; + + return if (!$debug); + print(STDERR "DEBUG: $msg"); +} + +# +# get_gcov_capabilities +# +# Determine the list of available gcov options. +# + +sub get_gcov_capabilities() +{ + my $help = `$gcov_tool --help`; + my %capabilities; + my %short_option_translations = ( + 'a' => 'all-blocks', + 'b' => 'branch-probabilities', + 'c' => 'branch-counts', + 'f' => 'function-summaries', + 'h' => 'help', + 'l' => 'long-file-names', + 'n' => 'no-output', + 'o' => 'object-directory', + 'p' => 'preserve-paths', + 'u' => 'unconditional-branches', + 'v' => 'version', + ); + + foreach (split(/\n/, $help)) { + my $capability; + if (/--(\S+)/) { + $capability = $1; + } else { + # If the line provides a short option, translate it. + next if (!/^\s*-(\S)\s/); + $capability = $short_option_translations{$1}; + next if not defined($capability); + } + next if ($capability eq 'help'); + next if ($capability eq 'version'); + next if ($capability eq 'object-directory'); + + $capabilities{$capability} = 1; + debug("gcov has capability '$capability'\n"); + } + + return \%capabilities; +} + +# +# parse_ignore_errors(@ignore_errors) +# +# Parse user input about which errors to ignore. +# + +sub parse_ignore_errors(@) +{ + my (@ignore_errors) = @_; + my @items; + my $item; + + return if (!@ignore_errors); + + foreach $item (@ignore_errors) { + $item =~ s/\s//g; + if ($item =~ /,/) { + # Split and add comma-separated parameters + push(@items, split(/,/, $item)); + } else { + # Add single parameter + push(@items, $item); + } + } + foreach $item (@items) { + my $item_id = $ERROR_ID{lc($item)}; + + if (!defined($item_id)) { + die("ERROR: unknown argument for --ignore-errors: ". + "$item\n"); + } + $ignore[$item_id] = 1; + } +} + +# +# is_external(filename) +# +# Determine if a file is located outside of the specified data directories. +# + +sub is_external($) +{ + my ($filename) = @_; + my $dir; + + foreach $dir (@internal_dirs) { + return 0 if ($filename =~ /^\Q$dir\/\E/); + } + return 1; +} + +# +# compat_name(mode) +# +# Return the name of compatibility mode MODE. +# + +sub compat_name($) +{ + my ($mode) = @_; + my $name = $COMPAT_MODE_TO_NAME{$mode}; + + return $name if (defined($name)); + + return ""; +} + +# +# parse_compat_modes(opt) +# +# Determine compatibility mode settings. +# + +sub parse_compat_modes($) +{ + my ($opt) = @_; + my @opt_list; + my %specified; + + # Initialize with defaults + %compat_value = %COMPAT_MODE_DEFAULTS; + + # Add old style specifications + if (defined($opt_compat_libtool)) { + $compat_value{$COMPAT_MODE_LIBTOOL} = + $opt_compat_libtool ? $COMPAT_VALUE_ON + : $COMPAT_VALUE_OFF; + } + + # Parse settings + if (defined($opt)) { + @opt_list = split(/\s*,\s*/, $opt); + } + foreach my $directive (@opt_list) { + my ($mode, $value); + + # Either + # mode=off|on|auto or + # mode (implies on) + if ($directive !~ /^(\w+)=(\w+)$/ && + $directive !~ /^(\w+)$/) { + die("ERROR: Unknown compatibility mode specification: ". + "$directive!\n"); + } + # Determine mode + $mode = $COMPAT_NAME_TO_MODE{lc($1)}; + if (!defined($mode)) { + die("ERROR: Unknown compatibility mode '$1'!\n"); + } + $specified{$mode} = 1; + # Determine value + if (defined($2)) { + $value = $COMPAT_NAME_TO_VALUE{lc($2)}; + if (!defined($value)) { + die("ERROR: Unknown compatibility mode ". + "value '$2'!\n"); + } + } else { + $value = $COMPAT_VALUE_ON; + } + $compat_value{$mode} = $value; + } + # Perform auto-detection + foreach my $mode (sort(keys(%compat_value))) { + my $value = $compat_value{$mode}; + my $is_autodetect = ""; + my $name = compat_name($mode); + + if ($value == $COMPAT_VALUE_AUTO) { + my $autodetect = $COMPAT_MODE_AUTO{$mode}; + + if (!defined($autodetect)) { + die("ERROR: No auto-detection for ". + "mode '$name' available!\n"); + } + + if (ref($autodetect) eq "CODE") { + $value = &$autodetect(); + $compat_value{$mode} = $value; + $is_autodetect = " (auto-detected)"; + } + } + + if ($specified{$mode}) { + if ($value == $COMPAT_VALUE_ON) { + info("Enabling compatibility mode ". + "'$name'$is_autodetect\n"); + } elsif ($value == $COMPAT_VALUE_OFF) { + info("Disabling compatibility mode ". + "'$name'$is_autodetect\n"); + } else { + info("Using delayed auto-detection for ". + "compatibility mode ". + "'$name'\n"); + } + } + } +} + +sub compat_hammer_autodetect() +{ + if ($gcov_version_string =~ /suse/i && $gcov_version == 0x30303 || + $gcov_version_string =~ /mandrake/i && $gcov_version == 0x30302) + { + info("Auto-detected compatibility mode for GCC 3.3 (hammer)\n"); + return $COMPAT_VALUE_ON; + } + return $COMPAT_VALUE_OFF; +} + +# +# is_compat(mode) +# +# Return non-zero if compatibility mode MODE is enabled. +# + +sub is_compat($) +{ + my ($mode) = @_; + + return 1 if ($compat_value{$mode} == $COMPAT_VALUE_ON); + return 0; +} + +# +# is_compat_auto(mode) +# +# Return non-zero if compatibility mode MODE is set to auto-detect. +# + +sub is_compat_auto($) +{ + my ($mode) = @_; + + return 1 if ($compat_value{$mode} == $COMPAT_VALUE_AUTO); + return 0; +} diff --git a/utils/lcov-1.11/bin/genpng b/utils/lcov-1.11/bin/genpng new file mode 100755 index 00000000..42cbde81 --- /dev/null +++ b/utils/lcov-1.11/bin/genpng @@ -0,0 +1,389 @@ +#!/usr/bin/perl -w +# +# Copyright (c) International Business Machines Corp., 2002 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# genpng +# +# This script creates an overview PNG image of a source code file by +# representing each source code character by a single pixel. +# +# Note that the Perl module GD.pm is required for this script to work. +# It may be obtained from http://www.cpan.org +# +# History: +# 2002-08-26: created by Peter Oberparleiter +# + +use strict; +use File::Basename; +use Getopt::Long; + + +# Constants +our $lcov_version = 'LCOV version 1.11'; +our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; +our $tool_name = basename($0); + + +# Prototypes +sub gen_png($$$@); +sub check_and_load_module($); +sub genpng_print_usage(*); +sub genpng_process_file($$$$); +sub genpng_warn_handler($); +sub genpng_die_handler($); + + +# +# Code entry point +# + +# Prettify version string +$lcov_version =~ s/\$\s*Revision\s*:?\s*(\S+)\s*\$/$1/; + +# Check whether required module GD.pm is installed +if (check_and_load_module("GD")) +{ + # Note: cannot use die() to print this message because inserting this + # code into another script via do() would not fail as required! + print(STDERR < \$tab_size, + "width=i" => \$width, + "output-filename=s" => \$out_filename, + "help" => \$help, + "version" => \$version)) + { + print(STDERR "Use $tool_name --help to get usage ". + "information\n"); + exit(1); + } + + $filename = $ARGV[0]; + + # Check for help flag + if ($help) + { + genpng_print_usage(*STDOUT); + exit(0); + } + + # Check for version flag + if ($version) + { + print("$tool_name: $lcov_version\n"); + exit(0); + } + + # Check options + if (!$filename) + { + die("No filename specified\n"); + } + + # Check for output filename + if (!$out_filename) + { + $out_filename = "$filename.png"; + } + + genpng_process_file($filename, $out_filename, $width, $tab_size); + exit(0); +} + + +# +# genpng_print_usage(handle) +# +# Write out command line usage information to given filehandle. +# + +sub genpng_print_usage(*) +{ + local *HANDLE = $_[0]; + + print(HANDLE <) + { + if (/^\t\t(.*)$/) + { + # Uninstrumented line + push(@source, ":$1"); + } + elsif (/^ ###### (.*)$/) + { + # Line with zero execution count + push(@source, "0:$1"); + } + elsif (/^( *)(\d*) (.*)$/) + { + # Line with positive execution count + push(@source, "$2:$3"); + } + } + } + else + { + # Plain text file + while () { push(@source, ":$_"); } + } + close(HANDLE); + + gen_png($out_filename, $width, $tab_size, @source); +} + + +# +# gen_png(filename, width, tab_size, source) +# +# Write an overview PNG file to FILENAME. Source code is defined by SOURCE +# which is a list of lines : per source code line. +# The output image will be made up of one pixel per character of source, +# coloring will be done according to execution counts. WIDTH defines the +# image width. TAB_SIZE specifies the number of spaces to use as replacement +# string for tabulator signs in source code text. +# +# Die on error. +# + +sub gen_png($$$@) +{ + my $filename = shift(@_); # Filename for PNG file + my $overview_width = shift(@_); # Imagewidth for image + my $tab_size = shift(@_); # Replacement string for tab signs + my @source = @_; # Source code as passed via argument 2 + my $height; # Height as define by source size + my $overview; # Source code overview image data + my $col_plain_back; # Color for overview background + my $col_plain_text; # Color for uninstrumented text + my $col_cov_back; # Color for background of covered lines + my $col_cov_text; # Color for text of covered lines + my $col_nocov_back; # Color for background of lines which + # were not covered (count == 0) + my $col_nocov_text; # Color for test of lines which were not + # covered (count == 0) + my $col_hi_back; # Color for background of highlighted lines + my $col_hi_text; # Color for text of highlighted lines + my $line; # Current line during iteration + my $row = 0; # Current row number during iteration + my $column; # Current column number during iteration + my $color_text; # Current text color during iteration + my $color_back; # Current background color during iteration + my $last_count; # Count of last processed line + my $count; # Count of current line + my $source; # Source code of current line + my $replacement; # Replacement string for tabulator chars + local *PNG_HANDLE; # Handle for output PNG file + + # Handle empty source files + if (!@source) { + @source = ( "" ); + } + $height = scalar(@source); + # Create image + $overview = new GD::Image($overview_width, $height) + or die("ERROR: cannot allocate overview image!\n"); + + # Define colors + $col_plain_back = $overview->colorAllocate(0xff, 0xff, 0xff); + $col_plain_text = $overview->colorAllocate(0xaa, 0xaa, 0xaa); + $col_cov_back = $overview->colorAllocate(0xaa, 0xa7, 0xef); + $col_cov_text = $overview->colorAllocate(0x5d, 0x5d, 0xea); + $col_nocov_back = $overview->colorAllocate(0xff, 0x00, 0x00); + $col_nocov_text = $overview->colorAllocate(0xaa, 0x00, 0x00); + $col_hi_back = $overview->colorAllocate(0x00, 0xff, 0x00); + $col_hi_text = $overview->colorAllocate(0x00, 0xaa, 0x00); + + # Visualize each line + foreach $line (@source) + { + # Replace tabs with spaces to keep consistent with source + # code view + while ($line =~ /^([^\t]*)(\t)/) + { + $replacement = " "x($tab_size - ((length($1) - 1) % + $tab_size)); + $line =~ s/^([^\t]*)(\t)/$1$replacement/; + } + + # Skip lines which do not follow the : + # specification, otherwise $1 = count, $2 = source code + if (!($line =~ /(\*?)(\d*):(.*)$/)) { next; } + $count = $2; + $source = $3; + + # Decide which color pair to use + + # If this line was not instrumented but the one before was, + # take the color of that line to widen color areas in + # resulting image + if (($count eq "") && defined($last_count) && + ($last_count ne "")) + { + $count = $last_count; + } + + if ($count eq "") + { + # Line was not instrumented + $color_text = $col_plain_text; + $color_back = $col_plain_back; + } + elsif ($count == 0) + { + # Line was instrumented but not executed + $color_text = $col_nocov_text; + $color_back = $col_nocov_back; + } + elsif ($1 eq "*") + { + # Line was highlighted + $color_text = $col_hi_text; + $color_back = $col_hi_back; + } + else + { + # Line was instrumented and executed + $color_text = $col_cov_text; + $color_back = $col_cov_back; + } + + # Write one pixel for each source character + $column = 0; + foreach (split("", $source)) + { + # Check for width + if ($column >= $overview_width) { last; } + + if ($_ eq " ") + { + # Space + $overview->setPixel($column++, $row, + $color_back); + } + else + { + # Text + $overview->setPixel($column++, $row, + $color_text); + } + } + + # Fill rest of line + while ($column < $overview_width) + { + $overview->setPixel($column++, $row, $color_back); + } + + $last_count = $2; + + $row++; + } + + # Write PNG file + open (PNG_HANDLE, ">", $filename) + or die("ERROR: cannot write png file $filename!\n"); + binmode(*PNG_HANDLE); + print(PNG_HANDLE $overview->png()); + close(PNG_HANDLE); +} + +sub genpng_warn_handler($) +{ + my ($msg) = @_; + + warn("$tool_name: $msg"); +} + +sub genpng_die_handler($) +{ + my ($msg) = @_; + + die("$tool_name: $msg"); +} diff --git a/utils/lcov-1.11/bin/install.sh b/utils/lcov-1.11/bin/install.sh new file mode 100755 index 00000000..27140f91 --- /dev/null +++ b/utils/lcov-1.11/bin/install.sh @@ -0,0 +1,71 @@ +#!/bin/bash +# +# install.sh [--uninstall] sourcefile targetfile [install options] +# + + +# Check for uninstall option +if test "x$1" == "x--uninstall" ; then + UNINSTALL=true + SOURCE=$2 + TARGET=$3 + shift 3 +else + UNINSTALL=false + SOURCE=$1 + TARGET=$2 + shift 2 +fi + +# Check usage +if test -z "$SOURCE" || test -z "$TARGET" ; then + echo Usage: install.sh [--uninstall] source target [install options] >&2 + exit 1 +fi + + +# +# do_install(SOURCE_FILE, TARGET_FILE) +# + +do_install() +{ + local SOURCE=$1 + local TARGET=$2 + local PARAMS=$3 + + install -p -D $PARAMS $SOURCE $TARGET +} + + +# +# do_uninstall(SOURCE_FILE, TARGET_FILE) +# + +do_uninstall() +{ + local SOURCE=$1 + local TARGET=$2 + + # Does target exist? + if test -r $TARGET ; then + # Is target of the same version as this package? + if diff $SOURCE $TARGET >/dev/null; then + rm -f $TARGET + else + echo WARNING: Skipping uninstall for $TARGET - versions differ! >&2 + fi + else + echo WARNING: Skipping uninstall for $TARGET - not installed! >&2 + fi +} + + +# Call sub routine +if $UNINSTALL ; then + do_uninstall $SOURCE $TARGET +else + do_install $SOURCE $TARGET "$*" +fi + +exit 0 diff --git a/utils/lcov-1.11/bin/lcov b/utils/lcov-1.11/bin/lcov new file mode 100755 index 00000000..f4005320 --- /dev/null +++ b/utils/lcov-1.11/bin/lcov @@ -0,0 +1,4325 @@ +#!/usr/bin/perl -w +# +# Copyright (c) International Business Machines Corp., 2002,2012 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# lcov +# +# This is a wrapper script which provides a single interface for accessing +# LCOV coverage data. +# +# +# History: +# 2002-08-29 created by Peter Oberparleiter +# IBM Lab Boeblingen +# 2002-09-05 / Peter Oberparleiter: implemented --kernel-directory + +# multiple directories +# 2002-10-16 / Peter Oberparleiter: implemented --add-tracefile option +# 2002-10-17 / Peter Oberparleiter: implemented --extract option +# 2002-11-04 / Peter Oberparleiter: implemented --list option +# 2003-03-07 / Paul Larson: Changed to make it work with the latest gcov +# kernel patch. This will break it with older gcov-kernel +# patches unless you change the value of $gcovmod in this script +# 2003-04-07 / Peter Oberparleiter: fixed bug which resulted in an error +# when trying to combine .info files containing data without +# a test name +# 2003-04-10 / Peter Oberparleiter: extended Paul's change so that LCOV +# works both with the new and the old gcov-kernel patch +# 2003-04-10 / Peter Oberparleiter: added $gcov_dir constant in anticipation +# of a possible move of the gcov kernel directory to another +# file system in a future version of the gcov-kernel patch +# 2003-04-15 / Paul Larson: make info write to STDERR, not STDOUT +# 2003-04-15 / Paul Larson: added --remove option +# 2003-04-30 / Peter Oberparleiter: renamed --reset to --zerocounters +# to remove naming ambiguity with --remove +# 2003-04-30 / Peter Oberparleiter: adjusted help text to include --remove +# 2003-06-27 / Peter Oberparleiter: implemented --diff +# 2003-07-03 / Peter Oberparleiter: added line checksum support, added +# --no-checksum +# 2003-12-11 / Laurent Deniel: added --follow option +# 2004-03-29 / Peter Oberparleiter: modified --diff option to better cope with +# ambiguous patch file entries, modified --capture option to use +# modprobe before insmod (needed for 2.6) +# 2004-03-30 / Peter Oberparleiter: added --path option +# 2004-08-09 / Peter Oberparleiter: added configuration file support +# 2008-08-13 / Peter Oberparleiter: added function coverage support +# + +use strict; +use File::Basename; +use File::Path; +use File::Find; +use File::Temp qw /tempdir/; +use File::Spec::Functions qw /abs2rel canonpath catdir catfile catpath + file_name_is_absolute rootdir splitdir splitpath/; +use Getopt::Long; +use Cwd qw /abs_path getcwd/; + + +# Global constants +our $lcov_version = 'LCOV version 1.11'; +our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; +our $tool_name = basename($0); + +# Directory containing gcov kernel files +our $gcov_dir; + +# Where to create temporary directories +our $tmp_dir; + +# Internal constants +our $GKV_PROC = 0; # gcov-kernel data in /proc via external patch +our $GKV_SYS = 1; # gcov-kernel data in /sys via vanilla 2.6.31+ +our @GKV_NAME = ( "external", "upstream" ); +our $pkg_gkv_file = ".gcov_kernel_version"; +our $pkg_build_file = ".build_directory"; + +our $BR_BLOCK = 0; +our $BR_BRANCH = 1; +our $BR_TAKEN = 2; +our $BR_VEC_ENTRIES = 3; +our $BR_VEC_WIDTH = 32; +our $BR_VEC_MAX = vec(pack('b*', 1 x $BR_VEC_WIDTH), 0, $BR_VEC_WIDTH); + +# Branch data combination types +our $BR_SUB = 0; +our $BR_ADD = 1; + +# Prototypes +sub print_usage(*); +sub check_options(); +sub userspace_reset(); +sub userspace_capture(); +sub kernel_reset(); +sub kernel_capture(); +sub kernel_capture_initial(); +sub package_capture(); +sub add_traces(); +sub read_info_file($); +sub get_info_entry($); +sub set_info_entry($$$$$$$$$;$$$$$$); +sub add_counts($$); +sub merge_checksums($$$); +sub combine_info_entries($$$); +sub combine_info_files($$); +sub write_info_file(*$); +sub extract(); +sub remove(); +sub list(); +sub get_common_filename($$); +sub read_diff($); +sub diff(); +sub system_no_output($@); +sub read_config($); +sub apply_config($); +sub info(@); +sub create_temp_dir(); +sub transform_pattern($); +sub warn_handler($); +sub die_handler($); +sub abort_handler($); +sub temp_cleanup(); +sub setup_gkv(); +sub get_overall_line($$$$); +sub print_overall_rate($$$$$$$$$); +sub lcov_geninfo(@); +sub create_package($$$;$); +sub get_func_found_and_hit($); +sub br_ivec_get($$); +sub summary(); +sub rate($$;$$$); + +# Global variables & initialization +our @directory; # Specifies where to get coverage data from +our @kernel_directory; # If set, captures only from specified kernel subdirs +our @add_tracefile; # If set, reads in and combines all files in list +our $list; # If set, list contents of tracefile +our $extract; # If set, extracts parts of tracefile +our $remove; # If set, removes parts of tracefile +our $diff; # If set, modifies tracefile according to diff +our $reset; # If set, reset all coverage data to zero +our $capture; # If set, capture data +our $output_filename; # Name for file to write coverage data to +our $test_name = ""; # Test case name +our $quiet = ""; # If set, suppress information messages +our $help; # Help option flag +our $version; # Version option flag +our $convert_filenames; # If set, convert filenames when applying diff +our $strip; # If set, strip leading directories when applying diff +our $temp_dir_name; # Name of temporary directory +our $cwd = `pwd`; # Current working directory +our $to_file; # If set, indicates that output is written to a file +our $follow; # If set, indicates that find shall follow links +our $diff_path = ""; # Path removed from tracefile when applying diff +our $base_directory; # Base directory (cwd of gcc during compilation) +our $checksum; # If set, calculate a checksum for each line +our $no_checksum; # If set, don't calculate a checksum for each line +our $compat_libtool; # If set, indicates that libtool mode is to be enabled +our $no_compat_libtool; # If set, indicates that libtool mode is to be disabled +our $gcov_tool; +our @opt_ignore_errors; +our $initial; +our $no_recursion = 0; +our $to_package; +our $from_package; +our $maxdepth; +our $no_markers; +our $config; # Configuration file contents +chomp($cwd); +our $tool_dir = dirname($0); # Directory where genhtml tool is installed +our @temp_dirs; +our $gcov_gkv; # gcov kernel support version found on machine +our $opt_derive_func_data; +our $opt_debug; +our $opt_list_full_path; +our $opt_no_list_full_path; +our $opt_list_width = 80; +our $opt_list_truncate_max = 20; +our $opt_external; +our $opt_no_external; +our $opt_config_file; +our %opt_rc; +our @opt_summary; +our $opt_compat; +our $ln_overall_found; +our $ln_overall_hit; +our $fn_overall_found; +our $fn_overall_hit; +our $br_overall_found; +our $br_overall_hit; +our $func_coverage = 1; +our $br_coverage = 0; + + +# +# Code entry point +# + +$SIG{__WARN__} = \&warn_handler; +$SIG{__DIE__} = \&die_handler; +$SIG{'INT'} = \&abort_handler; +$SIG{'QUIT'} = \&abort_handler; + +# Prettify version string +$lcov_version =~ s/\$\s*Revision\s*:?\s*(\S+)\s*\$/$1/; + +# Add current working directory if $tool_dir is not already an absolute path +if (! ($tool_dir =~ /^\/(.*)$/)) +{ + $tool_dir = "$cwd/$tool_dir"; +} + +# Check command line for a configuration file name +Getopt::Long::Configure("pass_through", "no_auto_abbrev"); +GetOptions("config-file=s" => \$opt_config_file, + "rc=s%" => \%opt_rc); +Getopt::Long::Configure("default"); + +# Remove spaces around rc options +while (my ($key, $value) = each(%opt_rc)) { + delete($opt_rc{$key}); + + $key =~ s/^\s+|\s+$//g; + $value =~ s/^\s+|\s+$//g; + + $opt_rc{$key} = $value; +} + +# Read configuration file if available +if (defined($opt_config_file)) { + $config = read_config($opt_config_file); +} elsif (defined($ENV{"HOME"}) && (-r $ENV{"HOME"}."/.lcovrc")) +{ + $config = read_config($ENV{"HOME"}."/.lcovrc"); +} +elsif (-r "/etc/lcovrc") +{ + $config = read_config("/etc/lcovrc"); +} + +if ($config || %opt_rc) +{ + # Copy configuration file and --rc values to variables + apply_config({ + "lcov_gcov_dir" => \$gcov_dir, + "lcov_tmp_dir" => \$tmp_dir, + "lcov_list_full_path" => \$opt_list_full_path, + "lcov_list_width" => \$opt_list_width, + "lcov_list_truncate_max"=> \$opt_list_truncate_max, + "lcov_branch_coverage" => \$br_coverage, + "lcov_function_coverage"=> \$func_coverage, + }); +} + +# Parse command line options +if (!GetOptions("directory|d|di=s" => \@directory, + "add-tracefile|a=s" => \@add_tracefile, + "list|l=s" => \$list, + "kernel-directory|k=s" => \@kernel_directory, + "extract|e=s" => \$extract, + "remove|r=s" => \$remove, + "diff=s" => \$diff, + "convert-filenames" => \$convert_filenames, + "strip=i" => \$strip, + "capture|c" => \$capture, + "output-file|o=s" => \$output_filename, + "test-name|t=s" => \$test_name, + "zerocounters|z" => \$reset, + "quiet|q" => \$quiet, + "help|h|?" => \$help, + "version|v" => \$version, + "follow|f" => \$follow, + "path=s" => \$diff_path, + "base-directory|b=s" => \$base_directory, + "checksum" => \$checksum, + "no-checksum" => \$no_checksum, + "compat-libtool" => \$compat_libtool, + "no-compat-libtool" => \$no_compat_libtool, + "gcov-tool=s" => \$gcov_tool, + "ignore-errors=s" => \@opt_ignore_errors, + "initial|i" => \$initial, + "no-recursion" => \$no_recursion, + "to-package=s" => \$to_package, + "from-package=s" => \$from_package, + "no-markers" => \$no_markers, + "derive-func-data" => \$opt_derive_func_data, + "debug" => \$opt_debug, + "list-full-path" => \$opt_list_full_path, + "no-list-full-path" => \$opt_no_list_full_path, + "external" => \$opt_external, + "no-external" => \$opt_no_external, + "summary=s" => \@opt_summary, + "compat=s" => \$opt_compat, + "config-file=s" => \$opt_config_file, + "rc=s%" => \%opt_rc, + )) +{ + print(STDERR "Use $tool_name --help to get usage information\n"); + exit(1); +} +else +{ + # Merge options + if (defined($no_checksum)) + { + $checksum = ($no_checksum ? 0 : 1); + $no_checksum = undef; + } + + if (defined($no_compat_libtool)) + { + $compat_libtool = ($no_compat_libtool ? 0 : 1); + $no_compat_libtool = undef; + } + + if (defined($opt_no_list_full_path)) + { + $opt_list_full_path = ($opt_no_list_full_path ? 0 : 1); + $opt_no_list_full_path = undef; + } + + if (defined($opt_no_external)) { + $opt_external = 0; + $opt_no_external = undef; + } +} + +# Check for help option +if ($help) +{ + print_usage(*STDOUT); + exit(0); +} + +# Check for version option +if ($version) +{ + print("$tool_name: $lcov_version\n"); + exit(0); +} + +# Check list width option +if ($opt_list_width <= 40) { + die("ERROR: lcov_list_width parameter out of range (needs to be ". + "larger than 40)\n"); +} + +# Normalize --path text +$diff_path =~ s/\/$//; + +if ($follow) +{ + $follow = "-follow"; +} +else +{ + $follow = ""; +} + +if ($no_recursion) +{ + $maxdepth = "-maxdepth 1"; +} +else +{ + $maxdepth = ""; +} + +# Check for valid options +check_options(); + +# Only --extract, --remove and --diff allow unnamed parameters +if (@ARGV && !($extract || $remove || $diff || @opt_summary)) +{ + die("Extra parameter found: '".join(" ", @ARGV)."'\n". + "Use $tool_name --help to get usage information\n"); +} + +# Check for output filename +$to_file = ($output_filename && ($output_filename ne "-")); + +if ($capture) +{ + if (!$to_file) + { + # Option that tells geninfo to write to stdout + $output_filename = "-"; + } +} + +# Determine kernel directory for gcov data +if (!$from_package && !@directory && ($capture || $reset)) { + ($gcov_gkv, $gcov_dir) = setup_gkv(); +} + +# Check for requested functionality +if ($reset) +{ + # Differentiate between user space and kernel reset + if (@directory) + { + userspace_reset(); + } + else + { + kernel_reset(); + } +} +elsif ($capture) +{ + # Capture source can be user space, kernel or package + if ($from_package) { + package_capture(); + } elsif (@directory) { + userspace_capture(); + } else { + if ($initial) { + if (defined($to_package)) { + die("ERROR: --initial cannot be used together ". + "with --to-package\n"); + } + kernel_capture_initial(); + } else { + kernel_capture(); + } + } +} +elsif (@add_tracefile) +{ + ($ln_overall_found, $ln_overall_hit, + $fn_overall_found, $fn_overall_hit, + $br_overall_found, $br_overall_hit) = add_traces(); +} +elsif ($remove) +{ + ($ln_overall_found, $ln_overall_hit, + $fn_overall_found, $fn_overall_hit, + $br_overall_found, $br_overall_hit) = remove(); +} +elsif ($extract) +{ + ($ln_overall_found, $ln_overall_hit, + $fn_overall_found, $fn_overall_hit, + $br_overall_found, $br_overall_hit) = extract(); +} +elsif ($list) +{ + list(); +} +elsif ($diff) +{ + if (scalar(@ARGV) != 1) + { + die("ERROR: option --diff requires one additional argument!\n". + "Use $tool_name --help to get usage information\n"); + } + ($ln_overall_found, $ln_overall_hit, + $fn_overall_found, $fn_overall_hit, + $br_overall_found, $br_overall_hit) = diff(); +} +elsif (@opt_summary) +{ + ($ln_overall_found, $ln_overall_hit, + $fn_overall_found, $fn_overall_hit, + $br_overall_found, $br_overall_hit) = summary(); +} + +temp_cleanup(); + +if (defined($ln_overall_found)) { + print_overall_rate(1, $ln_overall_found, $ln_overall_hit, + 1, $fn_overall_found, $fn_overall_hit, + 1, $br_overall_found, $br_overall_hit); +} else { + info("Done.\n") if (!$list && !$capture); +} +exit(0); + +# +# print_usage(handle) +# +# Print usage information. +# + +sub print_usage(*) +{ + local *HANDLE = $_[0]; + + print(HANDLE < 1) + { + die("ERROR: only one of -z, -c, -a, -e, -r, -l, ". + "--diff or --summary allowed!\n". + "Use $tool_name --help to get usage information\n"); + } +} + + +# +# userspace_reset() +# +# Reset coverage data found in DIRECTORY by deleting all contained .da files. +# +# Die on error. +# + +sub userspace_reset() +{ + my $current_dir; + my @file_list; + + foreach $current_dir (@directory) + { + info("Deleting all .da files in $current_dir". + ($no_recursion?"\n":" and subdirectories\n")); + @file_list = `find "$current_dir" $maxdepth $follow -name \\*\\.da -o -name \\*\\.gcda -type f 2>/dev/null`; + chomp(@file_list); + foreach (@file_list) + { + unlink($_) or die("ERROR: cannot remove file $_!\n"); + } + } +} + + +# +# userspace_capture() +# +# Capture coverage data found in DIRECTORY and write it to a package (if +# TO_PACKAGE specified) or to OUTPUT_FILENAME or STDOUT. +# +# Die on error. +# + +sub userspace_capture() +{ + my $dir; + my $build; + + if (!defined($to_package)) { + lcov_geninfo(@directory); + return; + } + if (scalar(@directory) != 1) { + die("ERROR: -d may be specified only once with --to-package\n"); + } + $dir = $directory[0]; + if (defined($base_directory)) { + $build = $base_directory; + } else { + $build = $dir; + } + create_package($to_package, $dir, $build); +} + + +# +# kernel_reset() +# +# Reset kernel coverage. +# +# Die on error. +# + +sub kernel_reset() +{ + local *HANDLE; + my $reset_file; + + info("Resetting kernel execution counters\n"); + if (-e "$gcov_dir/vmlinux") { + $reset_file = "$gcov_dir/vmlinux"; + } elsif (-e "$gcov_dir/reset") { + $reset_file = "$gcov_dir/reset"; + } else { + die("ERROR: no reset control found in $gcov_dir\n"); + } + open(HANDLE, ">", $reset_file) or + die("ERROR: cannot write to $reset_file!\n"); + print(HANDLE "0"); + close(HANDLE); +} + + +# +# lcov_copy_single(from, to) +# +# Copy single regular file FROM to TO without checking its size. This is +# required to work with special files generated by the kernel +# seq_file-interface. +# +# +sub lcov_copy_single($$) +{ + my ($from, $to) = @_; + my $content; + local $/; + local *HANDLE; + + open(HANDLE, "<", $from) or die("ERROR: cannot read $from: $!\n"); + $content = ; + close(HANDLE); + open(HANDLE, ">", $to) or die("ERROR: cannot write $from: $!\n"); + if (defined($content)) { + print(HANDLE $content); + } + close(HANDLE); +} + +# +# lcov_find(dir, function, data[, extension, ...)]) +# +# Search DIR for files and directories whose name matches PATTERN and run +# FUNCTION for each match. If not pattern is specified, match all names. +# +# FUNCTION has the following prototype: +# function(dir, relative_name, data) +# +# Where: +# dir: the base directory for this search +# relative_name: the name relative to the base directory of this entry +# data: the DATA variable passed to lcov_find +# +sub lcov_find($$$;@) +{ + my ($dir, $fn, $data, @pattern) = @_; + my $result; + my $_fn = sub { + my $filename = $File::Find::name; + + if (defined($result)) { + return; + } + $filename = abs2rel($filename, $dir); + foreach (@pattern) { + if ($filename =~ /$_/) { + goto ok; + } + } + return; + ok: + $result = &$fn($dir, $filename, $data); + }; + if (scalar(@pattern) == 0) { + @pattern = ".*"; + } + find( { wanted => $_fn, no_chdir => 1 }, $dir); + + return $result; +} + +# +# lcov_copy_fn(from, rel, to) +# +# Copy directories, files and links from/rel to to/rel. +# + +sub lcov_copy_fn($$$) +{ + my ($from, $rel, $to) = @_; + my $absfrom = canonpath(catfile($from, $rel)); + my $absto = canonpath(catfile($to, $rel)); + + if (-d) { + if (! -d $absto) { + mkpath($absto) or + die("ERROR: cannot create directory $absto\n"); + chmod(0700, $absto); + } + } elsif (-l) { + # Copy symbolic link + my $link = readlink($absfrom); + + if (!defined($link)) { + die("ERROR: cannot read link $absfrom: $!\n"); + } + symlink($link, $absto) or + die("ERROR: cannot create link $absto: $!\n"); + } else { + lcov_copy_single($absfrom, $absto); + chmod(0600, $absto); + } + return undef; +} + +# +# lcov_copy(from, to, subdirs) +# +# Copy all specified SUBDIRS and files from directory FROM to directory TO. For +# regular files, copy file contents without checking its size. This is required +# to work with seq_file-generated files. +# + +sub lcov_copy($$;@) +{ + my ($from, $to, @subdirs) = @_; + my @pattern; + + foreach (@subdirs) { + push(@pattern, "^$_"); + } + lcov_find($from, \&lcov_copy_fn, $to, @pattern); +} + +# +# lcov_geninfo(directory) +# +# Call geninfo for the specified directory and with the parameters specified +# at the command line. +# + +sub lcov_geninfo(@) +{ + my (@dir) = @_; + my @param; + + # Capture data + info("Capturing coverage data from ".join(" ", @dir)."\n"); + @param = ("$tool_dir/geninfo", @dir); + if ($output_filename) + { + @param = (@param, "--output-filename", $output_filename); + } + if ($test_name) + { + @param = (@param, "--test-name", $test_name); + } + if ($follow) + { + @param = (@param, "--follow"); + } + if ($quiet) + { + @param = (@param, "--quiet"); + } + if (defined($checksum)) + { + if ($checksum) + { + @param = (@param, "--checksum"); + } + else + { + @param = (@param, "--no-checksum"); + } + } + if ($base_directory) + { + @param = (@param, "--base-directory", $base_directory); + } + if ($no_compat_libtool) + { + @param = (@param, "--no-compat-libtool"); + } + elsif ($compat_libtool) + { + @param = (@param, "--compat-libtool"); + } + if ($gcov_tool) + { + @param = (@param, "--gcov-tool", $gcov_tool); + } + foreach (@opt_ignore_errors) { + @param = (@param, "--ignore-errors", $_); + } + if ($no_recursion) { + @param = (@param, "--no-recursion"); + } + if ($initial) + { + @param = (@param, "--initial"); + } + if ($no_markers) + { + @param = (@param, "--no-markers"); + } + if ($opt_derive_func_data) + { + @param = (@param, "--derive-func-data"); + } + if ($opt_debug) + { + @param = (@param, "--debug"); + } + if (defined($opt_external) && $opt_external) + { + @param = (@param, "--external"); + } + if (defined($opt_external) && !$opt_external) + { + @param = (@param, "--no-external"); + } + if (defined($opt_compat)) { + @param = (@param, "--compat", $opt_compat); + } + if (%opt_rc) { + foreach my $key (keys(%opt_rc)) { + @param = (@param, "--rc", "$key=".$opt_rc{$key}); + } + } + if (defined($opt_config_file)) { + @param = (@param, "--config-file", $opt_config_file); + } + + system(@param) and exit($? >> 8); +} + +# +# read_file(filename) +# +# Return the contents of the file defined by filename. +# + +sub read_file($) +{ + my ($filename) = @_; + my $content; + local $\; + local *HANDLE; + + open(HANDLE, "<", $filename) || return undef; + $content = ; + close(HANDLE); + + return $content; +} + +# +# get_package(package_file) +# +# Unpack unprocessed coverage data files from package_file to a temporary +# directory and return directory name, build directory and gcov kernel version +# as found in package. +# + +sub get_package($) +{ + my ($file) = @_; + my $dir = create_temp_dir(); + my $gkv; + my $build; + my $cwd = getcwd(); + my $count; + local *HANDLE; + + info("Reading package $file:\n"); + info(" data directory .......: $dir\n"); + $file = abs_path($file); + chdir($dir); + open(HANDLE, "-|", "tar xvfz '$file' 2>/dev/null") + or die("ERROR: could not process package $file\n"); + while () { + if (/\.da$/ || /\.gcda$/) { + $count++; + } + } + close(HANDLE); + $build = read_file("$dir/$pkg_build_file"); + if (defined($build)) { + info(" build directory ......: $build\n"); + } + $gkv = read_file("$dir/$pkg_gkv_file"); + if (defined($gkv)) { + $gkv = int($gkv); + if ($gkv != $GKV_PROC && $gkv != $GKV_SYS) { + die("ERROR: unsupported gcov kernel version found ". + "($gkv)\n"); + } + info(" content type .........: kernel data\n"); + info(" gcov kernel version ..: %s\n", $GKV_NAME[$gkv]); + } else { + info(" content type .........: application data\n"); + } + info(" data files ...........: $count\n"); + chdir($cwd); + + return ($dir, $build, $gkv); +} + +# +# write_file(filename, $content) +# +# Create a file named filename and write the specified content to it. +# + +sub write_file($$) +{ + my ($filename, $content) = @_; + local *HANDLE; + + open(HANDLE, ">", $filename) || return 0; + print(HANDLE $content); + close(HANDLE) || return 0; + + return 1; +} + +# count_package_data(filename) +# +# Count the number of coverage data files in the specified package file. +# + +sub count_package_data($) +{ + my ($filename) = @_; + local *HANDLE; + my $count = 0; + + open(HANDLE, "-|", "tar tfz '$filename'") or return undef; + while () { + if (/\.da$/ || /\.gcda$/) { + $count++; + } + } + close(HANDLE); + return $count; +} + +# +# create_package(package_file, source_directory, build_directory[, +# kernel_gcov_version]) +# +# Store unprocessed coverage data files from source_directory to package_file. +# + +sub create_package($$$;$) +{ + my ($file, $dir, $build, $gkv) = @_; + my $cwd = getcwd(); + + # Print information about the package + info("Creating package $file:\n"); + info(" data directory .......: $dir\n"); + + # Handle build directory + if (defined($build)) { + info(" build directory ......: $build\n"); + write_file("$dir/$pkg_build_file", $build) + or die("ERROR: could not write to ". + "$dir/$pkg_build_file\n"); + } + + # Handle gcov kernel version data + if (defined($gkv)) { + info(" content type .........: kernel data\n"); + info(" gcov kernel version ..: %s\n", $GKV_NAME[$gkv]); + write_file("$dir/$pkg_gkv_file", $gkv) + or die("ERROR: could not write to ". + "$dir/$pkg_gkv_file\n"); + } else { + info(" content type .........: application data\n"); + } + + # Create package + $file = abs_path($file); + chdir($dir); + system("tar cfz $file .") + and die("ERROR: could not create package $file\n"); + + # Remove temporary files + unlink("$dir/$pkg_build_file"); + unlink("$dir/$pkg_gkv_file"); + + # Show number of data files + if (!$quiet) { + my $count = count_package_data($file); + + if (defined($count)) { + info(" data files ...........: $count\n"); + } + } + chdir($cwd); +} + +sub find_link_fn($$$) +{ + my ($from, $rel, $filename) = @_; + my $absfile = catfile($from, $rel, $filename); + + if (-l $absfile) { + return $absfile; + } + return undef; +} + +# +# get_base(dir) +# +# Return (BASE, OBJ), where +# - BASE: is the path to the kernel base directory relative to dir +# - OBJ: is the absolute path to the kernel build directory +# + +sub get_base($) +{ + my ($dir) = @_; + my $marker = "kernel/gcov/base.gcno"; + my $markerfile; + my $sys; + my $obj; + my $link; + + $markerfile = lcov_find($dir, \&find_link_fn, $marker); + if (!defined($markerfile)) { + return (undef, undef); + } + + # sys base is parent of parent of markerfile. + $sys = abs2rel(dirname(dirname(dirname($markerfile))), $dir); + + # obj base is parent of parent of markerfile link target. + $link = readlink($markerfile); + if (!defined($link)) { + die("ERROR: could not read $markerfile\n"); + } + $obj = dirname(dirname(dirname($link))); + + return ($sys, $obj); +} + +# +# apply_base_dir(data_dir, base_dir, build_dir, @directories) +# +# Make entries in @directories relative to data_dir. +# + +sub apply_base_dir($$$@) +{ + my ($data, $base, $build, @dirs) = @_; + my $dir; + my @result; + + foreach $dir (@dirs) { + # Is directory path relative to data directory? + if (-d catdir($data, $dir)) { + push(@result, $dir); + next; + } + # Relative to the auto-detected base-directory? + if (defined($base)) { + if (-d catdir($data, $base, $dir)) { + push(@result, catdir($base, $dir)); + next; + } + } + # Relative to the specified base-directory? + if (defined($base_directory)) { + if (file_name_is_absolute($base_directory)) { + $base = abs2rel($base_directory, rootdir()); + } else { + $base = $base_directory; + } + if (-d catdir($data, $base, $dir)) { + push(@result, catdir($base, $dir)); + next; + } + } + # Relative to the build directory? + if (defined($build)) { + if (file_name_is_absolute($build)) { + $base = abs2rel($build, rootdir()); + } else { + $base = $build; + } + if (-d catdir($data, $base, $dir)) { + push(@result, catdir($base, $dir)); + next; + } + } + die("ERROR: subdirectory $dir not found\n". + "Please use -b to specify the correct directory\n"); + } + return @result; +} + +# +# copy_gcov_dir(dir, [@subdirectories]) +# +# Create a temporary directory and copy all or, if specified, only some +# subdirectories from dir to that directory. Return the name of the temporary +# directory. +# + +sub copy_gcov_dir($;@) +{ + my ($data, @dirs) = @_; + my $tempdir = create_temp_dir(); + + info("Copying data to temporary directory $tempdir\n"); + lcov_copy($data, $tempdir, @dirs); + + return $tempdir; +} + +# +# kernel_capture_initial +# +# Capture initial kernel coverage data, i.e. create a coverage data file from +# static graph files which contains zero coverage data for all instrumented +# lines. +# + +sub kernel_capture_initial() +{ + my $build; + my $source; + my @params; + + if (defined($base_directory)) { + $build = $base_directory; + $source = "specified"; + } else { + (undef, $build) = get_base($gcov_dir); + if (!defined($build)) { + die("ERROR: could not auto-detect build directory.\n". + "Please use -b to specify the build directory\n"); + } + $source = "auto-detected"; + } + info("Using $build as kernel build directory ($source)\n"); + # Build directory needs to be passed to geninfo + $base_directory = $build; + if (@kernel_directory) { + foreach my $dir (@kernel_directory) { + push(@params, "$build/$dir"); + } + } else { + push(@params, $build); + } + lcov_geninfo(@params); +} + +# +# kernel_capture_from_dir(directory, gcov_kernel_version, build) +# +# Perform the actual kernel coverage capturing from the specified directory +# assuming that the data was copied from the specified gcov kernel version. +# + +sub kernel_capture_from_dir($$$) +{ + my ($dir, $gkv, $build) = @_; + + # Create package or coverage file + if (defined($to_package)) { + create_package($to_package, $dir, $build, $gkv); + } else { + # Build directory needs to be passed to geninfo + $base_directory = $build; + lcov_geninfo($dir); + } +} + +# +# adjust_kernel_dir(dir, build) +# +# Adjust directories specified with -k so that they point to the directory +# relative to DIR. Return the build directory if specified or the auto- +# detected build-directory. +# + +sub adjust_kernel_dir($$) +{ + my ($dir, $build) = @_; + my ($sys_base, $build_auto) = get_base($dir); + + if (!defined($build)) { + $build = $build_auto; + } + if (!defined($build)) { + die("ERROR: could not auto-detect build directory.\n". + "Please use -b to specify the build directory\n"); + } + # Make @kernel_directory relative to sysfs base + if (@kernel_directory) { + @kernel_directory = apply_base_dir($dir, $sys_base, $build, + @kernel_directory); + } + return $build; +} + +sub kernel_capture() +{ + my $data_dir; + my $build = $base_directory; + + if ($gcov_gkv == $GKV_SYS) { + $build = adjust_kernel_dir($gcov_dir, $build); + } + $data_dir = copy_gcov_dir($gcov_dir, @kernel_directory); + kernel_capture_from_dir($data_dir, $gcov_gkv, $build); +} + +# +# package_capture() +# +# Capture coverage data from a package of unprocessed coverage data files +# as generated by lcov --to-package. +# + +sub package_capture() +{ + my $dir; + my $build; + my $gkv; + + ($dir, $build, $gkv) = get_package($from_package); + + # Check for build directory + if (defined($base_directory)) { + if (defined($build)) { + info("Using build directory specified by -b.\n"); + } + $build = $base_directory; + } + + # Do the actual capture + if (defined($gkv)) { + if ($gkv == $GKV_SYS) { + $build = adjust_kernel_dir($dir, $build); + } + if (@kernel_directory) { + $dir = copy_gcov_dir($dir, @kernel_directory); + } + kernel_capture_from_dir($dir, $gkv, $build); + } else { + # Build directory needs to be passed to geninfo + $base_directory = $build; + lcov_geninfo($dir); + } +} + + +# +# info(printf_parameter) +# +# Use printf to write PRINTF_PARAMETER to stdout only when the $quiet flag +# is not set. +# + +sub info(@) +{ + if (!$quiet) + { + # Print info string + if ($to_file) + { + printf(@_) + } + else + { + # Don't interfere with the .info output to STDOUT + printf(STDERR @_); + } + } +} + + +# +# create_temp_dir() +# +# Create a temporary directory and return its path. +# +# Die on error. +# + +sub create_temp_dir() +{ + my $dir; + + if (defined($tmp_dir)) { + $dir = tempdir(DIR => $tmp_dir, CLEANUP => 1); + } else { + $dir = tempdir(CLEANUP => 1); + } + if (!defined($dir)) { + die("ERROR: cannot create temporary directory\n"); + } + push(@temp_dirs, $dir); + + return $dir; +} + + +# +# br_taken_to_num(taken) +# +# Convert a branch taken value .info format to number format. +# + +sub br_taken_to_num($) +{ + my ($taken) = @_; + + return 0 if ($taken eq '-'); + return $taken + 1; +} + + +# +# br_num_to_taken(taken) +# +# Convert a branch taken value in number format to .info format. +# + +sub br_num_to_taken($) +{ + my ($taken) = @_; + + return '-' if ($taken == 0); + return $taken - 1; +} + + +# +# br_taken_add(taken1, taken2) +# +# Return the result of taken1 + taken2 for 'branch taken' values. +# + +sub br_taken_add($$) +{ + my ($t1, $t2) = @_; + + return $t1 if (!defined($t2)); + return $t2 if (!defined($t1)); + return $t1 if ($t2 eq '-'); + return $t2 if ($t1 eq '-'); + return $t1 + $t2; +} + + +# +# br_taken_sub(taken1, taken2) +# +# Return the result of taken1 - taken2 for 'branch taken' values. Return 0 +# if the result would become negative. +# + +sub br_taken_sub($$) +{ + my ($t1, $t2) = @_; + + return $t1 if (!defined($t2)); + return undef if (!defined($t1)); + return $t1 if ($t1 eq '-'); + return $t1 if ($t2 eq '-'); + return 0 if $t2 > $t1; + return $t1 - $t2; +} + + +# +# +# br_ivec_len(vector) +# +# Return the number of entries in the branch coverage vector. +# + +sub br_ivec_len($) +{ + my ($vec) = @_; + + return 0 if (!defined($vec)); + return (length($vec) * 8 / $BR_VEC_WIDTH) / $BR_VEC_ENTRIES; +} + + +# +# br_ivec_push(vector, block, branch, taken) +# +# Add an entry to the branch coverage vector. If an entry with the same +# branch ID already exists, add the corresponding taken values. +# + +sub br_ivec_push($$$$) +{ + my ($vec, $block, $branch, $taken) = @_; + my $offset; + my $num = br_ivec_len($vec); + my $i; + + $vec = "" if (!defined($vec)); + $block = $BR_VEC_MAX if $block < 0; + + # Check if branch already exists in vector + for ($i = 0; $i < $num; $i++) { + my ($v_block, $v_branch, $v_taken) = br_ivec_get($vec, $i); + $v_block = $BR_VEC_MAX if $v_block < 0; + + next if ($v_block != $block || $v_branch != $branch); + + # Add taken counts + $taken = br_taken_add($taken, $v_taken); + last; + } + + $offset = $i * $BR_VEC_ENTRIES; + $taken = br_taken_to_num($taken); + + # Add to vector + vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH) = $block; + vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH) = $branch; + vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH) = $taken; + + return $vec; +} + + +# +# br_ivec_get(vector, number) +# +# Return an entry from the branch coverage vector. +# + +sub br_ivec_get($$) +{ + my ($vec, $num) = @_; + my $block; + my $branch; + my $taken; + my $offset = $num * $BR_VEC_ENTRIES; + + # Retrieve data from vector + $block = vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH); + $block = -1 if ($block == $BR_VEC_MAX); + $branch = vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH); + $taken = vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH); + + # Decode taken value from an integer + $taken = br_num_to_taken($taken); + + return ($block, $branch, $taken); +} + + +# +# get_br_found_and_hit(brcount) +# +# Return (br_found, br_hit) for brcount +# + +sub get_br_found_and_hit($) +{ + my ($brcount) = @_; + my $line; + my $br_found = 0; + my $br_hit = 0; + + foreach $line (keys(%{$brcount})) { + my $brdata = $brcount->{$line}; + my $i; + my $num = br_ivec_len($brdata); + + for ($i = 0; $i < $num; $i++) { + my $taken; + + (undef, undef, $taken) = br_ivec_get($brdata, $i); + + $br_found++; + $br_hit++ if ($taken ne "-" && $taken > 0); + } + } + + return ($br_found, $br_hit); +} + + +# +# read_info_file(info_filename) +# +# Read in the contents of the .info file specified by INFO_FILENAME. Data will +# be returned as a reference to a hash containing the following mappings: +# +# %result: for each filename found in file -> \%data +# +# %data: "test" -> \%testdata +# "sum" -> \%sumcount +# "func" -> \%funcdata +# "found" -> $lines_found (number of instrumented lines found in file) +# "hit" -> $lines_hit (number of executed lines in file) +# "f_found" -> $fn_found (number of instrumented functions found in file) +# "f_hit" -> $fn_hit (number of executed functions in file) +# "b_found" -> $br_found (number of instrumented branches found in file) +# "b_hit" -> $br_hit (number of executed branches in file) +# "check" -> \%checkdata +# "testfnc" -> \%testfncdata +# "sumfnc" -> \%sumfnccount +# "testbr" -> \%testbrdata +# "sumbr" -> \%sumbrcount +# +# %testdata : name of test affecting this file -> \%testcount +# %testfncdata: name of test affecting this file -> \%testfnccount +# %testbrdata: name of test affecting this file -> \%testbrcount +# +# %testcount : line number -> execution count for a single test +# %testfnccount: function name -> execution count for a single test +# %testbrcount : line number -> branch coverage data for a single test +# %sumcount : line number -> execution count for all tests +# %sumfnccount : function name -> execution count for all tests +# %sumbrcount : line number -> branch coverage data for all tests +# %funcdata : function name -> line number +# %checkdata : line number -> checksum of source code line +# $brdata : vector of items: block, branch, taken +# +# Note that .info file sections referring to the same file and test name +# will automatically be combined by adding all execution counts. +# +# Note that if INFO_FILENAME ends with ".gz", it is assumed that the file +# is compressed using GZIP. If available, GUNZIP will be used to decompress +# this file. +# +# Die on error. +# + +sub read_info_file($) +{ + my $tracefile = $_[0]; # Name of tracefile + my %result; # Resulting hash: file -> data + my $data; # Data handle for current entry + my $testdata; # " " + my $testcount; # " " + my $sumcount; # " " + my $funcdata; # " " + my $checkdata; # " " + my $testfncdata; + my $testfnccount; + my $sumfnccount; + my $testbrdata; + my $testbrcount; + my $sumbrcount; + my $line; # Current line read from .info file + my $testname; # Current test name + my $filename; # Current filename + my $hitcount; # Count for lines hit + my $count; # Execution count of current line + my $negative; # If set, warn about negative counts + my $changed_testname; # If set, warn about changed testname + my $line_checksum; # Checksum of current line + local *INFO_HANDLE; # Filehandle for .info file + + info("Reading tracefile $tracefile\n"); + + # Check if file exists and is readable + stat($_[0]); + if (!(-r _)) + { + die("ERROR: cannot read file $_[0]!\n"); + } + + # Check if this is really a plain file + if (!(-f _)) + { + die("ERROR: not a plain file: $_[0]!\n"); + } + + # Check for .gz extension + if ($_[0] =~ /\.gz$/) + { + # Check for availability of GZIP tool + system_no_output(1, "gunzip" ,"-h") + and die("ERROR: gunzip command not available!\n"); + + # Check integrity of compressed file + system_no_output(1, "gunzip", "-t", $_[0]) + and die("ERROR: integrity check failed for ". + "compressed file $_[0]!\n"); + + # Open compressed file + open(INFO_HANDLE, "-|", "gunzip -c '$_[0]'") + or die("ERROR: cannot start gunzip to decompress ". + "file $_[0]!\n"); + } + else + { + # Open decompressed file + open(INFO_HANDLE, "<", $_[0]) + or die("ERROR: cannot read file $_[0]!\n"); + } + + $testname = ""; + while () + { + chomp($_); + $line = $_; + + # Switch statement + foreach ($line) + { + /^TN:([^,]*)(,diff)?/ && do + { + # Test name information found + $testname = defined($1) ? $1 : ""; + if ($testname =~ s/\W/_/g) + { + $changed_testname = 1; + } + $testname .= $2 if (defined($2)); + last; + }; + + /^[SK]F:(.*)/ && do + { + # Filename information found + # Retrieve data for new entry + $filename = $1; + + $data = $result{$filename}; + ($testdata, $sumcount, $funcdata, $checkdata, + $testfncdata, $sumfnccount, $testbrdata, + $sumbrcount) = + get_info_entry($data); + + if (defined($testname)) + { + $testcount = $testdata->{$testname}; + $testfnccount = $testfncdata->{$testname}; + $testbrcount = $testbrdata->{$testname}; + } + else + { + $testcount = {}; + $testfnccount = {}; + $testbrcount = {}; + } + last; + }; + + /^DA:(\d+),(-?\d+)(,[^,\s]+)?/ && do + { + # Fix negative counts + $count = $2 < 0 ? 0 : $2; + if ($2 < 0) + { + $negative = 1; + } + # Execution count found, add to structure + # Add summary counts + $sumcount->{$1} += $count; + + # Add test-specific counts + if (defined($testname)) + { + $testcount->{$1} += $count; + } + + # Store line checksum if available + if (defined($3)) + { + $line_checksum = substr($3, 1); + + # Does it match a previous definition + if (defined($checkdata->{$1}) && + ($checkdata->{$1} ne + $line_checksum)) + { + die("ERROR: checksum mismatch ". + "at $filename:$1\n"); + } + + $checkdata->{$1} = $line_checksum; + } + last; + }; + + /^FN:(\d+),([^,]+)/ && do + { + last if (!$func_coverage); + + # Function data found, add to structure + $funcdata->{$2} = $1; + + # Also initialize function call data + if (!defined($sumfnccount->{$2})) { + $sumfnccount->{$2} = 0; + } + if (defined($testname)) + { + if (!defined($testfnccount->{$2})) { + $testfnccount->{$2} = 0; + } + } + last; + }; + + /^FNDA:(\d+),([^,]+)/ && do + { + last if (!$func_coverage); + + # Function call count found, add to structure + # Add summary counts + $sumfnccount->{$2} += $1; + + # Add test-specific counts + if (defined($testname)) + { + $testfnccount->{$2} += $1; + } + last; + }; + + /^BRDA:(\d+),(\d+),(\d+),(\d+|-)/ && do { + # Branch coverage data found + my ($line, $block, $branch, $taken) = + ($1, $2, $3, $4); + + last if (!$br_coverage); + $sumbrcount->{$line} = + br_ivec_push($sumbrcount->{$line}, + $block, $branch, $taken); + + # Add test-specific counts + if (defined($testname)) { + $testbrcount->{$line} = + br_ivec_push( + $testbrcount->{$line}, + $block, $branch, + $taken); + } + last; + }; + + /^end_of_record/ && do + { + # Found end of section marker + if ($filename) + { + # Store current section data + if (defined($testname)) + { + $testdata->{$testname} = + $testcount; + $testfncdata->{$testname} = + $testfnccount; + $testbrdata->{$testname} = + $testbrcount; + } + + set_info_entry($data, $testdata, + $sumcount, $funcdata, + $checkdata, $testfncdata, + $sumfnccount, + $testbrdata, + $sumbrcount); + $result{$filename} = $data; + last; + } + }; + + # default + last; + } + } + close(INFO_HANDLE); + + # Calculate hit and found values for lines and functions of each file + foreach $filename (keys(%result)) + { + $data = $result{$filename}; + + ($testdata, $sumcount, undef, undef, $testfncdata, + $sumfnccount, $testbrdata, $sumbrcount) = + get_info_entry($data); + + # Filter out empty files + if (scalar(keys(%{$sumcount})) == 0) + { + delete($result{$filename}); + next; + } + # Filter out empty test cases + foreach $testname (keys(%{$testdata})) + { + if (!defined($testdata->{$testname}) || + scalar(keys(%{$testdata->{$testname}})) == 0) + { + delete($testdata->{$testname}); + delete($testfncdata->{$testname}); + } + } + + $data->{"found"} = scalar(keys(%{$sumcount})); + $hitcount = 0; + + foreach (keys(%{$sumcount})) + { + if ($sumcount->{$_} > 0) { $hitcount++; } + } + + $data->{"hit"} = $hitcount; + + # Get found/hit values for function call data + $data->{"f_found"} = scalar(keys(%{$sumfnccount})); + $hitcount = 0; + + foreach (keys(%{$sumfnccount})) { + if ($sumfnccount->{$_} > 0) { + $hitcount++; + } + } + $data->{"f_hit"} = $hitcount; + + # Get found/hit values for branch data + { + my ($br_found, $br_hit) = get_br_found_and_hit($sumbrcount); + + $data->{"b_found"} = $br_found; + $data->{"b_hit"} = $br_hit; + } + } + + if (scalar(keys(%result)) == 0) + { + die("ERROR: no valid records found in tracefile $tracefile\n"); + } + if ($negative) + { + warn("WARNING: negative counts found in tracefile ". + "$tracefile\n"); + } + if ($changed_testname) + { + warn("WARNING: invalid characters removed from testname in ". + "tracefile $tracefile\n"); + } + + return(\%result); +} + + +# +# get_info_entry(hash_ref) +# +# Retrieve data from an entry of the structure generated by read_info_file(). +# Return a list of references to hashes: +# (test data hash ref, sum count hash ref, funcdata hash ref, checkdata hash +# ref, testfncdata hash ref, sumfnccount hash ref, testbrdata hash ref, +# sumbrcount hash ref, lines found, lines hit, functions found, +# functions hit, branches found, branches hit) +# + +sub get_info_entry($) +{ + my $testdata_ref = $_[0]->{"test"}; + my $sumcount_ref = $_[0]->{"sum"}; + my $funcdata_ref = $_[0]->{"func"}; + my $checkdata_ref = $_[0]->{"check"}; + my $testfncdata = $_[0]->{"testfnc"}; + my $sumfnccount = $_[0]->{"sumfnc"}; + my $testbrdata = $_[0]->{"testbr"}; + my $sumbrcount = $_[0]->{"sumbr"}; + my $lines_found = $_[0]->{"found"}; + my $lines_hit = $_[0]->{"hit"}; + my $f_found = $_[0]->{"f_found"}; + my $f_hit = $_[0]->{"f_hit"}; + my $br_found = $_[0]->{"b_found"}; + my $br_hit = $_[0]->{"b_hit"}; + + return ($testdata_ref, $sumcount_ref, $funcdata_ref, $checkdata_ref, + $testfncdata, $sumfnccount, $testbrdata, $sumbrcount, + $lines_found, $lines_hit, $f_found, $f_hit, + $br_found, $br_hit); +} + + +# +# set_info_entry(hash_ref, testdata_ref, sumcount_ref, funcdata_ref, +# checkdata_ref, testfncdata_ref, sumfcncount_ref, +# testbrdata_ref, sumbrcount_ref[,lines_found, +# lines_hit, f_found, f_hit, $b_found, $b_hit]) +# +# Update the hash referenced by HASH_REF with the provided data references. +# + +sub set_info_entry($$$$$$$$$;$$$$$$) +{ + my $data_ref = $_[0]; + + $data_ref->{"test"} = $_[1]; + $data_ref->{"sum"} = $_[2]; + $data_ref->{"func"} = $_[3]; + $data_ref->{"check"} = $_[4]; + $data_ref->{"testfnc"} = $_[5]; + $data_ref->{"sumfnc"} = $_[6]; + $data_ref->{"testbr"} = $_[7]; + $data_ref->{"sumbr"} = $_[8]; + + if (defined($_[9])) { $data_ref->{"found"} = $_[9]; } + if (defined($_[10])) { $data_ref->{"hit"} = $_[10]; } + if (defined($_[11])) { $data_ref->{"f_found"} = $_[11]; } + if (defined($_[12])) { $data_ref->{"f_hit"} = $_[12]; } + if (defined($_[13])) { $data_ref->{"b_found"} = $_[13]; } + if (defined($_[14])) { $data_ref->{"b_hit"} = $_[14]; } +} + + +# +# add_counts(data1_ref, data2_ref) +# +# DATA1_REF and DATA2_REF are references to hashes containing a mapping +# +# line number -> execution count +# +# Return a list (RESULT_REF, LINES_FOUND, LINES_HIT) where RESULT_REF +# is a reference to a hash containing the combined mapping in which +# execution counts are added. +# + +sub add_counts($$) +{ + my $data1_ref = $_[0]; # Hash 1 + my $data2_ref = $_[1]; # Hash 2 + my %result; # Resulting hash + my $line; # Current line iteration scalar + my $data1_count; # Count of line in hash1 + my $data2_count; # Count of line in hash2 + my $found = 0; # Total number of lines found + my $hit = 0; # Number of lines with a count > 0 + + foreach $line (keys(%$data1_ref)) + { + $data1_count = $data1_ref->{$line}; + $data2_count = $data2_ref->{$line}; + + # Add counts if present in both hashes + if (defined($data2_count)) { $data1_count += $data2_count; } + + # Store sum in %result + $result{$line} = $data1_count; + + $found++; + if ($data1_count > 0) { $hit++; } + } + + # Add lines unique to data2_ref + foreach $line (keys(%$data2_ref)) + { + # Skip lines already in data1_ref + if (defined($data1_ref->{$line})) { next; } + + # Copy count from data2_ref + $result{$line} = $data2_ref->{$line}; + + $found++; + if ($result{$line} > 0) { $hit++; } + } + + return (\%result, $found, $hit); +} + + +# +# merge_checksums(ref1, ref2, filename) +# +# REF1 and REF2 are references to hashes containing a mapping +# +# line number -> checksum +# +# Merge checksum lists defined in REF1 and REF2 and return reference to +# resulting hash. Die if a checksum for a line is defined in both hashes +# but does not match. +# + +sub merge_checksums($$$) +{ + my $ref1 = $_[0]; + my $ref2 = $_[1]; + my $filename = $_[2]; + my %result; + my $line; + + foreach $line (keys(%{$ref1})) + { + if (defined($ref2->{$line}) && + ($ref1->{$line} ne $ref2->{$line})) + { + die("ERROR: checksum mismatch at $filename:$line\n"); + } + $result{$line} = $ref1->{$line}; + } + + foreach $line (keys(%{$ref2})) + { + $result{$line} = $ref2->{$line}; + } + + return \%result; +} + + +# +# merge_func_data(funcdata1, funcdata2, filename) +# + +sub merge_func_data($$$) +{ + my ($funcdata1, $funcdata2, $filename) = @_; + my %result; + my $func; + + if (defined($funcdata1)) { + %result = %{$funcdata1}; + } + + foreach $func (keys(%{$funcdata2})) { + my $line1 = $result{$func}; + my $line2 = $funcdata2->{$func}; + + if (defined($line1) && ($line1 != $line2)) { + warn("WARNING: function data mismatch at ". + "$filename:$line2\n"); + next; + } + $result{$func} = $line2; + } + + return \%result; +} + + +# +# add_fnccount(fnccount1, fnccount2) +# +# Add function call count data. Return list (fnccount_added, f_found, f_hit) +# + +sub add_fnccount($$) +{ + my ($fnccount1, $fnccount2) = @_; + my %result; + my $f_found; + my $f_hit; + my $function; + + if (defined($fnccount1)) { + %result = %{$fnccount1}; + } + foreach $function (keys(%{$fnccount2})) { + $result{$function} += $fnccount2->{$function}; + } + $f_found = scalar(keys(%result)); + $f_hit = 0; + foreach $function (keys(%result)) { + if ($result{$function} > 0) { + $f_hit++; + } + } + + return (\%result, $f_found, $f_hit); +} + +# +# add_testfncdata(testfncdata1, testfncdata2) +# +# Add function call count data for several tests. Return reference to +# added_testfncdata. +# + +sub add_testfncdata($$) +{ + my ($testfncdata1, $testfncdata2) = @_; + my %result; + my $testname; + + foreach $testname (keys(%{$testfncdata1})) { + if (defined($testfncdata2->{$testname})) { + my $fnccount; + + # Function call count data for this testname exists + # in both data sets: merge + ($fnccount) = add_fnccount( + $testfncdata1->{$testname}, + $testfncdata2->{$testname}); + $result{$testname} = $fnccount; + next; + } + # Function call count data for this testname is unique to + # data set 1: copy + $result{$testname} = $testfncdata1->{$testname}; + } + + # Add count data for testnames unique to data set 2 + foreach $testname (keys(%{$testfncdata2})) { + if (!defined($result{$testname})) { + $result{$testname} = $testfncdata2->{$testname}; + } + } + return \%result; +} + + +# +# brcount_to_db(brcount) +# +# Convert brcount data to the following format: +# +# db: line number -> block hash +# block hash: block number -> branch hash +# branch hash: branch number -> taken value +# + +sub brcount_to_db($) +{ + my ($brcount) = @_; + my $line; + my $db; + + # Add branches from first count to database + foreach $line (keys(%{$brcount})) { + my $brdata = $brcount->{$line}; + my $i; + my $num = br_ivec_len($brdata); + + for ($i = 0; $i < $num; $i++) { + my ($block, $branch, $taken) = br_ivec_get($brdata, $i); + + $db->{$line}->{$block}->{$branch} = $taken; + } + } + + return $db; +} + + +# +# db_to_brcount(db) +# +# Convert branch coverage data back to brcount format. +# + +sub db_to_brcount($) +{ + my ($db) = @_; + my $line; + my $brcount = {}; + my $br_found = 0; + my $br_hit = 0; + + # Convert database back to brcount format + foreach $line (sort({$a <=> $b} keys(%{$db}))) { + my $ldata = $db->{$line}; + my $brdata; + my $block; + + foreach $block (sort({$a <=> $b} keys(%{$ldata}))) { + my $bdata = $ldata->{$block}; + my $branch; + + foreach $branch (sort({$a <=> $b} keys(%{$bdata}))) { + my $taken = $bdata->{$branch}; + + $br_found++; + $br_hit++ if ($taken ne "-" && $taken > 0); + $brdata = br_ivec_push($brdata, $block, + $branch, $taken); + } + } + $brcount->{$line} = $brdata; + } + + return ($brcount, $br_found, $br_hit); +} + + +# combine_brcount(brcount1, brcount2, type) +# +# If add is BR_ADD, add branch coverage data and return list (brcount_added, +# br_found, br_hit). If add is BR_SUB, subtract the taken values of brcount2 +# from brcount1 and return (brcount_sub, br_found, br_hit). +# + +sub combine_brcount($$$) +{ + my ($brcount1, $brcount2, $type) = @_; + my $line; + my $block; + my $branch; + my $taken; + my $db; + my $br_found = 0; + my $br_hit = 0; + my $result; + + # Convert branches from first count to database + $db = brcount_to_db($brcount1); + # Combine values from database and second count + foreach $line (keys(%{$brcount2})) { + my $brdata = $brcount2->{$line}; + my $num = br_ivec_len($brdata); + my $i; + + for ($i = 0; $i < $num; $i++) { + ($block, $branch, $taken) = br_ivec_get($brdata, $i); + my $new_taken = $db->{$line}->{$block}->{$branch}; + + if ($type == $BR_ADD) { + $new_taken = br_taken_add($new_taken, $taken); + } elsif ($type == $BR_SUB) { + $new_taken = br_taken_sub($new_taken, $taken); + } + $db->{$line}->{$block}->{$branch} = $new_taken + if (defined($new_taken)); + } + } + # Convert database back to brcount format + ($result, $br_found, $br_hit) = db_to_brcount($db); + + return ($result, $br_found, $br_hit); +} + + +# +# add_testbrdata(testbrdata1, testbrdata2) +# +# Add branch coverage data for several tests. Return reference to +# added_testbrdata. +# + +sub add_testbrdata($$) +{ + my ($testbrdata1, $testbrdata2) = @_; + my %result; + my $testname; + + foreach $testname (keys(%{$testbrdata1})) { + if (defined($testbrdata2->{$testname})) { + my $brcount; + + # Branch coverage data for this testname exists + # in both data sets: add + ($brcount) = combine_brcount( + $testbrdata1->{$testname}, + $testbrdata2->{$testname}, $BR_ADD); + $result{$testname} = $brcount; + next; + } + # Branch coverage data for this testname is unique to + # data set 1: copy + $result{$testname} = $testbrdata1->{$testname}; + } + + # Add count data for testnames unique to data set 2 + foreach $testname (keys(%{$testbrdata2})) { + if (!defined($result{$testname})) { + $result{$testname} = $testbrdata2->{$testname}; + } + } + return \%result; +} + + +# +# combine_info_entries(entry_ref1, entry_ref2, filename) +# +# Combine .info data entry hashes referenced by ENTRY_REF1 and ENTRY_REF2. +# Return reference to resulting hash. +# + +sub combine_info_entries($$$) +{ + my $entry1 = $_[0]; # Reference to hash containing first entry + my $testdata1; + my $sumcount1; + my $funcdata1; + my $checkdata1; + my $testfncdata1; + my $sumfnccount1; + my $testbrdata1; + my $sumbrcount1; + + my $entry2 = $_[1]; # Reference to hash containing second entry + my $testdata2; + my $sumcount2; + my $funcdata2; + my $checkdata2; + my $testfncdata2; + my $sumfnccount2; + my $testbrdata2; + my $sumbrcount2; + + my %result; # Hash containing combined entry + my %result_testdata; + my $result_sumcount = {}; + my $result_funcdata; + my $result_testfncdata; + my $result_sumfnccount; + my $result_testbrdata; + my $result_sumbrcount; + my $lines_found; + my $lines_hit; + my $f_found; + my $f_hit; + my $br_found; + my $br_hit; + + my $testname; + my $filename = $_[2]; + + # Retrieve data + ($testdata1, $sumcount1, $funcdata1, $checkdata1, $testfncdata1, + $sumfnccount1, $testbrdata1, $sumbrcount1) = get_info_entry($entry1); + ($testdata2, $sumcount2, $funcdata2, $checkdata2, $testfncdata2, + $sumfnccount2, $testbrdata2, $sumbrcount2) = get_info_entry($entry2); + + # Merge checksums + $checkdata1 = merge_checksums($checkdata1, $checkdata2, $filename); + + # Combine funcdata + $result_funcdata = merge_func_data($funcdata1, $funcdata2, $filename); + + # Combine function call count data + $result_testfncdata = add_testfncdata($testfncdata1, $testfncdata2); + ($result_sumfnccount, $f_found, $f_hit) = + add_fnccount($sumfnccount1, $sumfnccount2); + + # Combine branch coverage data + $result_testbrdata = add_testbrdata($testbrdata1, $testbrdata2); + ($result_sumbrcount, $br_found, $br_hit) = + combine_brcount($sumbrcount1, $sumbrcount2, $BR_ADD); + + # Combine testdata + foreach $testname (keys(%{$testdata1})) + { + if (defined($testdata2->{$testname})) + { + # testname is present in both entries, requires + # combination + ($result_testdata{$testname}) = + add_counts($testdata1->{$testname}, + $testdata2->{$testname}); + } + else + { + # testname only present in entry1, add to result + $result_testdata{$testname} = $testdata1->{$testname}; + } + + # update sum count hash + ($result_sumcount, $lines_found, $lines_hit) = + add_counts($result_sumcount, + $result_testdata{$testname}); + } + + foreach $testname (keys(%{$testdata2})) + { + # Skip testnames already covered by previous iteration + if (defined($testdata1->{$testname})) { next; } + + # testname only present in entry2, add to result hash + $result_testdata{$testname} = $testdata2->{$testname}; + + # update sum count hash + ($result_sumcount, $lines_found, $lines_hit) = + add_counts($result_sumcount, + $result_testdata{$testname}); + } + + # Calculate resulting sumcount + + # Store result + set_info_entry(\%result, \%result_testdata, $result_sumcount, + $result_funcdata, $checkdata1, $result_testfncdata, + $result_sumfnccount, $result_testbrdata, + $result_sumbrcount, $lines_found, $lines_hit, + $f_found, $f_hit, $br_found, $br_hit); + + return(\%result); +} + + +# +# combine_info_files(info_ref1, info_ref2) +# +# Combine .info data in hashes referenced by INFO_REF1 and INFO_REF2. Return +# reference to resulting hash. +# + +sub combine_info_files($$) +{ + my %hash1 = %{$_[0]}; + my %hash2 = %{$_[1]}; + my $filename; + + foreach $filename (keys(%hash2)) + { + if ($hash1{$filename}) + { + # Entry already exists in hash1, combine them + $hash1{$filename} = + combine_info_entries($hash1{$filename}, + $hash2{$filename}, + $filename); + } + else + { + # Entry is unique in both hashes, simply add to + # resulting hash + $hash1{$filename} = $hash2{$filename}; + } + } + + return(\%hash1); +} + + +# +# add_traces() +# + +sub add_traces() +{ + my $total_trace; + my $current_trace; + my $tracefile; + my @result; + local *INFO_HANDLE; + + info("Combining tracefiles.\n"); + + foreach $tracefile (@add_tracefile) + { + $current_trace = read_info_file($tracefile); + if ($total_trace) + { + $total_trace = combine_info_files($total_trace, + $current_trace); + } + else + { + $total_trace = $current_trace; + } + } + + # Write combined data + if ($to_file) + { + info("Writing data to $output_filename\n"); + open(INFO_HANDLE, ">", $output_filename) + or die("ERROR: cannot write to $output_filename!\n"); + @result = write_info_file(*INFO_HANDLE, $total_trace); + close(*INFO_HANDLE); + } + else + { + @result = write_info_file(*STDOUT, $total_trace); + } + + return @result; +} + + +# +# write_info_file(filehandle, data) +# + +sub write_info_file(*$) +{ + local *INFO_HANDLE = $_[0]; + my %data = %{$_[1]}; + my $source_file; + my $entry; + my $testdata; + my $sumcount; + my $funcdata; + my $checkdata; + my $testfncdata; + my $sumfnccount; + my $testbrdata; + my $sumbrcount; + my $testname; + my $line; + my $func; + my $testcount; + my $testfnccount; + my $testbrcount; + my $found; + my $hit; + my $f_found; + my $f_hit; + my $br_found; + my $br_hit; + my $ln_total_found = 0; + my $ln_total_hit = 0; + my $fn_total_found = 0; + my $fn_total_hit = 0; + my $br_total_found = 0; + my $br_total_hit = 0; + + foreach $source_file (sort(keys(%data))) + { + $entry = $data{$source_file}; + ($testdata, $sumcount, $funcdata, $checkdata, $testfncdata, + $sumfnccount, $testbrdata, $sumbrcount, $found, $hit, + $f_found, $f_hit, $br_found, $br_hit) = + get_info_entry($entry); + + # Add to totals + $ln_total_found += $found; + $ln_total_hit += $hit; + $fn_total_found += $f_found; + $fn_total_hit += $f_hit; + $br_total_found += $br_found; + $br_total_hit += $br_hit; + + foreach $testname (sort(keys(%{$testdata}))) + { + $testcount = $testdata->{$testname}; + $testfnccount = $testfncdata->{$testname}; + $testbrcount = $testbrdata->{$testname}; + $found = 0; + $hit = 0; + + print(INFO_HANDLE "TN:$testname\n"); + print(INFO_HANDLE "SF:$source_file\n"); + + # Write function related data + foreach $func ( + sort({$funcdata->{$a} <=> $funcdata->{$b}} + keys(%{$funcdata}))) + { + print(INFO_HANDLE "FN:".$funcdata->{$func}. + ",$func\n"); + } + foreach $func (keys(%{$testfnccount})) { + print(INFO_HANDLE "FNDA:". + $testfnccount->{$func}. + ",$func\n"); + } + ($f_found, $f_hit) = + get_func_found_and_hit($testfnccount); + print(INFO_HANDLE "FNF:$f_found\n"); + print(INFO_HANDLE "FNH:$f_hit\n"); + + # Write branch related data + $br_found = 0; + $br_hit = 0; + foreach $line (sort({$a <=> $b} + keys(%{$testbrcount}))) { + my $brdata = $testbrcount->{$line}; + my $num = br_ivec_len($brdata); + my $i; + + for ($i = 0; $i < $num; $i++) { + my ($block, $branch, $taken) = + br_ivec_get($brdata, $i); + + $block = $BR_VEC_MAX if ($block < 0); + print(INFO_HANDLE "BRDA:$line,$block,". + "$branch,$taken\n"); + $br_found++; + $br_hit++ if ($taken ne '-' && + $taken > 0); + } + } + if ($br_found > 0) { + print(INFO_HANDLE "BRF:$br_found\n"); + print(INFO_HANDLE "BRH:$br_hit\n"); + } + + # Write line related data + foreach $line (sort({$a <=> $b} keys(%{$testcount}))) + { + print(INFO_HANDLE "DA:$line,". + $testcount->{$line}. + (defined($checkdata->{$line}) && + $checksum ? + ",".$checkdata->{$line} : "")."\n"); + $found++; + if ($testcount->{$line} > 0) + { + $hit++; + } + + } + print(INFO_HANDLE "LF:$found\n"); + print(INFO_HANDLE "LH:$hit\n"); + print(INFO_HANDLE "end_of_record\n"); + } + } + + return ($ln_total_found, $ln_total_hit, $fn_total_found, $fn_total_hit, + $br_total_found, $br_total_hit); +} + + +# +# transform_pattern(pattern) +# +# Transform shell wildcard expression to equivalent Perl regular expression. +# Return transformed pattern. +# + +sub transform_pattern($) +{ + my $pattern = $_[0]; + + # Escape special chars + + $pattern =~ s/\\/\\\\/g; + $pattern =~ s/\//\\\//g; + $pattern =~ s/\^/\\\^/g; + $pattern =~ s/\$/\\\$/g; + $pattern =~ s/\(/\\\(/g; + $pattern =~ s/\)/\\\)/g; + $pattern =~ s/\[/\\\[/g; + $pattern =~ s/\]/\\\]/g; + $pattern =~ s/\{/\\\{/g; + $pattern =~ s/\}/\\\}/g; + $pattern =~ s/\./\\\./g; + $pattern =~ s/\,/\\\,/g; + $pattern =~ s/\|/\\\|/g; + $pattern =~ s/\+/\\\+/g; + $pattern =~ s/\!/\\\!/g; + + # Transform ? => (.) and * => (.*) + + $pattern =~ s/\*/\(\.\*\)/g; + $pattern =~ s/\?/\(\.\)/g; + + return $pattern; +} + + +# +# extract() +# + +sub extract() +{ + my $data = read_info_file($extract); + my $filename; + my $keep; + my $pattern; + my @pattern_list; + my $extracted = 0; + my @result; + local *INFO_HANDLE; + + # Need perlreg expressions instead of shell pattern + @pattern_list = map({ transform_pattern($_); } @ARGV); + + # Filter out files which do not match any pattern + foreach $filename (sort(keys(%{$data}))) + { + $keep = 0; + + foreach $pattern (@pattern_list) + { + $keep ||= ($filename =~ (/^$pattern$/)); + } + + + if (!$keep) + { + delete($data->{$filename}); + } + else + { + info("Extracting $filename\n"), + $extracted++; + } + } + + # Write extracted data + if ($to_file) + { + info("Extracted $extracted files\n"); + info("Writing data to $output_filename\n"); + open(INFO_HANDLE, ">", $output_filename) + or die("ERROR: cannot write to $output_filename!\n"); + @result = write_info_file(*INFO_HANDLE, $data); + close(*INFO_HANDLE); + } + else + { + @result = write_info_file(*STDOUT, $data); + } + + return @result; +} + + +# +# remove() +# + +sub remove() +{ + my $data = read_info_file($remove); + my $filename; + my $match_found; + my $pattern; + my @pattern_list; + my $removed = 0; + my @result; + local *INFO_HANDLE; + + # Need perlreg expressions instead of shell pattern + @pattern_list = map({ transform_pattern($_); } @ARGV); + + # Filter out files that match the pattern + foreach $filename (sort(keys(%{$data}))) + { + $match_found = 0; + + foreach $pattern (@pattern_list) + { + $match_found ||= ($filename =~ (/$pattern$/)); + } + + + if ($match_found) + { + delete($data->{$filename}); + info("Removing $filename\n"), + $removed++; + } + } + + # Write data + if ($to_file) + { + info("Deleted $removed files\n"); + info("Writing data to $output_filename\n"); + open(INFO_HANDLE, ">", $output_filename) + or die("ERROR: cannot write to $output_filename!\n"); + @result = write_info_file(*INFO_HANDLE, $data); + close(*INFO_HANDLE); + } + else + { + @result = write_info_file(*STDOUT, $data); + } + + return @result; +} + + +# get_prefix(max_width, max_percentage_too_long, path_list) +# +# Return a path prefix that satisfies the following requirements: +# - is shared by more paths in path_list than any other prefix +# - the percentage of paths which would exceed the given max_width length +# after applying the prefix does not exceed max_percentage_too_long +# +# If multiple prefixes satisfy all requirements, the longest prefix is +# returned. Return an empty string if no prefix could be found. + +sub get_prefix($$@) +{ + my ($max_width, $max_long, @path_list) = @_; + my $path; + my $ENTRY_NUM = 0; + my $ENTRY_LONG = 1; + my %prefix; + + # Build prefix hash + foreach $path (@path_list) { + my ($v, $d, $f) = splitpath($path); + my @dirs = splitdir($d); + my $p_len = length($path); + my $i; + + # Remove trailing '/' + pop(@dirs) if ($dirs[scalar(@dirs) - 1] eq ''); + for ($i = 0; $i < scalar(@dirs); $i++) { + my $subpath = catpath($v, catdir(@dirs[0..$i]), ''); + my $entry = $prefix{$subpath}; + + $entry = [ 0, 0 ] if (!defined($entry)); + $entry->[$ENTRY_NUM]++; + if (($p_len - length($subpath) - 1) > $max_width) { + $entry->[$ENTRY_LONG]++; + } + $prefix{$subpath} = $entry; + } + } + # Find suitable prefix (sort descending by two keys: 1. number of + # entries covered by a prefix, 2. length of prefix) + foreach $path (sort {($prefix{$a}->[$ENTRY_NUM] == + $prefix{$b}->[$ENTRY_NUM]) ? + length($b) <=> length($a) : + $prefix{$b}->[$ENTRY_NUM] <=> + $prefix{$a}->[$ENTRY_NUM]} + keys(%prefix)) { + my ($num, $long) = @{$prefix{$path}}; + + # Check for additional requirement: number of filenames + # that would be too long may not exceed a certain percentage + if ($long <= $num * $max_long / 100) { + return $path; + } + } + + return ""; +} + + +# +# shorten_filename(filename, width) +# +# Truncate filename if it is longer than width characters. +# + +sub shorten_filename($$) +{ + my ($filename, $width) = @_; + my $l = length($filename); + my $s; + my $e; + + return $filename if ($l <= $width); + $e = int(($width - 3) / 2); + $s = $width - 3 - $e; + + return substr($filename, 0, $s).'...'.substr($filename, $l - $e); +} + + +sub shorten_number($$) +{ + my ($number, $width) = @_; + my $result = sprintf("%*d", $width, $number); + + return $result if (length($result) <= $width); + $number = $number / 1000; + return $result if (length($result) <= $width); + $result = sprintf("%*dk", $width - 1, $number); + return $result if (length($result) <= $width); + $number = $number / 1000; + $result = sprintf("%*dM", $width - 1, $number); + return $result if (length($result) <= $width); + return '#'; +} + +sub shorten_rate($$$) +{ + my ($hit, $found, $width) = @_; + my $result = rate($hit, $found, "%", 1, $width); + + return $result if (length($result) <= $width); + $result = rate($hit, $found, "%", 0, $width); + return $result if (length($result) <= $width); + return "#"; +} + +# +# list() +# + +sub list() +{ + my $data = read_info_file($list); + my $filename; + my $found; + my $hit; + my $entry; + my $fn_found; + my $fn_hit; + my $br_found; + my $br_hit; + my $total_found = 0; + my $total_hit = 0; + my $fn_total_found = 0; + my $fn_total_hit = 0; + my $br_total_found = 0; + my $br_total_hit = 0; + my $prefix; + my $strlen = length("Filename"); + my $format; + my $heading1; + my $heading2; + my @footer; + my $barlen; + my $rate; + my $fnrate; + my $brrate; + my $lastpath; + my $F_LN_NUM = 0; + my $F_LN_RATE = 1; + my $F_FN_NUM = 2; + my $F_FN_RATE = 3; + my $F_BR_NUM = 4; + my $F_BR_RATE = 5; + my @fwidth_narrow = (5, 5, 3, 5, 4, 5); + my @fwidth_wide = (6, 5, 5, 5, 6, 5); + my @fwidth = @fwidth_wide; + my $w; + my $max_width = $opt_list_width; + my $max_long = $opt_list_truncate_max; + my $fwidth_narrow_length; + my $fwidth_wide_length; + my $got_prefix = 0; + my $root_prefix = 0; + + # Calculate total width of narrow fields + $fwidth_narrow_length = 0; + foreach $w (@fwidth_narrow) { + $fwidth_narrow_length += $w + 1; + } + # Calculate total width of wide fields + $fwidth_wide_length = 0; + foreach $w (@fwidth_wide) { + $fwidth_wide_length += $w + 1; + } + # Get common file path prefix + $prefix = get_prefix($max_width - $fwidth_narrow_length, $max_long, + keys(%{$data})); + $root_prefix = 1 if ($prefix eq rootdir()); + $got_prefix = 1 if (length($prefix) > 0); + $prefix =~ s/\/$//; + # Get longest filename length + foreach $filename (keys(%{$data})) { + if (!$opt_list_full_path) { + if (!$got_prefix || !$root_prefix && + !($filename =~ s/^\Q$prefix\/\E//)) { + my ($v, $d, $f) = splitpath($filename); + + $filename = $f; + } + } + # Determine maximum length of entries + if (length($filename) > $strlen) { + $strlen = length($filename) + } + } + if (!$opt_list_full_path) { + my $blanks; + + $w = $fwidth_wide_length; + # Check if all columns fit into max_width characters + if ($strlen + $fwidth_wide_length > $max_width) { + # Use narrow fields + @fwidth = @fwidth_narrow; + $w = $fwidth_narrow_length; + if (($strlen + $fwidth_narrow_length) > $max_width) { + # Truncate filenames at max width + $strlen = $max_width - $fwidth_narrow_length; + } + } + # Add some blanks between filename and fields if possible + $blanks = int($strlen * 0.5); + $blanks = 4 if ($blanks < 4); + $blanks = 8 if ($blanks > 8); + if (($strlen + $w + $blanks) < $max_width) { + $strlen += $blanks; + } else { + $strlen = $max_width - $w; + } + } + # Filename + $w = $strlen; + $format = "%-${w}s|"; + $heading1 = sprintf("%*s|", $w, ""); + $heading2 = sprintf("%-*s|", $w, "Filename"); + $barlen = $w + 1; + # Line coverage rate + $w = $fwidth[$F_LN_RATE]; + $format .= "%${w}s "; + $heading1 .= sprintf("%-*s |", $w + $fwidth[$F_LN_NUM], + "Lines"); + $heading2 .= sprintf("%-*s ", $w, "Rate"); + $barlen += $w + 1; + # Number of lines + $w = $fwidth[$F_LN_NUM]; + $format .= "%${w}s|"; + $heading2 .= sprintf("%*s|", $w, "Num"); + $barlen += $w + 1; + # Function coverage rate + $w = $fwidth[$F_FN_RATE]; + $format .= "%${w}s "; + $heading1 .= sprintf("%-*s|", $w + $fwidth[$F_FN_NUM] + 1, + "Functions"); + $heading2 .= sprintf("%-*s ", $w, "Rate"); + $barlen += $w + 1; + # Number of functions + $w = $fwidth[$F_FN_NUM]; + $format .= "%${w}s|"; + $heading2 .= sprintf("%*s|", $w, "Num"); + $barlen += $w + 1; + # Branch coverage rate + $w = $fwidth[$F_BR_RATE]; + $format .= "%${w}s "; + $heading1 .= sprintf("%-*s", $w + $fwidth[$F_BR_NUM] + 1, + "Branches"); + $heading2 .= sprintf("%-*s ", $w, "Rate"); + $barlen += $w + 1; + # Number of branches + $w = $fwidth[$F_BR_NUM]; + $format .= "%${w}s"; + $heading2 .= sprintf("%*s", $w, "Num"); + $barlen += $w; + # Line end + $format .= "\n"; + $heading1 .= "\n"; + $heading2 .= "\n"; + + # Print heading + print($heading1); + print($heading2); + print(("="x$barlen)."\n"); + + # Print per file information + foreach $filename (sort(keys(%{$data}))) + { + my @file_data; + my $print_filename = $filename; + + $entry = $data->{$filename}; + if (!$opt_list_full_path) { + my $p; + + $print_filename = $filename; + if (!$got_prefix || !$root_prefix && + !($print_filename =~ s/^\Q$prefix\/\E//)) { + my ($v, $d, $f) = splitpath($filename); + + $p = catpath($v, $d, ""); + $p =~ s/\/$//; + $print_filename = $f; + } else { + $p = $prefix; + } + + if (!defined($lastpath) || $lastpath ne $p) { + print("\n") if (defined($lastpath)); + $lastpath = $p; + print("[$lastpath/]\n") if (!$root_prefix); + } + $print_filename = shorten_filename($print_filename, + $strlen); + } + + (undef, undef, undef, undef, undef, undef, undef, undef, + $found, $hit, $fn_found, $fn_hit, $br_found, $br_hit) = + get_info_entry($entry); + + # Assume zero count if there is no function data for this file + if (!defined($fn_found) || !defined($fn_hit)) { + $fn_found = 0; + $fn_hit = 0; + } + # Assume zero count if there is no branch data for this file + if (!defined($br_found) || !defined($br_hit)) { + $br_found = 0; + $br_hit = 0; + } + + # Add line coverage totals + $total_found += $found; + $total_hit += $hit; + # Add function coverage totals + $fn_total_found += $fn_found; + $fn_total_hit += $fn_hit; + # Add branch coverage totals + $br_total_found += $br_found; + $br_total_hit += $br_hit; + + # Determine line coverage rate for this file + $rate = shorten_rate($hit, $found, $fwidth[$F_LN_RATE]); + # Determine function coverage rate for this file + $fnrate = shorten_rate($fn_hit, $fn_found, $fwidth[$F_FN_RATE]); + # Determine branch coverage rate for this file + $brrate = shorten_rate($br_hit, $br_found, $fwidth[$F_BR_RATE]); + + # Assemble line parameters + push(@file_data, $print_filename); + push(@file_data, $rate); + push(@file_data, shorten_number($found, $fwidth[$F_LN_NUM])); + push(@file_data, $fnrate); + push(@file_data, shorten_number($fn_found, $fwidth[$F_FN_NUM])); + push(@file_data, $brrate); + push(@file_data, shorten_number($br_found, $fwidth[$F_BR_NUM])); + + # Print assembled line + printf($format, @file_data); + } + + # Determine total line coverage rate + $rate = shorten_rate($total_hit, $total_found, $fwidth[$F_LN_RATE]); + # Determine total function coverage rate + $fnrate = shorten_rate($fn_total_hit, $fn_total_found, + $fwidth[$F_FN_RATE]); + # Determine total branch coverage rate + $brrate = shorten_rate($br_total_hit, $br_total_found, + $fwidth[$F_BR_RATE]); + + # Print separator + print(("="x$barlen)."\n"); + + # Assemble line parameters + push(@footer, sprintf("%*s", $strlen, "Total:")); + push(@footer, $rate); + push(@footer, shorten_number($total_found, $fwidth[$F_LN_NUM])); + push(@footer, $fnrate); + push(@footer, shorten_number($fn_total_found, $fwidth[$F_FN_NUM])); + push(@footer, $brrate); + push(@footer, shorten_number($br_total_found, $fwidth[$F_BR_NUM])); + + # Print assembled line + printf($format, @footer); +} + + +# +# get_common_filename(filename1, filename2) +# +# Check for filename components which are common to FILENAME1 and FILENAME2. +# Upon success, return +# +# (common, path1, path2) +# +# or 'undef' in case there are no such parts. +# + +sub get_common_filename($$) +{ + my @list1 = split("/", $_[0]); + my @list2 = split("/", $_[1]); + my @result; + + # Work in reverse order, i.e. beginning with the filename itself + while (@list1 && @list2 && ($list1[$#list1] eq $list2[$#list2])) + { + unshift(@result, pop(@list1)); + pop(@list2); + } + + # Did we find any similarities? + if (scalar(@result) > 0) + { + return (join("/", @result), join("/", @list1), + join("/", @list2)); + } + else + { + return undef; + } +} + + +# +# strip_directories($path, $depth) +# +# Remove DEPTH leading directory levels from PATH. +# + +sub strip_directories($$) +{ + my $filename = $_[0]; + my $depth = $_[1]; + my $i; + + if (!defined($depth) || ($depth < 1)) + { + return $filename; + } + for ($i = 0; $i < $depth; $i++) + { + $filename =~ s/^[^\/]*\/+(.*)$/$1/; + } + return $filename; +} + + +# +# read_diff(filename) +# +# Read diff output from FILENAME to memory. The diff file has to follow the +# format generated by 'diff -u'. Returns a list of hash references: +# +# (mapping, path mapping) +# +# mapping: filename -> reference to line hash +# line hash: line number in new file -> corresponding line number in old file +# +# path mapping: filename -> old filename +# +# Die in case of error. +# + +sub read_diff($) +{ + my $diff_file = $_[0]; # Name of diff file + my %diff; # Resulting mapping filename -> line hash + my %paths; # Resulting mapping old path -> new path + my $mapping; # Reference to current line hash + my $line; # Contents of current line + my $num_old; # Current line number in old file + my $num_new; # Current line number in new file + my $file_old; # Name of old file in diff section + my $file_new; # Name of new file in diff section + my $filename; # Name of common filename of diff section + my $in_block = 0; # Non-zero while we are inside a diff block + local *HANDLE; # File handle for reading the diff file + + info("Reading diff $diff_file\n"); + + # Check if file exists and is readable + stat($diff_file); + if (!(-r _)) + { + die("ERROR: cannot read file $diff_file!\n"); + } + + # Check if this is really a plain file + if (!(-f _)) + { + die("ERROR: not a plain file: $diff_file!\n"); + } + + # Check for .gz extension + if ($diff_file =~ /\.gz$/) + { + # Check for availability of GZIP tool + system_no_output(1, "gunzip", "-h") + and die("ERROR: gunzip command not available!\n"); + + # Check integrity of compressed file + system_no_output(1, "gunzip", "-t", $diff_file) + and die("ERROR: integrity check failed for ". + "compressed file $diff_file!\n"); + + # Open compressed file + open(HANDLE, "-|", "gunzip -c '$diff_file'") + or die("ERROR: cannot start gunzip to decompress ". + "file $_[0]!\n"); + } + else + { + # Open decompressed file + open(HANDLE, "<", $diff_file) + or die("ERROR: cannot read file $_[0]!\n"); + } + + # Parse diff file line by line + while () + { + chomp($_); + $line = $_; + + foreach ($line) + { + # Filename of old file: + # --- + /^--- (\S+)/ && do + { + $file_old = strip_directories($1, $strip); + last; + }; + # Filename of new file: + # +++ + /^\+\+\+ (\S+)/ && do + { + # Add last file to resulting hash + if ($filename) + { + my %new_hash; + $diff{$filename} = $mapping; + $mapping = \%new_hash; + } + $file_new = strip_directories($1, $strip); + $filename = $file_old; + $paths{$filename} = $file_new; + $num_old = 1; + $num_new = 1; + last; + }; + # Start of diff block: + # @@ -old_start,old_num, +new_start,new_num @@ + /^\@\@\s+-(\d+),(\d+)\s+\+(\d+),(\d+)\s+\@\@$/ && do + { + $in_block = 1; + while ($num_old < $1) + { + $mapping->{$num_new} = $num_old; + $num_old++; + $num_new++; + } + last; + }; + # Unchanged line + # + /^ / && do + { + if ($in_block == 0) + { + last; + } + $mapping->{$num_new} = $num_old; + $num_old++; + $num_new++; + last; + }; + # Line as seen in old file + # + /^-/ && do + { + if ($in_block == 0) + { + last; + } + $num_old++; + last; + }; + # Line as seen in new file + # + /^\+/ && do + { + if ($in_block == 0) + { + last; + } + $num_new++; + last; + }; + # Empty line + /^$/ && do + { + if ($in_block == 0) + { + last; + } + $mapping->{$num_new} = $num_old; + $num_old++; + $num_new++; + last; + }; + } + } + + close(HANDLE); + + # Add final diff file section to resulting hash + if ($filename) + { + $diff{$filename} = $mapping; + } + + if (!%diff) + { + die("ERROR: no valid diff data found in $diff_file!\n". + "Make sure to use 'diff -u' when generating the diff ". + "file.\n"); + } + return (\%diff, \%paths); +} + + +# +# apply_diff($count_data, $line_hash) +# +# Transform count data using a mapping of lines: +# +# $count_data: reference to hash: line number -> data +# $line_hash: reference to hash: line number new -> line number old +# +# Return a reference to transformed count data. +# + +sub apply_diff($$) +{ + my $count_data = $_[0]; # Reference to data hash: line -> hash + my $line_hash = $_[1]; # Reference to line hash: new line -> old line + my %result; # Resulting hash + my $last_new = 0; # Last new line number found in line hash + my $last_old = 0; # Last old line number found in line hash + + # Iterate all new line numbers found in the diff + foreach (sort({$a <=> $b} keys(%{$line_hash}))) + { + $last_new = $_; + $last_old = $line_hash->{$last_new}; + + # Is there data associated with the corresponding old line? + if (defined($count_data->{$line_hash->{$_}})) + { + # Copy data to new hash with a new line number + $result{$_} = $count_data->{$line_hash->{$_}}; + } + } + # Transform all other lines which come after the last diff entry + foreach (sort({$a <=> $b} keys(%{$count_data}))) + { + if ($_ <= $last_old) + { + # Skip lines which were covered by line hash + next; + } + # Copy data to new hash with an offset + $result{$_ + ($last_new - $last_old)} = $count_data->{$_}; + } + + return \%result; +} + + +# +# apply_diff_to_brcount(brcount, linedata) +# +# Adjust line numbers of branch coverage data according to linedata. +# + +sub apply_diff_to_brcount($$) +{ + my ($brcount, $linedata) = @_; + my $db; + + # Convert brcount to db format + $db = brcount_to_db($brcount); + # Apply diff to db format + $db = apply_diff($db, $linedata); + # Convert db format back to brcount format + ($brcount) = db_to_brcount($db); + + return $brcount; +} + + +# +# get_hash_max(hash_ref) +# +# Return the highest integer key from hash. +# + +sub get_hash_max($) +{ + my ($hash) = @_; + my $max; + + foreach (keys(%{$hash})) { + if (!defined($max)) { + $max = $_; + } elsif ($hash->{$_} > $max) { + $max = $_; + } + } + return $max; +} + +sub get_hash_reverse($) +{ + my ($hash) = @_; + my %result; + + foreach (keys(%{$hash})) { + $result{$hash->{$_}} = $_; + } + + return \%result; +} + +# +# apply_diff_to_funcdata(funcdata, line_hash) +# + +sub apply_diff_to_funcdata($$) +{ + my ($funcdata, $linedata) = @_; + my $last_new = get_hash_max($linedata); + my $last_old = $linedata->{$last_new}; + my $func; + my %result; + my $line_diff = get_hash_reverse($linedata); + + foreach $func (keys(%{$funcdata})) { + my $line = $funcdata->{$func}; + + if (defined($line_diff->{$line})) { + $result{$func} = $line_diff->{$line}; + } elsif ($line > $last_old) { + $result{$func} = $line + $last_new - $last_old; + } + } + + return \%result; +} + + +# +# get_line_hash($filename, $diff_data, $path_data) +# +# Find line hash in DIFF_DATA which matches FILENAME. On success, return list +# line hash. or undef in case of no match. Die if more than one line hashes in +# DIFF_DATA match. +# + +sub get_line_hash($$$) +{ + my $filename = $_[0]; + my $diff_data = $_[1]; + my $path_data = $_[2]; + my $conversion; + my $old_path; + my $new_path; + my $diff_name; + my $common; + my $old_depth; + my $new_depth; + + # Remove trailing slash from diff path + $diff_path =~ s/\/$//; + foreach (keys(%{$diff_data})) + { + my $sep = ""; + + $sep = '/' if (!/^\//); + + # Try to match diff filename with filename + if ($filename =~ /^\Q$diff_path$sep$_\E$/) + { + if ($diff_name) + { + # Two files match, choose the more specific one + # (the one with more path components) + $old_depth = ($diff_name =~ tr/\///); + $new_depth = (tr/\///); + if ($old_depth == $new_depth) + { + die("ERROR: diff file contains ". + "ambiguous entries for ". + "$filename\n"); + } + elsif ($new_depth > $old_depth) + { + $diff_name = $_; + } + } + else + { + $diff_name = $_; + } + }; + } + if ($diff_name) + { + # Get converted path + if ($filename =~ /^(.*)$diff_name$/) + { + ($common, $old_path, $new_path) = + get_common_filename($filename, + $1.$path_data->{$diff_name}); + } + return ($diff_data->{$diff_name}, $old_path, $new_path); + } + else + { + return undef; + } +} + + +# +# convert_paths(trace_data, path_conversion_data) +# +# Rename all paths in TRACE_DATA which show up in PATH_CONVERSION_DATA. +# + +sub convert_paths($$) +{ + my $trace_data = $_[0]; + my $path_conversion_data = $_[1]; + my $filename; + my $new_path; + + if (scalar(keys(%{$path_conversion_data})) == 0) + { + info("No path conversion data available.\n"); + return; + } + + # Expand path conversion list + foreach $filename (keys(%{$path_conversion_data})) + { + $new_path = $path_conversion_data->{$filename}; + while (($filename =~ s/^(.*)\/[^\/]+$/$1/) && + ($new_path =~ s/^(.*)\/[^\/]+$/$1/) && + ($filename ne $new_path)) + { + $path_conversion_data->{$filename} = $new_path; + } + } + + # Adjust paths + FILENAME: foreach $filename (keys(%{$trace_data})) + { + # Find a path in our conversion table that matches, starting + # with the longest path + foreach (sort({length($b) <=> length($a)} + keys(%{$path_conversion_data}))) + { + # Is this path a prefix of our filename? + if (!($filename =~ /^$_(.*)$/)) + { + next; + } + $new_path = $path_conversion_data->{$_}.$1; + + # Make sure not to overwrite an existing entry under + # that path name + if ($trace_data->{$new_path}) + { + # Need to combine entries + $trace_data->{$new_path} = + combine_info_entries( + $trace_data->{$filename}, + $trace_data->{$new_path}, + $filename); + } + else + { + # Simply rename entry + $trace_data->{$new_path} = + $trace_data->{$filename}; + } + delete($trace_data->{$filename}); + next FILENAME; + } + info("No conversion available for filename $filename\n"); + } +} + +# +# sub adjust_fncdata(funcdata, testfncdata, sumfnccount) +# +# Remove function call count data from testfncdata and sumfnccount which +# is no longer present in funcdata. +# + +sub adjust_fncdata($$$) +{ + my ($funcdata, $testfncdata, $sumfnccount) = @_; + my $testname; + my $func; + my $f_found; + my $f_hit; + + # Remove count data in testfncdata for functions which are no longer + # in funcdata + foreach $testname (keys(%{$testfncdata})) { + my $fnccount = $testfncdata->{$testname}; + + foreach $func (keys(%{$fnccount})) { + if (!defined($funcdata->{$func})) { + delete($fnccount->{$func}); + } + } + } + # Remove count data in sumfnccount for functions which are no longer + # in funcdata + foreach $func (keys(%{$sumfnccount})) { + if (!defined($funcdata->{$func})) { + delete($sumfnccount->{$func}); + } + } +} + +# +# get_func_found_and_hit(sumfnccount) +# +# Return (f_found, f_hit) for sumfnccount +# + +sub get_func_found_and_hit($) +{ + my ($sumfnccount) = @_; + my $function; + my $f_found; + my $f_hit; + + $f_found = scalar(keys(%{$sumfnccount})); + $f_hit = 0; + foreach $function (keys(%{$sumfnccount})) { + if ($sumfnccount->{$function} > 0) { + $f_hit++; + } + } + return ($f_found, $f_hit); +} + +# +# diff() +# + +sub diff() +{ + my $trace_data = read_info_file($diff); + my $diff_data; + my $path_data; + my $old_path; + my $new_path; + my %path_conversion_data; + my $filename; + my $line_hash; + my $new_name; + my $entry; + my $testdata; + my $testname; + my $sumcount; + my $funcdata; + my $checkdata; + my $testfncdata; + my $sumfnccount; + my $testbrdata; + my $sumbrcount; + my $found; + my $hit; + my $f_found; + my $f_hit; + my $br_found; + my $br_hit; + my $converted = 0; + my $unchanged = 0; + my @result; + local *INFO_HANDLE; + + ($diff_data, $path_data) = read_diff($ARGV[0]); + + foreach $filename (sort(keys(%{$trace_data}))) + { + # Find a diff section corresponding to this file + ($line_hash, $old_path, $new_path) = + get_line_hash($filename, $diff_data, $path_data); + if (!$line_hash) + { + # There's no diff section for this file + $unchanged++; + next; + } + $converted++; + if ($old_path && $new_path && ($old_path ne $new_path)) + { + $path_conversion_data{$old_path} = $new_path; + } + # Check for deleted files + if (scalar(keys(%{$line_hash})) == 0) + { + info("Removing $filename\n"); + delete($trace_data->{$filename}); + next; + } + info("Converting $filename\n"); + $entry = $trace_data->{$filename}; + ($testdata, $sumcount, $funcdata, $checkdata, $testfncdata, + $sumfnccount, $testbrdata, $sumbrcount) = + get_info_entry($entry); + # Convert test data + foreach $testname (keys(%{$testdata})) + { + # Adjust line numbers of line coverage data + $testdata->{$testname} = + apply_diff($testdata->{$testname}, $line_hash); + # Adjust line numbers of branch coverage data + $testbrdata->{$testname} = + apply_diff_to_brcount($testbrdata->{$testname}, + $line_hash); + # Remove empty sets of test data + if (scalar(keys(%{$testdata->{$testname}})) == 0) + { + delete($testdata->{$testname}); + delete($testfncdata->{$testname}); + delete($testbrdata->{$testname}); + } + } + # Rename test data to indicate conversion + foreach $testname (keys(%{$testdata})) + { + # Skip testnames which already contain an extension + if ($testname =~ /,[^,]+$/) + { + next; + } + # Check for name conflict + if (defined($testdata->{$testname.",diff"})) + { + # Add counts + ($testdata->{$testname}) = add_counts( + $testdata->{$testname}, + $testdata->{$testname.",diff"}); + delete($testdata->{$testname.",diff"}); + # Add function call counts + ($testfncdata->{$testname}) = add_fnccount( + $testfncdata->{$testname}, + $testfncdata->{$testname.",diff"}); + delete($testfncdata->{$testname.",diff"}); + # Add branch counts + ($testbrdata->{$testname}) = combine_brcount( + $testbrdata->{$testname}, + $testbrdata->{$testname.",diff"}, + $BR_ADD); + delete($testbrdata->{$testname.",diff"}); + } + # Move test data to new testname + $testdata->{$testname.",diff"} = $testdata->{$testname}; + delete($testdata->{$testname}); + # Move function call count data to new testname + $testfncdata->{$testname.",diff"} = + $testfncdata->{$testname}; + delete($testfncdata->{$testname}); + # Move branch count data to new testname + $testbrdata->{$testname.",diff"} = + $testbrdata->{$testname}; + delete($testbrdata->{$testname}); + } + # Convert summary of test data + $sumcount = apply_diff($sumcount, $line_hash); + # Convert function data + $funcdata = apply_diff_to_funcdata($funcdata, $line_hash); + # Convert branch coverage data + $sumbrcount = apply_diff_to_brcount($sumbrcount, $line_hash); + # Update found/hit numbers + # Convert checksum data + $checkdata = apply_diff($checkdata, $line_hash); + # Convert function call count data + adjust_fncdata($funcdata, $testfncdata, $sumfnccount); + ($f_found, $f_hit) = get_func_found_and_hit($sumfnccount); + ($br_found, $br_hit) = get_br_found_and_hit($sumbrcount); + # Update found/hit numbers + $found = 0; + $hit = 0; + foreach (keys(%{$sumcount})) + { + $found++; + if ($sumcount->{$_} > 0) + { + $hit++; + } + } + if ($found > 0) + { + # Store converted entry + set_info_entry($entry, $testdata, $sumcount, $funcdata, + $checkdata, $testfncdata, $sumfnccount, + $testbrdata, $sumbrcount, $found, $hit, + $f_found, $f_hit, $br_found, $br_hit); + } + else + { + # Remove empty data set + delete($trace_data->{$filename}); + } + } + + # Convert filenames as well if requested + if ($convert_filenames) + { + convert_paths($trace_data, \%path_conversion_data); + } + + info("$converted entr".($converted != 1 ? "ies" : "y")." converted, ". + "$unchanged entr".($unchanged != 1 ? "ies" : "y")." left ". + "unchanged.\n"); + + # Write data + if ($to_file) + { + info("Writing data to $output_filename\n"); + open(INFO_HANDLE, ">", $output_filename) + or die("ERROR: cannot write to $output_filename!\n"); + @result = write_info_file(*INFO_HANDLE, $trace_data); + close(*INFO_HANDLE); + } + else + { + @result = write_info_file(*STDOUT, $trace_data); + } + + return @result; +} + +# +# summary() +# + +sub summary() +{ + my $filename; + my $current; + my $total; + my $ln_total_found; + my $ln_total_hit; + my $fn_total_found; + my $fn_total_hit; + my $br_total_found; + my $br_total_hit; + + # Read and combine trace files + foreach $filename (@opt_summary) { + $current = read_info_file($filename); + if (!defined($total)) { + $total = $current; + } else { + $total = combine_info_files($total, $current); + } + } + # Calculate coverage data + foreach $filename (keys(%{$total})) + { + my $entry = $total->{$filename}; + my $ln_found; + my $ln_hit; + my $fn_found; + my $fn_hit; + my $br_found; + my $br_hit; + + (undef, undef, undef, undef, undef, undef, undef, undef, + $ln_found, $ln_hit, $fn_found, $fn_hit, $br_found, + $br_hit) = get_info_entry($entry); + + # Add to totals + $ln_total_found += $ln_found; + $ln_total_hit += $ln_hit; + $fn_total_found += $fn_found; + $fn_total_hit += $fn_hit; + $br_total_found += $br_found; + $br_total_hit += $br_hit; + } + + + return ($ln_total_found, $ln_total_hit, $fn_total_found, $fn_total_hit, + $br_total_found, $br_total_hit); +} + +# +# system_no_output(mode, parameters) +# +# Call an external program using PARAMETERS while suppressing depending on +# the value of MODE: +# +# MODE & 1: suppress STDOUT +# MODE & 2: suppress STDERR +# +# Return 0 on success, non-zero otherwise. +# + +sub system_no_output($@) +{ + my $mode = shift; + my $result; + local *OLD_STDERR; + local *OLD_STDOUT; + + # Save old stdout and stderr handles + ($mode & 1) && open(OLD_STDOUT, ">>&", "STDOUT"); + ($mode & 2) && open(OLD_STDERR, ">>&", "STDERR"); + + # Redirect to /dev/null + ($mode & 1) && open(STDOUT, ">", "/dev/null"); + ($mode & 2) && open(STDERR, ">", "/dev/null"); + + system(@_); + $result = $?; + + # Close redirected handles + ($mode & 1) && close(STDOUT); + ($mode & 2) && close(STDERR); + + # Restore old handles + ($mode & 1) && open(STDOUT, ">>&", "OLD_STDOUT"); + ($mode & 2) && open(STDERR, ">>&", "OLD_STDERR"); + + return $result; +} + + +# +# read_config(filename) +# +# Read configuration file FILENAME and return a reference to a hash containing +# all valid key=value pairs found. +# + +sub read_config($) +{ + my $filename = $_[0]; + my %result; + my $key; + my $value; + local *HANDLE; + + if (!open(HANDLE, "<", $filename)) + { + warn("WARNING: cannot read configuration file $filename\n"); + return undef; + } + while () + { + chomp; + # Skip comments + s/#.*//; + # Remove leading blanks + s/^\s+//; + # Remove trailing blanks + s/\s+$//; + next unless length; + ($key, $value) = split(/\s*=\s*/, $_, 2); + if (defined($key) && defined($value)) + { + $result{$key} = $value; + } + else + { + warn("WARNING: malformed statement in line $. ". + "of configuration file $filename\n"); + } + } + close(HANDLE); + return \%result; +} + + +# +# apply_config(REF) +# +# REF is a reference to a hash containing the following mapping: +# +# key_string => var_ref +# +# where KEY_STRING is a keyword and VAR_REF is a reference to an associated +# variable. If the global configuration hashes CONFIG or OPT_RC contain a value +# for keyword KEY_STRING, VAR_REF will be assigned the value for that keyword. +# + +sub apply_config($) +{ + my $ref = $_[0]; + + foreach (keys(%{$ref})) + { + if (defined($opt_rc{$_})) { + ${$ref->{$_}} = $opt_rc{$_}; + } elsif (defined($config->{$_})) { + ${$ref->{$_}} = $config->{$_}; + } + } +} + +sub warn_handler($) +{ + my ($msg) = @_; + + temp_cleanup(); + warn("$tool_name: $msg"); +} + +sub die_handler($) +{ + my ($msg) = @_; + + temp_cleanup(); + die("$tool_name: $msg"); +} + +sub abort_handler($) +{ + temp_cleanup(); + exit(1); +} + +sub temp_cleanup() +{ + if (@temp_dirs) { + info("Removing temporary directories.\n"); + foreach (@temp_dirs) { + rmtree($_); + } + @temp_dirs = (); + } +} + +sub setup_gkv_sys() +{ + system_no_output(3, "mount", "-t", "debugfs", "nodev", + "/sys/kernel/debug"); +} + +sub setup_gkv_proc() +{ + if (system_no_output(3, "modprobe", "gcov_proc")) { + system_no_output(3, "modprobe", "gcov_prof"); + } +} + +sub check_gkv_sys($) +{ + my ($dir) = @_; + + if (-e "$dir/reset") { + return 1; + } + return 0; +} + +sub check_gkv_proc($) +{ + my ($dir) = @_; + + if (-e "$dir/vmlinux") { + return 1; + } + return 0; +} + +sub setup_gkv() +{ + my $dir; + my $sys_dir = "/sys/kernel/debug/gcov"; + my $proc_dir = "/proc/gcov"; + my @todo; + + if (!defined($gcov_dir)) { + info("Auto-detecting gcov kernel support.\n"); + @todo = ( "cs", "cp", "ss", "cs", "sp", "cp" ); + } elsif ($gcov_dir =~ /proc/) { + info("Checking gcov kernel support at $gcov_dir ". + "(user-specified).\n"); + @todo = ( "cp", "sp", "cp", "cs", "ss", "cs"); + } else { + info("Checking gcov kernel support at $gcov_dir ". + "(user-specified).\n"); + @todo = ( "cs", "ss", "cs", "cp", "sp", "cp", ); + } + foreach (@todo) { + if ($_ eq "cs") { + # Check /sys + $dir = defined($gcov_dir) ? $gcov_dir : $sys_dir; + if (check_gkv_sys($dir)) { + info("Found ".$GKV_NAME[$GKV_SYS]." gcov ". + "kernel support at $dir\n"); + return ($GKV_SYS, $dir); + } + } elsif ($_ eq "cp") { + # Check /proc + $dir = defined($gcov_dir) ? $gcov_dir : $proc_dir; + if (check_gkv_proc($dir)) { + info("Found ".$GKV_NAME[$GKV_PROC]." gcov ". + "kernel support at $dir\n"); + return ($GKV_PROC, $dir); + } + } elsif ($_ eq "ss") { + # Setup /sys + setup_gkv_sys(); + } elsif ($_ eq "sp") { + # Setup /proc + setup_gkv_proc(); + } + } + if (defined($gcov_dir)) { + die("ERROR: could not find gcov kernel data at $gcov_dir\n"); + } else { + die("ERROR: no gcov kernel data found\n"); + } +} + + +# +# get_overall_line(found, hit, name_singular, name_plural) +# +# Return a string containing overall information for the specified +# found/hit data. +# + +sub get_overall_line($$$$) +{ + my ($found, $hit, $name_sn, $name_pl) = @_; + my $name; + + return "no data found" if (!defined($found) || $found == 0); + $name = ($found == 1) ? $name_sn : $name_pl; + + return rate($hit, $found, "% ($hit of $found $name)"); +} + + +# +# print_overall_rate(ln_do, ln_found, ln_hit, fn_do, fn_found, fn_hit, br_do +# br_found, br_hit) +# +# Print overall coverage rates for the specified coverage types. +# + +sub print_overall_rate($$$$$$$$$) +{ + my ($ln_do, $ln_found, $ln_hit, $fn_do, $fn_found, $fn_hit, + $br_do, $br_found, $br_hit) = @_; + + info("Summary coverage rate:\n"); + info(" lines......: %s\n", + get_overall_line($ln_found, $ln_hit, "line", "lines")) + if ($ln_do); + info(" functions..: %s\n", + get_overall_line($fn_found, $fn_hit, "function", "functions")) + if ($fn_do); + info(" branches...: %s\n", + get_overall_line($br_found, $br_hit, "branch", "branches")) + if ($br_do); +} + + +# +# rate(hit, found[, suffix, precision, width]) +# +# Return the coverage rate [0..100] for HIT and FOUND values. 0 is only +# returned when HIT is 0. 100 is only returned when HIT equals FOUND. +# PRECISION specifies the precision of the result. SUFFIX defines a +# string that is appended to the result if FOUND is non-zero. Spaces +# are added to the start of the resulting string until it is at least WIDTH +# characters wide. +# + +sub rate($$;$$$) +{ + my ($hit, $found, $suffix, $precision, $width) = @_; + my $rate; + + # Assign defaults if necessary + $precision = 1 if (!defined($precision)); + $suffix = "" if (!defined($suffix)); + $width = 0 if (!defined($width)); + + return sprintf("%*s", $width, "-") if (!defined($found) || $found == 0); + $rate = sprintf("%.*f", $precision, $hit * 100 / $found); + + # Adjust rates if necessary + if ($rate == 0 && $hit > 0) { + $rate = sprintf("%.*f", $precision, 1 / 10 ** $precision); + } elsif ($rate == 100 && $hit != $found) { + $rate = sprintf("%.*f", $precision, 100 - 1 / 10 ** $precision); + } + + return sprintf("%*s", $width, $rate.$suffix); +} diff --git a/utils/lcov-1.11/bin/updateversion.pl b/utils/lcov-1.11/bin/updateversion.pl new file mode 100755 index 00000000..55f2bc1d --- /dev/null +++ b/utils/lcov-1.11/bin/updateversion.pl @@ -0,0 +1,146 @@ +#!/usr/bin/perl -w + +use strict; + +sub update_man_page($); +sub update_bin_tool($); +sub update_txt_file($); +sub update_spec_file($); +sub get_file_info($); + +our $directory = $ARGV[0]; +our $version = $ARGV[1]; +our $release = $ARGV[2]; + +our @man_pages = ("man/gendesc.1", "man/genhtml.1", "man/geninfo.1", + "man/genpng.1", "man/lcov.1", "man/lcovrc.5"); +our @bin_tools = ("bin/gendesc", "bin/genhtml", "bin/geninfo", + "bin/genpng", "bin/lcov"); +our @txt_files = ("README"); +our @spec_files = ("rpm/lcov.spec"); + +if (!defined($directory) || !defined($version) || !defined($release)) { + die("Usage: $0 \n"); +} + +foreach (@man_pages) { + print("Updating man page $_\n"); + update_man_page($directory."/".$_); +} +foreach (@bin_tools) { + print("Updating bin tool $_\n"); + update_bin_tool($directory."/".$_); +} +foreach (@txt_files) { + print("Updating text file $_\n"); + update_txt_file($directory."/".$_); +} +foreach (@spec_files) { + print("Updating spec file $_\n"); + update_spec_file($directory."/".$_); +} +print("Done.\n"); + +sub get_file_info($) +{ + my ($filename) = @_; + my ($sec, $min, $hour, $year, $month, $day); + my @stat; + + @stat = stat($filename); + ($sec, $min, $hour, $day, $month, $year) = localtime($stat[9]); + $year += 1900; + $month += 1; + + return (sprintf("%04d-%02d-%02d", $year, $month, $day), + sprintf("%04d%02d%02d%02d%02d.%02d", $year, $month, $day, + $hour, $min, $sec), + sprintf("%o", $stat[2] & 07777)); +} + +sub update_man_page($) +{ + my ($filename) = @_; + my @date = get_file_info($filename); + my $date_string = $date[0]; + local *IN; + local *OUT; + + $date_string =~ s/-/\\-/g; + open(IN, "<$filename") || die ("Error: cannot open $filename\n"); + open(OUT, ">$filename.new") || + die("Error: cannot create $filename.new\n"); + while () { + s/\"LCOV\s+\d+\.\d+\"/\"LCOV $version\"/g; + s/\d\d\d\d\\\-\d\d\\\-\d\d/$date_string/g; + print(OUT $_); + } + close(OUT); + close(IN); + chmod(oct($date[2]), "$filename.new"); + system("mv", "-f", "$filename.new", "$filename"); + system("touch", "$filename", "-t", $date[1]); +} + +sub update_bin_tool($) +{ + my ($filename) = @_; + my @date = get_file_info($filename); + local *IN; + local *OUT; + + open(IN, "<$filename") || die ("Error: cannot open $filename\n"); + open(OUT, ">$filename.new") || + die("Error: cannot create $filename.new\n"); + while () { + s/(our\s+\$lcov_version\s*=\s*["']).*(["'].*)$/$1LCOV version $version$2/g; + print(OUT $_); + } + close(OUT); + close(IN); + chmod(oct($date[2]), "$filename.new"); + system("mv", "-f", "$filename.new", "$filename"); + system("touch", "$filename", "-t", $date[1]); +} + +sub update_txt_file($) +{ + my ($filename) = @_; + my @date = get_file_info($filename); + local *IN; + local *OUT; + + open(IN, "<$filename") || die ("Error: cannot open $filename\n"); + open(OUT, ">$filename.new") || + die("Error: cannot create $filename.new\n"); + while () { + s/(Last\s+changes:\s+)\d\d\d\d-\d\d-\d\d/$1$date[0]/g; + print(OUT $_); + } + close(OUT); + close(IN); + chmod(oct($date[2]), "$filename.new"); + system("mv", "-f", "$filename.new", "$filename"); + system("touch", "$filename", "-t", $date[1]); +} + +sub update_spec_file($) +{ + my ($filename) = @_; + my @date = get_file_info($filename); + local *IN; + local *OUT; + + open(IN, "<$filename") || die ("Error: cannot open $filename\n"); + open(OUT, ">$filename.new") || + die("Error: cannot create $filename.new\n"); + while () { + s/^(Version:\s*)\d+\.\d+.*$/$1$version/; + s/^(Release:\s*).*$/$1$release/; + print(OUT $_); + } + close(OUT); + close(IN); + system("mv", "-f", "$filename.new", "$filename"); + system("touch", "$filename", "-t", $date[1]); +} diff --git a/utils/lcov-1.11/contrib/galaxy/CHANGES b/utils/lcov-1.11/contrib/galaxy/CHANGES new file mode 100755 index 00000000..b09883bd --- /dev/null +++ b/utils/lcov-1.11/contrib/galaxy/CHANGES @@ -0,0 +1 @@ +09-04-2003 Initial checkin diff --git a/utils/lcov-1.11/contrib/galaxy/README b/utils/lcov-1.11/contrib/galaxy/README new file mode 100755 index 00000000..e21c509c --- /dev/null +++ b/utils/lcov-1.11/contrib/galaxy/README @@ -0,0 +1,48 @@ +------------------------------------------------- +- README file for the LCOV galaxy mapping tool - +- Last changes: 2003-09-04 - +------------------------------------------------- + +Description +----------- + +Further README contents +----------------------- + 1. Included files + 2. Installing + 3. Notes and Comments + + + +1. Important files +------------------ + README - This README file + CHANGES - List of changes between releases + conglomerate_functions.pl - Replacement file - Generates shading + genflat.pl - Generates info for shading from .info files + gen_makefile.sh - Replacement file - updates to postscript + posterize.pl - Replacement file - generates a final ps file + +2. Installing +------------- + This install requires fcgp, which means the target kernel src must be on +the system creating the map. + + Download and copy the new files into the fcgp directory, (Note: its always +a good idea to have backups). + + Run genflat.pl against your kernel info files + ./genflat.pl kernel.info kernel2.info > coverage.dat + + Run the make command for the fcgp (Note: this can take a while) + make KERNEL_DIR=/usr/src/linux + + Update posterize.pl as needed, normally page size, margins, titles. +Most of these settings will be broken out as command line options in the future. + + Run posterize.pl this will generate the file poster.ps. + +3. Notes and Comments +--------------------- + This is a quick and dirty implementation suited for my needs. It does not +perform any of the tiling the original did. diff --git a/utils/lcov-1.11/contrib/galaxy/conglomerate_functions.pl b/utils/lcov-1.11/contrib/galaxy/conglomerate_functions.pl new file mode 100755 index 00000000..4e259fee --- /dev/null +++ b/utils/lcov-1.11/contrib/galaxy/conglomerate_functions.pl @@ -0,0 +1,195 @@ +#! /usr/bin/perl -w + +# Takes a set of ps images (belonging to one file) and produces a +# conglomerate picture of that file: static functions in the middle, +# others around it. Each one gets a box about its area. + +use strict; + +my $SCRUNCH = $ARGV [0]; +my $BOXSCRUNCH = $ARGV [1]; +my $Tmp; +my $DEBUG = 1; + +shift @ARGV; # skip SCRUNCH and BOXSCRUNCH +shift @ARGV; + + +DecorateFuncs (@ARGV); + + +#TMPFILE=`mktemp ${TMPDIR:-/tmp}/$$.XXXXXX` + +# Arrange. +my $ArgList = ""; + +foreach $Tmp (@ARGV) { + $ArgList .= "'$Tmp' "; +} + +my @Arranged = `../draw_arrangement $SCRUNCH 0 360 0 $ArgList`; + +my $CFile = $ARGV [0]; +$CFile =~ s/\.c\..*$/.c/; +if ($DEBUG) { print ("% Conglomeration of $CFile\n"); } + +print "gsave angle rotate\n"; + +# Now output the file, except last line. +my $LastLine = pop (@Arranged); +my $Fill = Box_2 ($LastLine,$CFile); +print $Fill; +# Draw box with file name +my @Output = Box ('normal', 'Helvetica-Bold', 32, $CFile, $LastLine); +splice(@Output, $#Output, 0, "grestore\n"); +#print @Output; + +print (@Arranged); +#add a duplicate box to test if this works +print @Output; + + +sub ParseBound +{ + my $BBoxLine = shift; + + $BBoxLine =~ /(-?[\d.]+)\s+(-?[\d.]+)\s+(-?[\d.]+)\s+(-?[\d.]+)/; + + # XMin, YMin, XMax, YMax + return ($1 * $BOXSCRUNCH, $2 * $BOXSCRUNCH, + $3 * $BOXSCRUNCH, $4 * $BOXSCRUNCH); +} + + + +# Box (type, font, fontsize, Label, BBoxLine) +sub Box +{ + my $Type = shift; + my $Font = shift; + my $Fontsize = shift; + my $Label = shift; + my $BBoxLine = shift; + my @Output = (); + + # print (STDERR "Box ('$Type', '$Font', '$Fontsize', '$Label', '$BBoxLine')\n"); + push (@Output, "% start of box\n"); + + push (@Output, "D5\n") if ($Type eq "dashed"); + + # print (STDERR "BBoxLine: '$BBoxLine'\n"); + # print (STDERR "Parsed: '" . join ("' '", ParseBound ($BBoxLine)) . "\n"); + my ($XMin, $YMin, $XMax, $YMax) = ParseBound ($BBoxLine); + + my $LeftSpaced = $XMin + 6; + my $BottomSpaced = $YMin + 6; + + # Put black box around it + push (@Output, ( + "($Label) $LeftSpaced $BottomSpaced $Fontsize /$Font\n", + "$YMin $XMin $YMax $XMax U\n" + ) + ); + + push (@Output, "D\n") if ($Type eq "dashed"); + # fill bounding box + push (@Output, "% end of box\n"); + + # Output bounding box + push (@Output, "% bound $XMin $YMin $XMax $YMax\n"); + + return @Output; +} + +sub Box_2 +{ + my $BBoxLine = shift; + my $CFile = shift; + my $CovFile = "./coverage.dat"; + my ($XMin, $YMin, $XMax, $YMax) = ParseBound ($BBoxLine); + my @output = `fgrep $CFile $CovFile`; + chomp $output[0]; + my ($junk, $Class, $per) = split /\t/, $output[0]; + return "$XMin $YMin $XMax $YMax $Class\n"; +} +# Decorate (rgb-vals(1 string) filename) +sub Decorate +{ + my $RGB = shift; + my $Filename = shift; + + my @Input = ReadPS ($Filename); + my $LastLine = pop (@Input); + my @Output = (); + + # Color at the beginning. + push (@Output, "C$RGB\n"); + + # Now output the file, except last line. + push (@Output, @Input); + + # Draw dashed box with function name + # FIXME Make bound cover the label as well! + my $FuncName = $Filename; + $FuncName =~ s/^[^.]+\.c\.(.+?)\..*$/$1/; + + push (@Output, Box ('dashed', 'Helvetica', 24, $FuncName, $LastLine)); + + # Slap over the top. + WritePS ($Filename, @Output); +} + + + +# Add colored boxes around functions +sub DecorateFuncs +{ + my $FName = ""; + my $FType = ""; + + foreach $FName (@ARGV) + { + $FName =~ /\+([A-Z]+)\+/; + $FType = $1; + + if ($FType eq 'STATIC') { + Decorate ("2", $FName); # Light green. + } + elsif ($FType eq 'INDIRECT') { + Decorate ("3", $FName); # Green. + } + elsif ($FType eq 'EXPORTED') { + Decorate ("4", $FName); # Red. + } + elsif ($FType eq 'NORMAL') { + Decorate ("5", $FName); # Blue. + } + else { + die ("Unknown extension $FName"); + } + } +} + + +sub ReadPS +{ + my $Filename = shift; + my @Contents = (); + + open (INFILE, "$Filename") or die ("Could not read $Filename: $!"); + @Contents = ; + close (INFILE); + + return @Contents; +} + +sub WritePS +{ + my $Filename = shift; + + open (OUTFILE, ">$Filename") + or die ("Could not write $Filename: $!"); + print (OUTFILE @_); + close (OUTFILE); +} + diff --git a/utils/lcov-1.11/contrib/galaxy/gen_makefile.sh b/utils/lcov-1.11/contrib/galaxy/gen_makefile.sh new file mode 100755 index 00000000..ab51a5ea --- /dev/null +++ b/utils/lcov-1.11/contrib/galaxy/gen_makefile.sh @@ -0,0 +1,129 @@ +#! /bin/sh + +cd image + +# Space-optimized version: strip comments, drop precision to 3 +# figures, eliminate duplicates. +# update(creinig): precision reduction is now done in data2ps and comments +# (except for % bound) now are also ommitted from the start + +echo 'image.ps: image-unop.ps' +#echo ' grep -v "^%" < $< | sed -e "s/\.\([0-9][0-9]\)[0-9]\+/.\1/g" -e "s/\(^\| \|-\)\([0-9][0-9][0-9]\)[0-9][0-9]\.[0-9][0-9]/\1\200/g" -e "s/\(^\| \|-\)\([0-9][0-9][0-9]\)[0-9]\.[0-9][0-9]/\1\20/g" -e "s/\(^\| \|-\)\([0-9][0-9][0-9]\)\.[0-9][0-9]/\1\2/g" -e "s/\(^\| \|-\)\([0-9][0-9]\)\.\([0-9]\)[0-9]/\1\2.\30/g" | awk "\$$0 ~ /lineto/ { if ( LASTLINE == \$$0 ) next; } { LASTLINE=\$$0; print; }" > $@' +echo ' grep -v "^% bound" < $< > $@' +# Need last comment (bounding box) +echo ' tail -1 $< >> $@' +echo ' ls -l image.ps image-unop.ps' + +echo 'image-unop.ps: outline.ps ring1.ps ring2.ps ring3.ps ring4.ps' +echo ' cat ring[1234].ps > $@' +# Bounding box is at bottom now. Next two won't change it. +echo ' tail -1 $@ > bounding-box' +echo ' cat outline.ps >> $@' +echo ' cat ../tux.ps >> $@' +echo ' cat bounding-box >> $@ && rm bounding-box' + +# Finished rings are precious! +echo .SECONDARY: ring1.ps ring2.ps ring3.ps ring4.ps + +# Rings 1 and 4 are all thrown together. +echo RING1_DEPS:=`find $RING1 -name '*.c.*' | sed 's/\.c.*/-all.ps/' | sort | uniq` +echo RING4_DEPS:=`find $RING4 -name '*.c.*' | sed 's/\.c.*/-all.ps/' | sort | uniq` + +# Other rings are divided into dirs. +echo RING2_DEPS:=`for d in $RING2; do echo $d-ring2.ps; done` +echo RING3_DEPS:=`for d in $RING3; do echo $d-ring3.ps; done` +echo + +# First ring starts at inner radius. +echo 'ring1.ps: $(RING1_DEPS)' +echo " @echo Making Ring 1" +echo " @echo /angle 0 def > \$@" +echo " @../draw_arrangement $FILE_SCRUNCH 0 360 $INNER_RADIUS \$(RING1_DEPS) >> \$@" +echo " @echo Done Ring 1" + +# Second ring starts at end of above ring (assume it's circular, so +# grab any bound). +echo 'ring2.ps: ring1.ps $(RING2_DEPS)' +echo " @echo Making Ring 2" +echo " @echo /angle 0 def > \$@" +echo " @../rotary_arrange.sh $DIR_SPACING" `for f in $RING2; do echo $f-ring2.ps $f-ring2.angle; done` '>> $@' +echo " @echo Done Ring 2" + +# Third ring starts at end of second ring. +echo 'ring3.ps: ring2.ps $(RING3_DEPS)' +echo " @echo Making Ring 3" +echo " @echo /angle 0 def > \$@" +echo " @../rotary_arrange.sh $DIR_SPACING" `for f in $RING3; do echo $f-ring3.ps $f-ring3.angle; done` '>> $@' +echo " @echo Done Ring 3" + +# Outer ring starts at end of fourth ring. +# And it's just a big ring of drivers. +echo 'ring4.ps: $(RING4_DEPS) ring3.radius' +echo " @echo Making Ring 4" +echo " @echo /angle 0 def > \$@" +echo " @../draw_arrangement $FILE_SCRUNCH 0 360 \`cat ring3.radius\` \$(RING4_DEPS) >> \$@" +echo " @echo Done Ring 4" +echo + +# How to make directory picture: angle file contains start and end angle. +# Second ring starts at end of above ring (assume it's circular, so +# grab any bound). +echo "%-ring2.ps: %-ring2.angle ring1.radius" +echo " @echo Rendering \$@" +echo " @../draw_arrangement $FILE_SCRUNCH 0 \`cat \$<\` \`cat ring1.radius\` \`find \$* -name '*-all.ps'\` > \$@" + +echo "%-ring3.ps: %-ring3.angle ring2.radius" +echo " @echo Rendering \$@" +echo " @../draw_arrangement $FILE_SCRUNCH 0 \`cat \$<\` \`cat ring2.radius\` \`find \$* -name '*-all.ps'\` > \$@" + +# How to extract radii +echo "%.radius: %.ps" +echo ' @echo scale=2\; `tail -1 $< | sed "s/^.* //"` + '$RING_SPACING' | bc > $@' +echo + +# How to make angle. Need total angle for that directory, and weight. +echo "%-ring2.angle: %-ring2.weight ring2.weight" +echo ' @echo "scale=2; ( 360 - ' `echo $RING2 | wc -w` ' * ' $DIR_SPACING ') * `cat $<` / `cat ring2.weight`" | bc > $@' + +echo "%-ring3.angle: %-ring3.weight ring3.weight" +echo ' @echo "scale=2; ( 360 - ' `echo $RING3 | wc -w` ' * ' $DIR_SPACING ') * `cat $<` / `cat ring3.weight`" | bc > $@' + +# How to make ring weights (sum directory totals). +echo "ring2.weight:" `for d in $RING2; do echo $d-ring2.weight; done` +echo ' @cat $^ | ../tally > $@' +echo "ring3.weight:" `for d in $RING3; do echo $d-ring3.weight; done` +echo ' @cat $^ | ../tally > $@' + +# How to make a wieght. +echo "%-ring2.weight:" `find $RING2 -name '*.c.*' | sed 's/\.c.*/-all.ps/' | sort | uniq` +echo ' @../total_area.pl `find $* -name \*-all.ps` > $@' +echo "%-ring3.weight:" `find $RING3 -name '*.c.*' | sed 's/\.c.*/-all.ps/' | sort | uniq` +echo ' @../total_area.pl `find $* -name \*-all.ps` > $@' +echo + +# Now rule to make the graphs of a function. +#echo %.ps::% +#echo ' @../function2ps `echo $< | sed '\''s/^.*\.\([^.]*\)\.\+.*$$/\1/'\''` > $@ $<' +## Need the space. +##echo ' @rm -f $<' +#echo + +# Rule to make all from constituent parts. +echo %-all.ps: +echo " @echo Rendering \$*.c" +echo " @../conglomerate_functions.pl $FUNCTION_SCRUNCH $BOX_SCRUNCH \$^ > \$@" +# Need the space. +#echo ' @rm -f $^' +echo + +# Generating outline, requires all the angles. +echo outline.ps: ../make-outline.sh ring1.ps ring2.ps ring3.ps ring4.ps `for f in $RING2; do echo $f-ring2.angle; done` `for f in $RING3; do echo $f-ring3.angle; done` +echo " ../make-outline.sh $INNER_RADIUS $DIR_SPACING $RING_SPACING \"$RING1\" > \$@" +echo + +# Now all the rules to make each function. +for d in `find . -type d`; do + for f in `cd $d; ls *+.ps 2>/dev/null | sed 's/\.c\..*$//' | uniq`; do + echo $d/$f-all.ps: `cd $d; ls $f.c.* | sed -e "s?^?$d/?"` + done +done diff --git a/utils/lcov-1.11/contrib/galaxy/genflat.pl b/utils/lcov-1.11/contrib/galaxy/genflat.pl new file mode 100755 index 00000000..b8b8ff47 --- /dev/null +++ b/utils/lcov-1.11/contrib/galaxy/genflat.pl @@ -0,0 +1,1238 @@ +#!/usr/bin/perl -w +# +# Copyright (c) International Business Machines Corp., 2002 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# genflat +# +# This script generates std output from .info files as created by the +# geninfo script. Call it with --help to get information on usage and +# available options. This code is based on the lcov genhtml script +# by Peter Oberparleiter +# +# +# History: +# 2003-08-19 ripped up Peter's script James M Kenefick Jr. +# + +use strict; +use File::Basename; +use Getopt::Long; +# Constants +our $lcov_version = ""; +our $lcov_url = ""; + +# Specify coverage rate limits (in %) for classifying file entries +# HI: $hi_limit <= rate <= 100 graph color: green +# MED: $med_limit <= rate < $hi_limit graph color: orange +# LO: 0 <= rate < $med_limit graph color: red +our $hi_limit = 50; +our $med_limit = 15; + +# Data related prototypes +sub print_usage(*); +sub gen_html(); +sub process_dir($); +sub process_file($$$); +sub info(@); +sub read_info_file($); +sub get_info_entry($); +sub set_info_entry($$$$;$$); +sub get_prefix(@); +sub shorten_prefix($); +sub get_dir_list(@); +sub get_relative_base_path($); +sub get_date_string(); +sub split_filename($); +sub subtract_counts($$); +sub add_counts($$); +sub apply_baseline($$); +sub combine_info_files($$); +sub combine_info_entries($$); +sub apply_prefix($$); +sub escape_regexp($); + + +# HTML related prototypes + + +sub write_file_table(*$$$$); + + +# Global variables & initialization +our %info_data; # Hash containing all data from .info file +our $dir_prefix; # Prefix to remove from all sub directories +our %test_description; # Hash containing test descriptions if available +our $date = get_date_string(); + +our @info_filenames; # List of .info files to use as data source +our $test_title; # Title for output as written to each page header +our $output_directory; # Name of directory in which to store output +our $base_filename; # Optional name of file containing baseline data +our $desc_filename; # Name of file containing test descriptions +our $css_filename; # Optional name of external stylesheet file to use +our $quiet; # If set, suppress information messages +our $help; # Help option flag +our $version; # Version option flag +our $show_details; # If set, generate detailed directory view +our $no_prefix; # If set, do not remove filename prefix +our $frames; # If set, use frames for source code view +our $keep_descriptions; # If set, do not remove unused test case descriptions +our $no_sourceview; # If set, do not create a source code view for each file +our $tab_size = 8; # Number of spaces to use in place of tab + +our $cwd = `pwd`; # Current working directory +chomp($cwd); +our $tool_dir = dirname($0); # Directory where genhtml tool is installed + + +# +# Code entry point +# + +# Add current working directory if $tool_dir is not already an absolute path +if (! ($tool_dir =~ /^\/(.*)$/)) +{ + $tool_dir = "$cwd/$tool_dir"; +} + +# Parse command line options +if (!GetOptions("output-directory=s" => \$output_directory, + "css-file=s" => \$css_filename, + "baseline-file=s" => \$base_filename, + "prefix=s" => \$dir_prefix, + "num-spaces=i" => \$tab_size, + "no-prefix" => \$no_prefix, + "quiet" => \$quiet, + "help" => \$help, + "version" => \$version + )) +{ + print_usage(*STDERR); + exit(1); +} + +@info_filenames = @ARGV; + +# Check for help option +if ($help) +{ + print_usage(*STDOUT); + exit(0); +} + +# Check for version option +if ($version) +{ + print($lcov_version."\n"); + exit(0); +} + +# Check for info filename +if (!@info_filenames) +{ + print(STDERR "No filename specified\n"); + print_usage(*STDERR); + exit(1); +} + +# Generate a title if none is specified +if (!$test_title) +{ + if (scalar(@info_filenames) == 1) + { + # Only one filename specified, use it as title + $test_title = basename($info_filenames[0]); + } + else + { + # More than one filename specified, used default title + $test_title = "unnamed"; + } +} + +# Make sure tab_size is within valid range +if ($tab_size < 1) +{ + print(STDERR "ERROR: invalid number of spaces specified: ". + "$tab_size!\n"); + exit(1); +} + +# Do something +gen_html(); + +exit(0); + + + +# +# print_usage(handle) +# +# Print usage information. +# + +sub print_usage(*) +{ + local *HANDLE = $_[0]; + my $executable_name = basename($0); + + print(HANDLE < \%data +# +# %data: "test" -> \%testdata +# "sum" -> \%sumcount +# "func" -> \%funcdata +# "found" -> $lines_found (number of instrumented lines found in file) +# "hit" -> $lines_hit (number of executed lines in file) +# +# %testdata: name of test affecting this file -> \%testcount +# +# %testcount: line number -> execution count for a single test +# %sumcount : line number -> execution count for all tests +# %funcdata : line number -> name of function beginning at that line +# +# Note that .info file sections referring to the same file and test name +# will automatically be combined by adding all execution counts. +# +# Note that if INFO_FILENAME ends with ".gz", it is assumed that the file +# is compressed using GZIP. If available, GUNZIP will be used to decompress +# this file. +# +# Die on error +# + +sub read_info_file($) +{ + my $tracefile = $_[0]; # Name of tracefile + my %result; # Resulting hash: file -> data + my $data; # Data handle for current entry + my $testdata; # " " + my $testcount; # " " + my $sumcount; # " " + my $funcdata; # " " + my $line; # Current line read from .info file + my $testname; # Current test name + my $filename; # Current filename + my $hitcount; # Count for lines hit + my $count; # Execution count of current line + my $negative; # If set, warn about negative counts + local *INFO_HANDLE; # Filehandle for .info file + + # Check if file exists and is readable + stat($_[0]); + if (!(-r _)) + { + die("ERROR: cannot read file $_[0]!\n"); + } + + # Check if this is really a plain file + if (!(-f _)) + { + die("ERROR: not a plain file: $_[0]!\n"); + } + + # Check for .gz extension + if ($_[0] =~ /^(.*)\.gz$/) + { + # Check for availability of GZIP tool + system("gunzip -h >/dev/null 2>/dev/null") + and die("ERROR: gunzip command not available!\n"); + + # Check integrity of compressed file + system("gunzip -t $_[0] >/dev/null 2>/dev/null") + and die("ERROR: integrity check failed for ". + "compressed file $_[0]!\n"); + + # Open compressed file + open(INFO_HANDLE, "gunzip -c $_[0]|") + or die("ERROR: cannot start gunzip to uncompress ". + "file $_[0]!\n"); + } + else + { + # Open uncompressed file + open(INFO_HANDLE, $_[0]) + or die("ERROR: cannot read file $_[0]!\n"); + } + + $testname = ""; + while () + { + chomp($_); + $line = $_; + + # Switch statement + foreach ($line) + { + /^TN:(\w+)/ && do + { + # Test name information found + $testname = $1; + last; + }; + + /^[SK]F:(.*)/ && do + { + # Filename information found + # Retrieve data for new entry + $filename = $1; + + $data = $result{$filename}; + ($testdata, $sumcount, $funcdata) = + get_info_entry($data); + + if (defined($testname)) + { + $testcount = $testdata->{$testname}; + } + else + { + my %new_hash; + $testcount = \%new_hash; + } + last; + }; + + /^DA:(\d+),(-?\d+)/ && do + { + # Fix negative counts + $count = $2 < 0 ? 0 : $2; + if ($2 < 0) + { + $negative = 1; + } + # Execution count found, add to structure + # Add summary counts + $sumcount->{$1} += $count; + + # Add test-specific counts + if (defined($testname)) + { + $testcount->{$1} += $count; + } + last; + }; + + /^FN:(\d+),([^,]+)/ && do + { + # Function data found, add to structure + $funcdata->{$1} = $2; + last; + }; + + /^end_of_record/ && do + { + # Found end of section marker + if ($filename) + { + # Store current section data + if (defined($testname)) + { + $testdata->{$testname} = + $testcount; + } + set_info_entry($data, $testdata, + $sumcount, $funcdata); + $result{$filename} = $data; + } + + }; + + # default + last; + } + } + close(INFO_HANDLE); + + # Calculate lines_found and lines_hit for each file + foreach $filename (keys(%result)) + { + $data = $result{$filename}; + + ($testdata, $sumcount, $funcdata) = get_info_entry($data); + + $data->{"found"} = scalar(keys(%{$sumcount})); + $hitcount = 0; + + foreach (keys(%{$sumcount})) + { + if ($sumcount->{$_} >0) { $hitcount++; } + } + + $data->{"hit"} = $hitcount; + + $result{$filename} = $data; + } + + if (scalar(keys(%result)) == 0) + { + die("ERROR: No valid records found in tracefile $tracefile\n"); + } + if ($negative) + { + warn("WARNING: Negative counts found in tracefile ". + "$tracefile\n"); + } + + return(\%result); +} + + +# +# get_info_entry(hash_ref) +# +# Retrieve data from an entry of the structure generated by read_info_file(). +# Return a list of references to hashes: +# (test data hash ref, sum count hash ref, funcdata hash ref, lines found, +# lines hit) +# + +sub get_info_entry($) +{ + my $testdata_ref = $_[0]->{"test"}; + my $sumcount_ref = $_[0]->{"sum"}; + my $funcdata_ref = $_[0]->{"func"}; + my $lines_found = $_[0]->{"found"}; + my $lines_hit = $_[0]->{"hit"}; + + return ($testdata_ref, $sumcount_ref, $funcdata_ref, $lines_found, + $lines_hit); +} + + +# +# set_info_entry(hash_ref, testdata_ref, sumcount_ref, funcdata_ref[, +# lines_found, lines_hit]) +# +# Update the hash referenced by HASH_REF with the provided data references. +# + +sub set_info_entry($$$$;$$) +{ + my $data_ref = $_[0]; + + $data_ref->{"test"} = $_[1]; + $data_ref->{"sum"} = $_[2]; + $data_ref->{"func"} = $_[3]; + + if (defined($_[4])) { $data_ref->{"found"} = $_[4]; } + if (defined($_[5])) { $data_ref->{"hit"} = $_[5]; } +} + + +# +# get_prefix(filename_list) +# +# Search FILENAME_LIST for a directory prefix which is common to as many +# list entries as possible, so that removing this prefix will minimize the +# sum of the lengths of all resulting shortened filenames. +# + +sub get_prefix(@) +{ + my @filename_list = @_; # provided list of filenames + my %prefix; # mapping: prefix -> sum of lengths + my $current; # Temporary iteration variable + + # Find list of prefixes + foreach (@filename_list) + { + # Need explicit assignment to get a copy of $_ so that + # shortening the contained prefix does not affect the list + $current = shorten_prefix($_); + while ($current = shorten_prefix($current)) + { + # Skip rest if the remaining prefix has already been + # added to hash + if ($prefix{$current}) { last; } + + # Initialize with 0 + $prefix{$current}="0"; + } + + } + + # Calculate sum of lengths for all prefixes + foreach $current (keys(%prefix)) + { + foreach (@filename_list) + { + # Add original length + $prefix{$current} += length($_); + + # Check whether prefix matches + if (substr($_, 0, length($current)) eq $current) + { + # Subtract prefix length for this filename + $prefix{$current} -= length($current); + } + } + } + + # Find and return prefix with minimal sum + $current = (keys(%prefix))[0]; + + foreach (keys(%prefix)) + { + if ($prefix{$_} < $prefix{$current}) + { + $current = $_; + } + } + + return($current); +} + + +# +# shorten_prefix(prefix) +# +# Return PREFIX shortened by last directory component. +# + +sub shorten_prefix($) +{ + my @list = split("/", $_[0]); + + pop(@list); + return join("/", @list); +} + + + +# +# get_dir_list(filename_list) +# +# Return sorted list of directories for each entry in given FILENAME_LIST. +# + +sub get_dir_list(@) +{ + my %result; + + foreach (@_) + { + $result{shorten_prefix($_)} = ""; + } + + return(sort(keys(%result))); +} + + +# +# get_relative_base_path(subdirectory) +# +# Return a relative path string which references the base path when applied +# in SUBDIRECTORY. +# +# Example: get_relative_base_path("fs/mm") -> "../../" +# + +sub get_relative_base_path($) +{ + my $result = ""; + my $index; + + # Make an empty directory path a special case + if (!$_[0]) { return(""); } + + # Count number of /s in path + $index = ($_[0] =~ s/\//\//g); + + # Add a ../ to $result for each / in the directory path + 1 + for (; $index>=0; $index--) + { + $result .= "../"; + } + + return $result; +} + + +# +# get_date_string() +# +# Return the current date in the form: yyyy-mm-dd +# + +sub get_date_string() +{ + my $year; + my $month; + my $day; + + ($year, $month, $day) = (localtime())[5, 4, 3]; + + return sprintf("%d-%02d-%02d", $year+1900, $month+1, $day); +} + + +# +# split_filename(filename) +# +# Return (path, filename, extension) for a given FILENAME. +# + +sub split_filename($) +{ + if (!$_[0]) { return(); } + my @path_components = split('/', $_[0]); + my @file_components = split('\.', pop(@path_components)); + my $extension = pop(@file_components); + + return (join("/",@path_components), join(".",@file_components), + $extension); +} + + +# +# write_file_table(filehandle, base_dir, overview, testhash, fileview) +# +# Write a complete file table. OVERVIEW is a reference to a hash containing +# the following mapping: +# +# filename -> "lines_found,lines_hit,page_link" +# +# TESTHASH is a reference to the following hash: +# +# filename -> \%testdata +# %testdata: name of test affecting this file -> \%testcount +# %testcount: line number -> execution count for a single test +# +# Heading of first column is "Filename" if FILEVIEW is true, "Directory name" +# otherwise. +# + +sub write_file_table(*$$$$) +{ + my $dir = $_[0]; + my $base_dir = $_[1]; + my %overview = %{$_[2]}; + my %testhash = %{$_[3]}; + my $fileview = $_[4]; + my $filename; + my $hit; + my $found; + my $classification; + my $rate_string; + my $rate; + my $junk; + + + foreach $filename (sort(keys(%overview))) + { + ($found, $hit, $junk) = split(",", $overview{$filename}); +#James I think this is right + $rate = $hit * 100 / $found; + $rate_string = sprintf("%.1f", $rate); + + if ($rate < 0.001) { $classification = "None"; } + elsif ($rate < $med_limit) { $classification = "Lo"; } + elsif ($rate < $hi_limit) { $classification = "Med"; } + else { $classification = "Hi"; } + + print "$dir/$filename\t$classification\t$rate_string\n"; + + } +} + + +# +# info(printf_parameter) +# +# Use printf to write PRINTF_PARAMETER to stdout only when the $quiet flag +# is not set. +# + +sub info(@) +{ + if (!$quiet) + { + # Print info string + printf(STDERR @_); + } +} + + +# +# subtract_counts(data_ref, base_ref) +# + +sub subtract_counts($$) +{ + my %data = %{$_[0]}; + my %base = %{$_[1]}; + my $line; + my $data_count; + my $base_count; + my $hit = 0; + my $found = 0; + + foreach $line (keys(%data)) + { + $found++; + $data_count = $data{$line}; + $base_count = $base{$line}; + + if (defined($base_count)) + { + $data_count -= $base_count; + + # Make sure we don't get negative numbers + if ($data_count<0) { $data_count = 0; } + } + + $data{$line} = $data_count; + if ($data_count > 0) { $hit++; } + } + + return (\%data, $found, $hit); +} + + +# +# add_counts(data1_ref, data2_ref) +# +# DATA1_REF and DATA2_REF are references to hashes containing a mapping +# +# line number -> execution count +# +# Return a list (RESULT_REF, LINES_FOUND, LINES_HIT) where RESULT_REF +# is a reference to a hash containing the combined mapping in which +# execution counts are added. +# + +sub add_counts($$) +{ + my %data1 = %{$_[0]}; # Hash 1 + my %data2 = %{$_[1]}; # Hash 2 + my %result; # Resulting hash + my $line; # Current line iteration scalar + my $data1_count; # Count of line in hash1 + my $data2_count; # Count of line in hash2 + my $found = 0; # Total number of lines found + my $hit = 0; # Number of lines with a count > 0 + + foreach $line (keys(%data1)) + { + $data1_count = $data1{$line}; + $data2_count = $data2{$line}; + + # Add counts if present in both hashes + if (defined($data2_count)) { $data1_count += $data2_count; } + + # Store sum in %result + $result{$line} = $data1_count; + + $found++; + if ($data1_count > 0) { $hit++; } + } + + # Add lines unique to data2 + foreach $line (keys(%data2)) + { + # Skip lines already in data1 + if (defined($data1{$line})) { next; } + + # Copy count from data2 + $result{$line} = $data2{$line}; + + $found++; + if ($result{$line} > 0) { $hit++; } + } + + return (\%result, $found, $hit); +} + + +# +# apply_baseline(data_ref, baseline_ref) +# +# Subtract the execution counts found in the baseline hash referenced by +# BASELINE_REF from actual data in DATA_REF. +# + +sub apply_baseline($$) +{ + my %data_hash = %{$_[0]}; + my %base_hash = %{$_[1]}; + my $filename; + my $testname; + my $data; + my $data_testdata; + my $data_funcdata; + my $data_count; + my $base; + my $base_testdata; + my $base_count; + my $sumcount; + my $found; + my $hit; + + foreach $filename (keys(%data_hash)) + { + # Get data set for data and baseline + $data = $data_hash{$filename}; + $base = $base_hash{$filename}; + + # Get set entries for data and baseline + ($data_testdata, undef, $data_funcdata) = + get_info_entry($data); + ($base_testdata, $base_count) = get_info_entry($base); + + # Sumcount has to be calculated anew + $sumcount = {}; + + # For each test case, subtract test specific counts + foreach $testname (keys(%{$data_testdata})) + { + # Get counts of both data and baseline + $data_count = $data_testdata->{$testname}; + + $hit = 0; + + ($data_count, undef, $hit) = + subtract_counts($data_count, $base_count); + + # Check whether this test case did hit any line at all + if ($hit > 0) + { + # Write back resulting hash + $data_testdata->{$testname} = $data_count; + } + else + { + # Delete test case which did not impact this + # file + delete($data_testdata->{$testname}); + } + + # Add counts to sum of counts + ($sumcount, $found, $hit) = + add_counts($sumcount, $data_count); + } + + # Write back resulting entry + set_info_entry($data, $data_testdata, $sumcount, + $data_funcdata, $found, $hit); + + $data_hash{$filename} = $data; + } + + return (\%data_hash); +} + + +# +# combine_info_entries(entry_ref1, entry_ref2) +# +# Combine .info data entry hashes referenced by ENTRY_REF1 and ENTRY_REF2. +# Return reference to resulting hash. +# + +sub combine_info_entries($$) +{ + my $entry1 = $_[0]; # Reference to hash containing first entry + my $testdata1; + my $sumcount1; + my $funcdata1; + + my $entry2 = $_[1]; # Reference to hash containing second entry + my $testdata2; + my $sumcount2; + my $funcdata2; + + my %result; # Hash containing combined entry + my %result_testdata; + my $result_sumcount = {}; + my %result_funcdata; + my $lines_found; + my $lines_hit; + + my $testname; + + # Retrieve data + ($testdata1, $sumcount1, $funcdata1) = get_info_entry($entry1); + ($testdata2, $sumcount2, $funcdata2) = get_info_entry($entry2); + + # Combine funcdata + foreach (keys(%{$funcdata1})) + { + $result_funcdata{$_} = $funcdata1->{$_}; + } + + foreach (keys(%{$funcdata2})) + { + $result_funcdata{$_} = $funcdata2->{$_}; + } + + # Combine testdata + foreach $testname (keys(%{$testdata1})) + { + if (defined($testdata2->{$testname})) + { + # testname is present in both entries, requires + # combination + ($result_testdata{$testname}) = + add_counts($testdata1->{$testname}, + $testdata2->{$testname}); + } + else + { + # testname only present in entry1, add to result + $result_testdata{$testname} = $testdata1->{$testname}; + } + + # update sum count hash + ($result_sumcount, $lines_found, $lines_hit) = + add_counts($result_sumcount, + $result_testdata{$testname}); + } + + foreach $testname (keys(%{$testdata2})) + { + # Skip testnames already covered by previous iteration + if (defined($testdata1->{$testname})) { next; } + + # testname only present in entry2, add to result hash + $result_testdata{$testname} = $testdata2->{$testname}; + + # update sum count hash + ($result_sumcount, $lines_found, $lines_hit) = + add_counts($result_sumcount, + $result_testdata{$testname}); + } + + # Calculate resulting sumcount + + # Store result + set_info_entry(\%result, \%result_testdata, $result_sumcount, + \%result_funcdata, $lines_found, $lines_hit); + + return(\%result); +} + + +# +# combine_info_files(info_ref1, info_ref2) +# +# Combine .info data in hashes referenced by INFO_REF1 and INFO_REF2. Return +# reference to resulting hash. +# + +sub combine_info_files($$) +{ + my %hash1 = %{$_[0]}; + my %hash2 = %{$_[1]}; + my $filename; + + foreach $filename (keys(%hash2)) + { + if ($hash1{$filename}) + { + # Entry already exists in hash1, combine them + $hash1{$filename} = + combine_info_entries($hash1{$filename}, + $hash2{$filename}); + } + else + { + # Entry is unique in both hashes, simply add to + # resulting hash + $hash1{$filename} = $hash2{$filename}; + } + } + + return(\%hash1); +} + + +# +# apply_prefix(filename, prefix) +# +# If FILENAME begins with PREFIX, remove PREFIX from FILENAME and return +# resulting string, otherwise return FILENAME. +# + +sub apply_prefix($$) +{ + my $filename = $_[0]; + my $prefix = $_[1]; + my $clean_prefix = escape_regexp($prefix); + + if (defined($prefix) && ($prefix ne "")) + { + if ($filename =~ /^$clean_prefix\/(.*)$/) + { + return substr($filename, length($prefix) + 1); + } + } + + return $filename; +} + + +# +# escape_regexp(string) +# +# Escape special characters in STRING which would be incorrectly interpreted +# in a PERL regular expression. +# + +sub escape_regexp($) +{ + my $string = $_[0]; + + # Escape special characters + $string =~ s/\\/\\\\/g; + $string =~ s/\^/\\\^/g; + $string =~ s/\$/\\\$/g; + $string =~ s/\./\\\./g; + $string =~ s/\|/\\\|/g; + $string =~ s/\(/\\\(/g; + $string =~ s/\)/\\\)/g; + $string =~ s/\[/\\\[/g; + $string =~ s/\]/\\\]/g; + $string =~ s/\*/\\\*/g; + $string =~ s/\?/\\\?/g; + $string =~ s/\{/\\\{/g; + $string =~ s/\}/\\\}/g; + $string =~ s/\+/\\\+/g; + + return $string; +} diff --git a/utils/lcov-1.11/contrib/galaxy/posterize.pl b/utils/lcov-1.11/contrib/galaxy/posterize.pl new file mode 100755 index 00000000..1b2895ed --- /dev/null +++ b/utils/lcov-1.11/contrib/galaxy/posterize.pl @@ -0,0 +1,312 @@ +#!/usr/bin/perl +# +# Copyright (c) International Business Machines Corp., 2002 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# posterize.pl +# +# This script generates a postscript file from output generated from the +# fcgp http://sourceforge.net/projects/fcgp/ for plotting +# +# +# History: +# 2003-09-04 wrote - James M Kenefick Jr. +# + + + +# a good deal of this could be turned in to cli +# arguments. + +# Constants +my $Title = "Linux Kernel Coverage"; +my $KernelVersion = "2.5.73"; +my $TestDescription = "A Sample Print"; +my $Image = "../lgp/image.ps"; + +# Variables +my $Bounds = ""; +# Paper sizes in inches +my $PAPER_WIDTH = 34; +my $PAPER_HEIGHT = 42; + +# points per inch +my $ppi = 72; + +# Margins +my $TopMargin = 1; +my $BottomMargin = 1.5; +my $LeftMargin = 1; +my $RightMargin = 1; + + +$RightMargin = $PAPER_WIDTH - $RightMargin; +$TopMargin = $PAPER_HEIGHT - $TopMargin; + +my $filename = "poster.ps"; + +# Sizes in ppi +my $PPI_WIDTH = ($PAPER_WIDTH * $ppi); +my $PPI_HEIGHT = ($PAPER_HEIGHT * $ppi); + +# Date we create poster +my $date = `date`; + +print STDERR "Creating Poster\n"; + +open POSTER, ">$filename"; + + + +print(POSTER < 0 in parent from wait; +fork03 + Check that child can use a large text space and do a large + number of operations. +fork04 + Child inheritance of Environment Variables after fork(). +fork05 + Make sure LDT is propagated correctly +fork06 + Test that a process can fork children a large number of + times in succession +fork07 + Check that all children inherit parent's file descriptor +fork08 + Check if the parent's file descriptors are affected by + actions in the child; they should not be. +fork09 + Check that child has access to a full set of files. +fork10 + Check inheritance of file descriptor by children, they + should all be referring to the same file. +fork11 + Test that parent gets a pid from each child when doing wait +vfork01 + Fork a process using vfork() and verify that, the attribute values like + euid, ruid, suid, egid, rgid, sgid, umask, inode and device number of + root and current working directories are same as that of the parent + process. +vfork02 + Fork a process using vfork() and verify that, the pending signals in + the parent are not pending in the child process. +ioctl01 + + Testcase to check the errnos set by the ioctl(2) system call. + +ioctl02 + + Testcase to test the TCGETA, and TCSETA ioctl implementations for + the tty driver + +sockioctl01 + + Verify that ioctl() on sockets returns the proper errno for various + failure cases + +getitimer01 + check that a correct call to getitimer() succeeds + + +getitimer02 + check that a getitimer() call fails as expected + with an incorrect second argument. + +getitimer03 + check that a getitimer() call fails as expected + with an incorrect first argument. + +setitimer01 + check that a reasonable setitimer() call succeeds. + + +setitimer02 + check that a setitimer() call fails as expected + with incorrect values. + +setitimer03 + check that a setitimer() call fails as expected + with incorrect values. + +float_trigo + increase CPUs workload - verify that results of some math functions are stable + trigonometric (acos, asin, atan, atan2, cos, sin, tan), + hyperbolic (cosh, sinh, tanh), + +float_exp_log + increase CPUs workload - verify that results of some math functions are stable + exponential and logarithmic functions (exp, log, log10), + Functions that manipulate floating-point numbers (modf, ldexp, frexp), + Euclidean distance function (hypot), + +float_bessel + increase CPUs workload - verify that results of some math functions are stable + Bessel (j0, j1, y0, y1), + Computes the natural logarithm of the gamma function (lgamma), + +fload_power + increase CPUs workload - verify that results of some math functions are stable + Computes sqrt, power, fmod + +float_iperb + increase CPUs workload - verify that results of some math functions are stable +pth_str01 + + Creates a tree of threads + +pth_str02 + + Creates n threads + +pth_str03 + + Creates a tree of threads does calculations, and + returns result to parent + + +asyncio02 + + Write/close flushes data to the file. + + +fpathconf + + Basic test for fpathconf(2) + +gethostid01 + + Basic test for gethostid(2) + + +pathconf01 + + Basic test for pathconf(2) + +setpgrp01 + + Basic test for the setpgrp(2) system call. + +setpgrp02 + + Testcase to check the basic functionality of the setpgrp(2) syscall. + + +ulimit01 + + Basic test for the ulimit(2) system call. + +mmstress + + Performs General Stress with Race conditions + +mmap1 + + Test the LINUX memory manager. The program is aimed at + stressing the memory manager by simultaneous map/unmap/read + by light weight processes, the test is scheduled to run for + a minimum of 24 hours. + +mmap2 + + Test the LINUX memory manager. The program is aimed at + stressing the memory manager by repeated map/write/unmap of a + of a large gb size file. + +mmap3 + + Test the LINUX memory manager. The program is aimed at + stressing the memory manager by repeated map/write/unmap + of file/memory of random size (maximum 1GB) this is done by + multiple processes. + +mmap001 + + Tests mmapping a big file and writing it once + +mmap01 + + Verify that, mmap() succeeds when used to map a file where size of the + file is not a multiple of the page size, the memory area beyond the end + of the file to the end of the page is accessible. Also, verify that + this area is all zeroed and the modifications done to this area are + not written to the file. + +mmap02 + + Call mmap() with prot parameter set to PROT_READ and with the file + descriptor being open for read, to map a file creating mapped memory + with read access. The minimum file permissions should be 0444. + +mmap03 + + Call mmap() to map a file creating a mapped region with execute access + under the following conditions - + - The prot parameter is set to PROT_EXE + - The file descriptor is open for read + - The file being mapped has execute permission bit set. + - The minimum file permissions should be 0555. + + The call should succeed to map the file creating mapped memory with the + required attributes. + +mmap04 + + Call mmap() to map a file creating a mapped region with read/exec access + under the following conditions - + - The prot parameter is set to PROT_READ|PROT_EXEC + - The file descriptor is open for read + - The file being mapped has read and execute permission bit set. + - The minimum file permissions should be 0555. + + The call should succeed to map the file creating mapped memory with the + required attributes. + + +mmap05 + + Call mmap() to map a file creating mapped memory with no access under + the following conditions - + - The prot parameter is set to PROT_NONE + - The file descriptor is open for read(any mode other than write) + - The minimum file permissions should be 0444. + + The call should succeed to map the file creating mapped memory with the + required attributes. + +mmap06 + + Call mmap() to map a file creating a mapped region with read access + under the following conditions - + - The prot parameter is set to PROT_READ + - The file descriptor is open for writing. + + The call should fail to map the file. + + +mmap07 + + Call mmap() to map a file creating a mapped region with read access + under the following conditions - + - The prot parameter is set to PROT_WRITE + - The file descriptor is open for writing. + - The flags parameter has MAP_PRIVATE set. + + The call should fail to map the file. + +mmap08 + + Verify that mmap() fails to map a file creating a mapped region + when the file specified by file descriptor is not valid. + + +mremap01 + + Verify that, mremap() succeeds when used to expand the existing + virtual memory mapped region to the requested size where the + virtual memory area was previously mapped to a file using mmap(). + +mremap02 + + Verify that, + mremap() fails when used to expand the existing virtual memory mapped + region to the requested size, if the virtual memory area previously + mapped was not page aligned or invalid argument specified. + +mremap03 + + Verify that, + mremap() fails when used to expand the existing virtual memory mapped + region to the requested size, if there already exists mappings that + cover the whole address space requested or the old address specified was + not mapped. + +mremap04 + + Verify that, + mremap() fails when used to expand the existing virtual memory mapped + region to the requested size, if the memory area cannot be expanded at + the current virtual address and MREMAP_MAYMOVE flag not set. + +munmap01 + + Verify that, munmap call will succeed to unmap a mapped file or + anonymous shared memory region from the calling process's address space + and after successful completion of munmap, the unmapped region is no + longer accessible. + +munmap02 + + Verify that, munmap call will succeed to unmap a mapped file or + anonymous shared memory region from the calling process's address space + if the region specified by the address and the length is part or all of + the mapped region. + +munmap03 + + Verify that, munmap call will fail to unmap a mapped file or anonymous + shared memory region from the calling process's address space if the + address and the length of the region to be unmapped points outside the + calling process's address space + +brk01 + Test the basic functionality of brk. + +sbrk01 + Basic test for the sbrk(2) system call. + + +mprotect01 + + Testcase to check the error conditions for mprotect(2) + +mprotect02 + + Testcase to check the mprotect(2) system call. + +mprotect03 + + Testcase to check the mprotect(2) system call. + +msgctl01 + create a message queue, then issue the IPC_STAT command + and RMID commands to test the functionality + + +msgctl02 + create a message queue, then issue the IPC_SET command + to lower the msg_qbytes value. + + +msgctl03 + create a message queue, then issue the IPC_RMID command + + + +msgctl04 + test for EACCES, EFAULT and EINVAL errors using + a variety of incorrect calls. + + +msgctl05 + test for EPERM error + + + +msgget01 + create a message queue, write a message to it and + read it back. + + +msgget02 + test for EEXIST and ENOENT errors + + +msgget03 + test for an ENOSPC error by using up all available + message queues. + +msgget04 + test for an EACCES error by creating a message queue + with no read or write permission and then attempting + to access it with various permissions. + +msgrcv01 + test that msgrcv() receives the expected message + +msgrcv02 + test for EACCES and EFAULT errors + +msgrcv03 + test for EINVAL error + +msgrcv04 + test for E2BIG and ENOMSG errors + +msgrcv05 + test for EINTR error + +msgrcv06 + test for EIDRM error + +msgsnd01 + test that msgsnd() enqueues a message correctly + +msgsnd02 + test for EACCES and EFAULT errors + +msgsnd03 + test for EINVAL error + +msgsnd04 + test for EAGAIN error + +msgsnd05 + test for EINTR error + + +msgsnd06 + test for EIDRM error + +link02 + + Basic test for link(2) + +link03 + + Multi links tests + +link04 + + Negative test cases for link(2) + +link05 + + Multi links (EMLINK) negative test + +readlink01 + + Verify that, readlink will succeed to read the contents of the symbolic + link created the process. + +readlink02 + + Basic test for the readlink(2) system call + +readlink03 + + Verify that, + 1) readlink(2) returns -1 and sets errno to EACCES if search/write + permission is denied in the directory where the symbolic link + resides. + 2) readlink(2) returns -1 and sets errno to EINVAL if the buffer size + is not positive. + 3) readlink(2) returns -1 and sets errno to EINVAL if the specified + file is not a symbolic link file. + 4) readlink(2) returns -1 and sets errno to ENAMETOOLONG if the + pathname component of symbolic link is too long (ie, > PATH_MAX). + 5) readlink(2) returns -1 and sets errno to ENOENT if the component of + symbolic link points to an empty string. + +readlink04 + + Verify that, readlink call will succeed to read the contents of the + symbolic link if invoked by non-root user who is not the owner of the + symbolic link. + + +symlink01 + + Test of various file function calls, such as rename or open, on a symbolic + link file. + +symlink02 + + Basic test for the symlink(2) system call. + +symlink03 + + Verify that, + 1) symlink(2) returns -1 and sets errno to EACCES if search/write + permission is denied in the directory where the symbolic link is + being created. + 2) symlink(2) returns -1 and sets errno to EEXIST if the specified + symbolic link already exists. + 3) symlink(2) returns -1 and sets errno to EFAULT if the specified + file or symbolic link points to invalid address. + 4) symlink(2) returns -1 and sets errno to ENAMETOOLONG if the + pathname component of symbolic link is too long (ie, > PATH_MAX). + 5) symlink(2) returns -1 and sets errno to ENOTDIR if the directory + component in pathname of symbolic link is not a directory. + 6) symlink(2) returns -1 and sets errno to ENOENT if the component of + symbolic link points to an empty string. + +symlink04 + + Verify that, symlink will succeed to create a symbolic link of an existing + object name path. + + +symlink05 + + Verify that, symlink will succeed to create a symbolic link of an + non-existing object name path. + + +unlink05 + + Basic test for the unlink(2) system call. + +unlink06 + + Test for the unlink(2) system call of a FIFO. + +unlink07 + + Tests for error handling for the unlink(2) system call. + +unlink08 + + More tests for error handling for the unlink(2) system call. + + +linktest + + Regression test for max links per file + +rename01 + + This test will verify the rename(2) syscall basic functionality. + Verify rename() works when the "new" file or directory does not exist. + +rename02 + + Basic test for the rename(2) system call + +rename03 + + This test will verify that rename(2) functions correctly + when the "new" file or directory exists + +rename04 + + This test will verify that rename(2) failed when newpath is + a non-empty directory and return EEXIST or ENOTEMPTY + +rename05 + + This test will verify that rename(2) fails with EISDIR + +rename06 + + This test will verify that rename(2) failed in EINVAL + +rename07 + + This test will verify that rename(2) failed in ENOTDIR + +rename08 + + This test will verify that rename(2) syscall failed in EFAULT + +rename09 + + check rename() fails with EACCES + +rename10 + + This test will verify that rename(2) syscall fails with ENAMETOOLONG + and ENOENT + +rename11 + + This test will verify that rename(2) failed in EBUSY + +rename12 + + check rename() fails with EPERM + +rename13 + + Verify rename() return successfully and performs no other action + when "old" file and "new" file link to the same file. + +rmdir01 + + This test will verify that rmdir(2) syscall basic functionality. + verify rmdir(2) returns a value of 0 and the directory being + removed + +rmdir02 + + This test will verify that rmdir(2) fail in + 1. ENOTEMPTY + 2. EBUSY + 3. ENAMETOOLONG + 4. ENOENT + 5. ENOTDIR + 6. EFAULT + 7. EFAULT + +rmdir03 + + check rmdir() fails with EPERM or EACCES + +rmdir04 + + Basic test for the rmdir(2) system call + +rmdir05 + + Verify that rmdir(2) returns a value of -1 and sets errno to indicate the error. + + + +mkdir01 + + Basic errno test for mkdir(2) + +mkdir02 + + This test will verify that new directory created + by mkdir(2) inherits the group ID from the parent + directory and S_ISGID bit, if the S_ISGID bit is set + in the parent directory. + +mkdir03 + + Check mkdir() with various error conditions that should produce + EFAULT, ENAMETOOLONG, EEXIST, ENOENT and ENOTDIR + +mkdir04 + + Attempt to create a directory in a directory having no permissions. + +mkdir05 + + This test will verify the mkdir(2) syscall basic functionality + +mkdir08 + + Basic test for mkdir(2) + + +mknod01 + + Basic test for mknod(2) + +mknod02 + + Verify that mknod(2) succeeds when used to create a filesystem + node with set group-ID bit set on a directory without set group-ID bit set. + The node created should have set group-ID bit set and its gid should be + equal to that of its parent directory. + +mknod03 + + Verify that mknod(2) succeeds when used to create a filesystem + node with set group-ID bit set on a directory with set group-ID bit set. + The node created should have set group-ID bit set and its gid should be + equal to the effective gid of the process. + +mknod04 + + Verify that mknod(2) succeeds when used to create a filesystem + node on a directory with set group-ID bit set. + The node created should not have group-ID bit set and its gid should be + equal to the effective gid of the process. + +mknod05 + + Verify that mknod(2) succeeds when used by root to create a filesystem + node with set group-ID bit set on a directory with set group-ID bit set. + The node created should have set group-ID bit set and its gid should be + equal to that of its parent directory. + + +mknod06 + + Verify that, + 1) mknod(2) returns -1 and sets errno to EEXIST if specified path + already exists. + 2) mknod(2) returns -1 and sets errno to EFAULT if pathname points + outside user's accessible address space. + 3) mknod(2) returns -1 and sets errno to ENOENT if the directory + component in pathname does not exist. + 4) mknod(2) returns -1 and sets errno to ENAMETOOLONG if the pathname + component was too long. + 5) mknod(2) returns -1 and sets errno to ENOTDIR if the directory + component in pathname is not a directory. + +mknod07 + + Verify that, + 1) mknod(2) returns -1 and sets errno to EPERM if the process id of + the caller is not super-user. + 2) mknod(2) returns -1 and sets errno to EACCES if parent directory + does not allow write permission to the process. + +mknod08 + + Verify that mknod(2) succeeds when used to create a filesystem + node on a directory without set group-ID bit set. The node created + should not have set group-ID bit set and its gid should be equal to that + of its parent directory. + + + + +access01 + + Basic test for access(2) using F_OK, R_OK, W_OK, and X_OK arguments. + +access02 + + Verify that access() succeeds to check the read/write/execute permissions + on a file if the mode argument passed was R_OK/W_OK/X_OK. + + Also verify that, access() succeeds to test the accessibility of the file + referred to by symbolic link if the pathname points to a symbolic link. + +access03 + + EFAULT error testing for access(2). + +access04 + + Verify that, + 1. access() fails with -1 return value and sets errno to EACCES + if the permission bits of the file mode do not permit the + requested (Read/Write/Execute) access. + 2. access() fails with -1 return value and sets errno to EINVAL + if the specified access mode argument is invalid. + 3. access() fails with -1 return value and sets errno to EFAULT + if the pathname points outside allocate address space for the + process. + 4. access() fails with -1 return value and sets errno to ENOENT + if the specified file doesn't exist (or pathname is NULL). + 5. access() fails with -1 return value and sets errno to ENAMETOOLONG + if the pathname size is > PATH_MAX characters. + +access05 + + Verify that access() succeeds to check the existence of a file if + search access is permitted on the pathname of the specified file. + +access06 + + EFAULT error testing for access(2). + +chroot01 + + Testcase to check the whether chroot sets errno to EPERM. + +chroot02 + + Test functionality of chroot(2) + +chroot03 + + Testcase to test whether chroot(2) sets errno correctly. + +pipeio + + This tool can be used to beat on system or named pipes. + See the help() function below for user information. + +pipe01 + + Testcase to check the basic functionality of the pipe(2) syscall: + Check that both ends of the pipe (both file descriptors) are + available to a process opening the pipe. + +pipe05 + + Check what happens when pipe is passed a bad file descriptor. + +pipe06 + + Check what happens when the system runs out of pipes. + +pipe08 + + Check that a SIGPIPE signal is generated when a write is + attempted on an empty pipe. + +pipe09 + + Check that two processes can use the same pipe at the same time. + +pipe10 + + Check that parent can open a pipe and have a child read from it + +pipe11 + + Check if many children can read what is written to a pipe by the + parent. + + +sem01 + + Creates a semaphore and two processes. The processes + each go through a loop where they semdown, delay for a + random amount of time, and semup, so they will almost + always be fighting for control of the semaphore. + +sem02 + The application creates several threads using pthread_create(). + One thread performs a semop() with the SEM_UNDO flag set. The + change in semaphore value performed by that semop should be + "undone" only when the last pthread exits. + + +semctl01 + + test the 10 possible semctl() commands + +semctl02 + + test for EACCES error + +semctl03 + + test for EINVAL and EFAULT errors + +semctl04 + + test for EPERM error + + +semctl05 + + test for ERANGE error + +semget01 + + test that semget() correctly creates a semaphore set + +semget02 + + test for EACCES and EEXIST errors + +semget03 + + test for ENOENT error + +semget05 + + test for ENOSPC error + +semget06 + + test for EINVAL error + +semop01 + + test that semop() basic functionality is correct + +semop02 + + test for E2BIG, EACCES, EFAULT and EINVAL errors + +semop03 + + test for EFBIG error + +semop04 + + test for EAGAIN error + +semop05 + + test for EINTR and EIDRM errors + + + +msgctl01 + create a message queue, then issue the IPC_STAT command + and RMID commands to test the functionality + + +msgctl02 + create a message queue, then issue the IPC_SET command + to lower the msg_qbytes value. + + +msgctl03 + create a message queue, then issue the IPC_RMID command + + + +msgctl04 + test for EACCES, EFAULT and EINVAL errors using + a variety of incorrect calls. + + +msgctl05 + test for EPERM error + + + +msgget01 + create a message queue, write a message to it and + read it back. + + +msgget02 + test for EEXIST and ENOENT errors + + +msgget03 + test for an ENOSPC error by using up all available + message queues. + +msgget04 + test for an EACCES error by creating a message queue + with no read or write permission and then attempting + to access it with various permissions. + +msgrcv01 + test that msgrcv() receives the expected message + +msgrcv02 + test for EACCES and EFAULT errors + +msgrcv03 + test for EINVAL error + +msgrcv04 + test for E2BIG and ENOMSG errors + +msgrcv05 + test for EINTR error + +msgrcv06 + test for EIDRM error + +msgsnd01 + test that msgsnd() enqueues a message correctly + +msgsnd02 + test for EACCES and EFAULT errors + +msgsnd03 + test for EINVAL error + +msgsnd04 + test for EAGAIN error + +msgsnd05 + test for EINTR error + + +msgsnd06 + test for EIDRM error + +shmat01 + test that shmat() works correctly + +shmat02 + check for EINVAL and EACCES errors + + +shmat03 + test for EACCES error + + +shmctl01 + test the IPC_STAT, IPC_SET and IPC_RMID commands as + they are used with shmctl() + + +shmctl02 + check for EACCES, EFAULT and EINVAL errors + + +shmctl03 + check for EACCES, and EPERM errors + + +shmdt01 + check that shared memory is detached correctly + + +shmdt02 + check for EINVAL error + + +shmget01 + test that shmget() correctly creates a shared memory segment + + +shmget02 + check for ENOENT, EEXIST and EINVAL errors + + +shmget03 + test for ENOSPC error + + +shmget04 + test for EACCES error + + +shmget05 + test for EACCES error + +openfile + + Creates files and opens simultaneously + +open01 + + Open a file with oflag = O_CREAT set, does it set the sticky bit off? + + Open "/tmp" with O_DIRECTORY, does it set the S_IFDIR bit on? + +open02 + + Test if open without O_CREAT returns -1 if a file does not exist. + +open03 + + Basic test for open(2) + +open04 + + Testcase to check that open(2) sets EMFILE if a process opens files + more than its descriptor size + +open05 + + Testcase to check open(2) sets errno to EACCES correctly. + +open06 + + Testcase to check open(2) sets errno to ENXIO correctly. + +open07 + + Test the open(2) system call to ensure that it sets ELOOP correctly. + +open08 + + Check for the following errors: + 1. EEXIST + 2. EISDIR + 3. ENOTDIR + 4. ENAMETOOLONG + 5. EFAULT + 6. ETXTBSY + + +openfile + + Creates files and opens simultaneously + + +chdir01 + + Check proper operation of chdir(): tests whether the + system call can it change the current, working directory, and find a + file there? Will it fail on a non-directory entry ? + +chdir02 + + Basic test for chdir(2). + +chdir03 + + Testcase for testing that chdir(2) sets EACCES errno + +chdir04 + + Testcase to test whether chdir(2) sets errno correctly. + + +chmod01 + + Verify that, chmod(2) succeeds when used to change the mode permissions + of a file. + +chmod02 + + Basic test for chmod(2). + +chmod03 + + Verify that, chmod(2) will succeed to change the mode of a file + and set the sticky bit on it if invoked by non-root (uid != 0) + process with the following constraints, + - the process is the owner of the file. + - the effective group ID or one of the supplementary group ID's of the + process is equal to the group ID of the file. + +chmod04 + + Verify that, chmod(2) will succeed to change the mode of a directory + and set the sticky bit on it if invoked by non-root (uid != 0) process + with the following constraints, + - the process is the owner of the directory. + - the effective group ID or one of the supplementary group ID's of the + process is equal to the group ID of the directory. + +chmod05 + + Verify that, chmod(2) will succeed to change the mode of a directory + but fails to set the setgid bit on it if invoked by non-root (uid != 0) + process with the following constraints, + - the process is the owner of the directory. + - the effective group ID or one of the supplementary group ID's of the + process is not equal to the group ID of the directory. + +chmod06 + + Verify that, + 1) chmod(2) returns -1 and sets errno to EPERM if the effective user id + of process does not match the owner of the file and the process is + not super user. + 2) chmod(2) returns -1 and sets errno to EACCES if search permission is + denied on a component of the path prefix. + 3) chmod(2) returns -1 and sets errno to EFAULT if pathname points + outside user's accessible address space. + 4) chmod(2) returns -1 and sets errno to ENAMETOOLONG if the pathname + component is too long. + 5) chmod(2) returns -1 and sets errno to ENOTDIR if the directory + component in pathname is not a directory. + 6) chmod(2) returns -1 and sets errno to ENOENT if the specified file + does not exists. + +chmod07 + + Verify that, chmod(2) will succeed to change the mode of a file/directory + and sets the sticky bit on it if invoked by root (uid = 0) process with + the following constraints, + - the process is not the owner of the file/directory. + - the effective group ID or one of the supplementary group ID's of the + process is equal to the group ID of the file/directory. + + +chown01 + + Basic test for chown(2). + +chown02 + + Verify that, when chown(2) invoked by super-user to change the owner and + group of a file specified by path to any numeric owner(uid)/group(gid) + values, + - clears setuid and setgid bits set on an executable file. + - preserves setgid bit set on a non-group-executable file. + +chown03 + + Verify that, chown(2) succeeds to change the group of a file specified + by path when called by non-root user with the following constraints, + - euid of the process is equal to the owner of the file. + - the intended gid is either egid, or one of the supplementary gids + of the process. + Also, verify that chown() clears the setuid/setgid bits set on the file. + +chown04 + + Verify that, + 1) chown(2) returns -1 and sets errno to EPERM if the effective user id + of process does not match the owner of the file and the process is + not super user. + 2) chown(2) returns -1 and sets errno to EACCES if search permission is + denied on a component of the path prefix. + 3) chown(2) returns -1 and sets errno to EFAULT if pathname points + outside user's accessible address space. + 4) chown(2) returns -1 and sets errno to ENAMETOOLONG if the pathname + component is too long. + 5) chown(2) returns -1 and sets errno to ENOTDIR if the directory + component in pathname is not a directory. + 6) chown(2) returns -1 and sets errno to ENOENT if the specified file + does not exists. + +chown05 + + Verify that, chown(2) succeeds to change the owner and group of a file + specified by path to any numeric owner(uid)/group(gid) values when invoked + by super-user. + + +close01 + + Test that closing a regular file and a pipe works correctly + +close02 + + Check that an invalid file descriptor returns EBADF + +close08 + + Basic test for close(2). + + +fchdir01 + + create a directory and cd into it. + +fchdir02 + + try to cd into a bad directory (bad fd). + + +fchmod01 + + Basic test for Fchmod(2). + +fchmod02 + + Verify that, fchmod(2) will succeed to change the mode of a file/directory + set the sticky bit on it if invoked by root (uid = 0) process with + the following constraints, + - the process is not the owner of the file/directory. + - the effective group ID or one of the supplementary group ID's of the + process is equal to the group ID of the file/directory. + +fchmod03 + + Verify that, fchmod(2) will succeed to change the mode of a file + and set the sticky bit on it if invoked by non-root (uid != 0) + process with the following constraints, + - the process is the owner of the file. + - the effective group ID or one of the supplementary group ID's of the + process is equal to the group ID of the file. + +fchmod04 + + Verify that, fchmod(2) will succeed to change the mode of a directory + and set the sticky bit on it if invoked by non-root (uid != 0) process + with the following constraints, + - the process is the owner of the directory. + - the effective group ID or one of the supplementary group ID's of the + process is equal to the group ID of the directory. + +fchmod05 + + Verify that, fchmod(2) will succeed to change the mode of a directory + but fails to set the setgid bit on it if invoked by non-root (uid != 0) + process with the following constraints, + - the process is the owner of the directory. + - the effective group ID or one of the supplementary group ID's of the + process is not equal to the group ID of the directory. + +fchmod06 + + Verify that, + 1) fchmod(2) returns -1 and sets errno to EPERM if the effective user id + of process does not match the owner of the file and the process is + not super user. + 2) fchmod(2) returns -1 and sets errno to EBADF if the file descriptor + of the specified file is not valid. + +fchmod07 + + Verify that, fchmod(2) succeeds when used to change the mode permissions + of a file specified by file descriptor. + + +fchown01 + + Basic test for fchown(2). + +fchown02 + + Verify that, when fchown(2) invoked by super-user to change the owner and + group of a file specified by file descriptor to any numeric + owner(uid)/group(gid) values, + - clears setuid and setgid bits set on an executable file. + - preserves setgid bit set on a non-group-executable file. + +fchown03 + + Verify that, fchown(2) succeeds to change the group of a file specified + by path when called by non-root user with the following constraints, + - euid of the process is equal to the owner of the file. + - the intended gid is either egid, or one of the supplementary gids + of the process. + Also, verify that fchown() clears the setuid/setgid bits set on the file. + +fchown04 + + Verify that, + 1) fchown(2) returns -1 and sets errno to EPERM if the effective user id + of process does not match the owner of the file and the process is + not super user. + 2) fchown(2) returns -1 and sets errno to EBADF if the file descriptor + of the specified file is not valid. + +fchown05 + + Verify that, fchown(2) succeeds to change the owner and group of a file + specified by file descriptor to any numeric owner(uid)/group(gid) values + when invoked by super-user. + +lchown01 + + Verify that, lchown(2) succeeds to change the owner and group of a file + specified by path to any numeric owner(uid)/group(gid) values when invoked + by super-user. + + +lchown02 + + Verify that, + 1) lchown(2) returns -1 and sets errno to EPERM if the effective user id + of process does not match the owner of the file and the process is + not super user. + 2) lchown(2) returns -1 and sets errno to EACCES if search permission is + denied on a component of the path prefix. + 3) lchown(2) returns -1 and sets errno to EFAULT if pathname points + outside user's accessible address space. + 4) lchown(2) returns -1 and sets errno to ENAMETOOLONG if the pathname + component is too long. + 5) lchown(2) returns -1 and sets errno to ENOTDIR if the directory + component in pathname is not a directory. + 6) lchown(2) returns -1 and sets errno to ENOENT if the specified file + does not exists. + + +creat01 + + Testcase to check the basic functionality of the creat(2) system call. + +creat03 + + Testcase to check whether the sticky bit cleared. + +creat04 + + Testcase to check creat(2) fails with EACCES + +creat05 + + Testcase to check that creat(2) system call returns EMFILE. + +creat06 + + Testcase to check creat(2) sets the following errnos correctly: + 1. EISDIR + 2. ENAMETOOLONG + 3. ENOENT + 4. ENOTDIR + 5. EFAULT + 6. EACCES + +creat07 + + Testcase to check creat(2) sets the following errnos correctly: + 1. ETXTBSY + +creat09 + + Basic test for creat(2) using 0700 argument. + +truncate01 + + Verify that, truncate(2) succeeds to truncate a file to a specified + length. + + +truncate02 + + Verify that, truncate(2) succeeds to truncate a file to a certain length, + but the attempt to read past the truncated length will fail. + + +truncate03 + + Verify that, + 1) truncate(2) returns -1 and sets errno to EACCES if search/write + permission denied for the process on the component of the path prefix + or named file. + 2) truncate(2) returns -1 and sets errno to ENOTDIR if the component of + the path prefix is not a directory. + 3) truncate(2) returns -1 and sets errno to EFAULT if pathname points + outside user's accessible address space. + 4) truncate(2) returns -1 and sets errno to ENAMETOOLONG if the component + of a pathname exceeded 255 characters or entire pathname exceeds 1023 + characters. + 5) truncate(2) returns -1 and sets errno to ENOENT if the named file + does not exist. + +ftruncate01 + + Verify that, ftruncate(2) succeeds to truncate a file to a specified + length if the file indicated by file descriptor opened for writing. + +ftruncate02 + + Verify that, ftruncate(2) succeeds to truncate a file to a certain length, + but the attempt to read past the truncated length will fail. + +ftruncate03 + + Verify that, + 1) ftruncate(2) returns -1 and sets errno to EINVAL if the specified + truncate length is less than 0. + 2) ftruncate(2) returns -1 and sets errno to EBADF if the file descriptor + of the specified file is not valid. + +vhangup01 + + Check the return value, and errno of vhangup(2) + when a non-root user calls vhangup(). + +vhangup02 + + To test the basic functionality of vhangup(2) +growfiles + + This program will grow a list of files. + Each file will grow by grow_incr before the same + file grows twice. Each file is open and closed before next file is opened. + +pipe01 + + Testcase to check the basic functionality of the pipe(2) syscall: + Check that both ends of the pipe (both file descriptors) are + available to a process opening the pipe. + +pipe05 + + Check what happens when pipe is passed a bad file descriptor. + +pipe06 + + Check what happens when the system runs out of pipes. + +pipe08 + + Check that a SIGPIPE signal is generated when a write is + attempted on an empty pipe. + +pipe09 + + Check that two processes can use the same pipe at the same time. + +pipe10 + + Check that parent can open a pipe and have a child read from it + +pipe11 + + Check if many children can read what is written to a pipe by the + parent. + +pipeio + + This tool can be used to beat on system or named pipes. + See the help() function below for user information. + + /ipc_stress/message_queue_test_01.c + /ipc_stress/pipe_test_01.c + /ipc_stress/semaphore_test_01.c + /ipc_stress/single_test_01.c + +proc01 + Recursively reads all files within /proc filesystem. + +lftest + The purpose of this test is to verify the file size limitations of a filesystem. + It writes one buffer at a time and lseeks from the beginning of the file to the + end of the last write position. The intent is to test lseek64. + + +llseek01 + + Verify that, llseek() call succeeds to set the file pointer position + to an offset larger than file size. Also, verify that any attempt + to write to this location fails. + +llseek02 + + Verify that, + 1. llseek() returns -1 and sets errno to EINVAL, if the 'Whence' argument + is not a proper value. + 2. llseek() returns -1 and sets errno to EBADF, if the file handle of + the specified file is not valid. + +lseek01 + + Basic test for lseek(2) + +lseek02 + + Negative test for lseek(2) + +lseek03 + + Negative test for lseek(2) whence + +lseek04 + + Negative test for lseek(2) of a fifo + +lseek05 + + Negative test for lseek(2) of a pipe + +lseek06 + + Verify that, lseek() call succeeds to set the file pointer position + to less than or equal to the file size, when a file is opened for + read or write. + +lseek07 + + Verify that, lseek() call succeeds to set the file pointer position + to more than the file size, when a file is opened for reading/writing. + +lseek08 + + Verify that, lseek() call succeeds to set the file pointer position + to the end of the file when 'whence' value set to SEEK_END and any + attempts to read from that position should fail. + +lseek09 + + Verify that, lseek() call succeeds to set the file pointer position + to the current specified location, when 'whence' value is set to + SEEK_CUR and the data read from the specified location should match + the expected data. + +lseek10 + + Verify that, + 1. lseek() returns -1 and sets errno to ESPIPE, if the file handle of + the specified file is associated with a pipe, socket, or FIFO. + 2. lseek() returns -1 and sets errno to EINVAL, if the 'Whence' argument + is not a proper value. + 3. lseek() returns -1 and sets errno to EBADF, if the file handle of + the specified file is not valid. + +rwtest + + A wrapper for doio and iogen. + +doio + a general purpose io initiator with system call and + write logging. See doio.h for the structure which defines + what doio requests should look like. + + Currently doio can handle read,write,reada,writea,ssread, + sswrite, and many varieties of listio requests. + For disk io, if the O_SSD flag is set doio will allocate + the appropriate amount of ssd and do the transfer - thus, doio + can handle all of the primitive types of file io. + +iogen + A tool for generating file/sds io for a doio process + +pread01 + + Verify the functionality of pread() by writing known data using pwrite() + to the file at various specified offsets and later read from the file from + various specified offsets, comparing the data read against the data + written. + +pread02 + + Verify that, + 1) pread() fails when attempted to read from an unnamed pipe. + 2) pread() fails if the specified offset position was invalid. + + +pwrite01 + + Verify the functionality of pwrite() by writing known data using pwrite() + to the file at various specified offsets and later read from the file from + various specified offsets, comparing the data written against the data + read using read(). + +pwrite02 + + Verify that, + 1) pwrite() fails when attempted to write to an unnamed pipe. + 2) pwrite() fails if the specified offset position was invalid. + + +read01 + + Basic test for the read(2) system call + +read02 + + test 1: Does read return -1 if file descriptor is not valid, check for EBADF + + test 2: Check if read sets EISDIR, if the fd refers to a directory + + test 3: Check if read sets EFAULT, if buf is -1. + +read03 + + Testcase to check that read() sets errno to EAGAIN + +read04 + + Testcase to check if read returns the number of bytes read correctly. + + +readv01 + + Testcase to check the basic functionality of the readv(2) system call. + +readv02 + + Testcase to check the error conditions of the readv(2) system call. + +write01 + + Basic test for write(2) system call. + +write02 + + Basic functionality test: does the return from write match the count + of the number of bytes written. + + +write03 + + Testcase to check that write(2) doesn't corrupt a file when it fails + +write04 + + Testcase to check that write() sets errno to EAGAIN + +write05 + + Check the return value, and errnos of write(2) + - when the file descriptor is invalid - EBADF + - when the buf parameter is invalid - EFAULT + - on an attempt to write to a pipe that is not open for reading - EPIPE + + +writev01 + + Testcase to check the basic functionality of writev(2) system call. + + +writev02 + + In these testcases, writev() is called with partially valid data + to be written in a sparse file. + + +writev03 + + The testcases are written calling writev() with partially valid data + to overwrite the contents, to write in the beginning and to write in + the end of the file. + +writev04 + + The testcases are written calling writev() with partially valid data + to overwrite the contents, to write in the beginning and to write in + the end of the file. This is same as writev03, but the length of + buffer used here is 8192 bytes. + +writev05 + + These testcases are written to test writev() on sparse files. This + is same as writev02. But the initial write() with valid data is + done at the beginning of the file. + +disktest + + Does repeated accesses to a filespec and optionally writes to, reads from, + and verifies the data. By default, disktest makes assumptions about + the running environment which allows for a quick start of IO generation. + However, Disktest has a large number of command line options which can + be used to adapt the test for a variety of uses including data integrity, + medium integrity, performance, and simple application simulation. + + + + +getdents01 + get a directory entry + +getdents02 + check that we get a failure with a bad file descriptor + + +getdents03 + check for an EINVAL error + + +getdents04 + check for an ENOTDIR error + +getdents05 + check that we get a failure with a bad dirp address. +process_stress + Spawn creates a tree + of processes with Dval depth and Bval breadth. Each parent will spawn + Bval children. Each child will store information about themselves + in shared memory. The leaf nodes will communicate the existence + of one another through message queues, once each leaf node has + received communication from all of her siblings she will reduce + the semaphore count and exit. Meanwhile all parents are waiting + to hear from their children through the use of semaphores. When + the semaphore count reaches zero then the parent knows all the + children have talked to one another. Locking of the connter semaphore + is provided by the use of another (binary) semaphore. + + + + +sched_stress + Exports required environment variables and runs sched_driver +sched_driver + This program uses system calls to change the + priorities of the throughput measurement testcases. + When real-time is in effect, priorities 50 through 64 + are used. (MAX_PRI and MIN_PRI) When user-time + (normal) is in effect, 0-14 (corresponding to nice() + calls) is used. The driver only keeps track of + values from 50 to 64, and the testcases will scale + them down to 0 to 14 when needed, to change the + priority of a user-time process. + +time-schedule + This programme will determine the context switch + (scheduling) overhead on a system. It takes into + account SMP machines. True context switches are + measured. +trace_sched + This utility spawns N tasks, each task sets its priority + by making a system call to the scheduler. The thread + function reads the priority that the scheduler sets for + this task and also reads from /proc the processor this + task last executed on the information that is gathered + by the thread function may be in real-time. Its only an + approximation. + +sched_getscheduler01 + + Testcase to check sched_getscheduler() returns correct return value + +sched_getscheduler02 + + To check for the errno ESRCH + + +sched_setscheduler01 + + Testcase to test whether sched_setscheduler(2) sets the errnos + correctly. + +sched_setscheduler02 + + Testcase to test whether sched_setscheduler(2) sets the errnos + correctly. + + +sched_yield01 + + Testcase to check that sched_yield returns correct values. + + +nice01 + + Verify that root can provide a negative value to nice() + and hence root can decrease the nice value of the process + using nice() system call + +nice02 + + Verify that any user can successfully increase the nice value of + the process by passing a higher increment value (> max. applicable limits) + to nice() system call. + +nice03 + + Verify that any user can successfully increase the nice value of + the process by passing an increment value (< max. applicable limits) to + nice() system call. + +nice04 + + Verify that, nice(2) fails when, a non-root user attempts to increase + the priority of a process by specifying a negative increment value. + +nice05 + + Basic test for nice(2) + + +poll01 + + Verify that valid open file descriptor must be provided to poll() to + succeed. + +select01 + + Basic test for the select(2) system call to a fd of regular file with no I/O + and small timeout + +select02 + + Basic test for the select(2) system call to fd of system pipe with no I/O + and small timeout + +select03 + + Basic test for the select(2) system call to fd of a named-pipe (FIFO) + +select04 + + Verify that select(2) returns immediately (does not block) if the + timeout value is zero. + +select05 + + Verify that select(2) fails when one or more of the file descriptor sets + specify a file descriptor which is not valid. + +select06 + + Verify that select(2) fails when a signal is delivered before any of the + selected events occur and before the timeout interval expires. + +select07 + + Verify that select(2) fails when an invalid timeout interval is specified. + +select08 + + Verify the functionality of select(2) by passing non-null writefds + which points to a regular file, pipes or FIFO's. + +select09 + + Verify the functionality of select(2) by passing non-null readfds + which points to a regular file, pipes or FIFO's. + +select10 + + Verify that a successful call to select() shall return the desired + number of modified descriptors for which bits are set in the bit masks, + where descriptors points to a regular file, pipes or FIFO's. +sem01 + + Creates a semaphore and two processes. The processes + each go through a loop where they semdown, delay for a + random amount of time, and semup, so they will almost + always be fighting for control of the semaphore. + +sem02 + The application creates several threads using pthread_create(). + One thread performs a semop() with the SEM_UNDO flag set. The + change in semaphore value performed by that semop should be + "undone" only when the last pthread exits. + + +semctl01 + + test the 10 possible semctl() commands + +semctl02 + + test for EACCES error + +semctl03 + + test for EINVAL and EFAULT errors + +semctl04 + + test for EPERM error + + +semctl05 + + test for ERANGE error + +semget01 + + test that semget() correctly creates a semaphore set + +semget02 + + test for EACCES and EEXIST errors + +semget03 + + test for ENOENT error + +semget05 + + test for ENOSPC error + +semget06 + + test for EINVAL error + +semop01 + + test that semop() basic functionality is correct + +semop02 + + test for E2BIG, EACCES, EFAULT and EINVAL errors + +semop03 + + test for EFBIG error + +semop04 + + test for EAGAIN error + +semop05 + + test for EINTR and EIDRM errors + + +shmat01 + test that shmat() works correctly + +shmat02 + check for EINVAL and EACCES errors + + +shmat03 + test for EACCES error + + +shmctl01 + test the IPC_STAT, IPC_SET and IPC_RMID commands as + they are used with shmctl() + + +shmctl02 + check for EACCES, EFAULT and EINVAL errors + + +shmctl03 + check for EACCES, and EPERM errors + + +shmdt01 + check that shared memory is detached correctly + + +shmdt02 + check for EINVAL error + + +shmget01 + test that shmget() correctly creates a shared memory segment + + +shmget02 + check for ENOENT, EEXIST and EINVAL errors + + +shmget03 + test for ENOSPC error + + +shmget04 + test for EACCES error + + +shmget05 + test for EACCES error +shmat1 + + Test the LINUX memory manager. The program is aimed at + stressing the memory manager by repeated shmat/write/read/ + shmatd of file/memory of random size (maximum 1000 * 4096) + done by multiple processes. + +shm_test + + This program is designed to stress the Memory management sub - + system of Linux. This program will spawn multiple pairs of + reader and writer threads. One thread will create the shared + segment of random size and write to this memory, the other + pair will read from this memory. + +sigaction01 + + Test some features of sigaction (see below for more details) + + +sigaction02 + + Testcase to check the basic errnos set by the sigaction(2) syscall. + + +sigaltstack01 + + Send a signal using the main stack. While executing the signal handler + compare a variable's address lying on the main stack with the stack + boundaries returned by sigaltstack(). + + +sigaltstack02 + + Verify that, + 1. sigaltstack() fails and sets errno to EINVAL when "ss_flags" field + pointed to by 'ss' contains invalid flags. + 2. sigaltstack() fails and sets errno to ENOMEM when the size of alternate + stack area is less than MINSIGSTKSZ. + +sighold02 + + Basic test for the sighold02(2) system call. + + +signal01 + set the signal handler to our own function + + +signal02 + Test that we get an error using illegal signals + +signal03 + + Boundary value and other invalid value checking of signal setup and signal + sending. + + +signal04 + restore signals to default behavior + + +signal05 + set signals to be ignored + + +sigprocmask01 + + Verify that sigprocmask() succeeds to examine and change the calling + process's signal mask. + Also, verify that sigpending() succeeds to store signal mask that are + blocked from delivery and pending for the calling process. + +sigrelse01 + + Basic test for the sigrelse(2) system call. + +sigsuspend01 + + Verify that sigsuspend() succeeds to change process's current signal + mask with the specified signal mask and suspends the process execution + until the delivery of a signal. +kill01 + + Test case to check the basic functionality of kill(). + +kill02 + + Sending a signal to processes with the same process group ID + +kill03 + + Test case to check that kill fails when given an invalid signal. + +kill04 + + Test case to check that kill() fails when passed a non-existent pid. + +kill05 + + Test case to check that kill() fails when passed a pid owned by another + user. + +kill06 + + Test case to check the basic functionality of kill() when killing an + entire process group with a negative pid. + +kill07 + + Test case to check that SIGKILL can not be caught. + +kill08 + + Test case to check the basic functionality of kill() when kill an + entire process group. + +kill09 + Basic test for kill(2) + +kill10 + Signal flooding test. + + +mtest01 + mallocs memory at a time until malloc fails. +mallocstress + + This program is designed to stress the VMM by doing repeated */ + mallocs and frees, with out using the swap space. This is */ + achieved by spawning N threads with repeatedly malloc and free*/ + a memory of size M. The stress can be increased by increasing */ + the number of repetitions over the default number using the */ + -l [num] option. + +clisrv + + Sender: Read contents of data file. Write each line to socket, then + read line back from socket and write to standard output. + Receiver: Read a stream socket one line at a time and write each line + back to the sender. + Usage: pthcli [port number] + + +socket01 + + Verify that socket() returns the proper errno for various failure cases + + +socketpair01 + + Verify that socketpair() returns the proper errno for various failure cases + + +sockioctl01 + + Verify that ioctl() on sockets returns the proper errno for various + failure cases + +connect01 + + Verify that connect() returns the proper errno for various failure cases + +getpeername01 + + Verify that getpeername() returns the proper errno for various failure cases + + +getsockname01 + + Verify that getsockname() returns the proper errno for various failure cases + +getsockopt01 + + Verify that getsockopt() returns the proper errno for various failure cases + +listen01 + + Verify that listen() returns the proper errno for various failure cases + +accept01 + + Verify that accept() returns the proper errno for various failure cases + +bind01 + + Verify that bind() returns the proper errno for various failure cases + + +recv01 + + Verify that recv() returns the proper errno for various failure cases + + +recvfrom01 + + Verify that recvfrom() returns the proper errno for various failure cases + + +recvmsg01 + + Verify that recvmsg() returns the proper errno for various failure cases + +send01 + + Verify that send() returns the proper errno for various failure cases + +sendmsg01 + + Verify that sendmsg() returns the proper errno for various failure cases +sendto01 + + Verify that sendto() returns the proper errno for various failure cases + +setsockopt01 + + Verify that setsockopt() returns the proper errno for various failure cases + + +fstat01 + + Basic test for fstat(2) + +fstat02 + + Verify that, fstat(2) succeeds to get the status of a file and fills + the stat structure elements though file pointed to by file descriptor + not opened for reading. + +fstat03 + + Verify that, fstat(2) returns -1 and sets errno to EBADF if the file + pointed to by file descriptor is not valid. + +fstat04 + + Verify that, fstat(2) succeeds to get the status of a file pointed by + file descriptor and fills the stat structure elements. + + +fstatfs01 + + Basic test for fstatfs(2) + +fstatfs02 + + Testcase to check fstatfs() sets errno correctly. + +lstat01 + + Verify that, lstat(2) succeeds to get the status of a file pointed to by + symlink and fills the stat structure elements. + +lstat02 + + Basic test for lstat(2) + +lstat03 + + Verify that, + 1) lstat(2) returns -1 and sets errno to EACCES if search permission is + denied on a component of the path prefix. + 2) lstat(2) returns -1 and sets errno to ENOENT if the specified file + does not exists or empty string. + 3) lstat(2) returns -1 and sets errno to EFAULT if pathname points + outside user's accessible address space. + 4) lstat(2) returns -1 and sets errno to ENAMETOOLONG if the pathname + component is too long. + 5) lstat(2) returns -1 and sets errno to ENOTDIR if the directory + component in pathname is not a directory. + +stat01 + + Verify that, stat(2) succeeds to get the status of a file and fills the + stat structure elements. + +stat02 + + Verify that, stat(2) succeeds to get the status of a file and fills the + stat structure elements though process doesn't have read access to the + file. + + +stat03 + + Verify that, + 1) stat(2) returns -1 and sets errno to EACCES if search permission is + denied on a component of the path prefix. + 2) stat(2) returns -1 and sets errno to ENOENT if the specified file + does not exists or empty string. + 3) stat(2) returns -1 and sets errno to EFAULT if pathname points + outside user's accessible address space. + 4) stat(2) returns -1 and sets errno to ENAMETOOLONG if the pathname + component is too long. + 5) stat(2) returns -1 and sets errno to ENOTDIR if the directory + component in pathname is not a directory. + +stat05 + + Basic test for the stat05(2) system call. + +statfs01 + + Basic test for the statfs(2) system call. + +statfs02 + + Testcase to check that statfs(2) sets errno correctly. + + +read01 + + Basic test for the read(2) system call + +read02 + + test 1: Does read return -1 if file descriptor is not valid, check for EBADF + + test 2: Check if read sets EISDIR, if the fd refers to a directory + + test 3: Check if read sets EFAULT, if buf is -1. + +read03 + + Testcase to check that read() sets errno to EAGAIN + +read04 + + Testcase to check if read returns the number of bytes read correctly. + +umask01 + + Basic test for the umask(2) system call. + +umask02 + + Check that umask changes the mask, and that the previous + value of the mask is returned correctly for each value. + +umask03 + + Check that umask changes the mask, and that the previous + value of the mask is returned correctly for each value. + + + +getgroups01 + + Getgroups system call critical test + +getgroups02 + + Basic test for getgroups(2) + +getgroups03 + + Verify that, getgroups() system call gets the supplementary group IDs + of the calling process. + +getgroups04 + + Verify that, + getgroups() fails with -1 and sets errno to EINVAL if the size + argument value is -ve. + +gethostname01 + + Basic test for gethostname(2) + + +getpgid01 + + Testcase to check the basic functionality of getpgid(). + +getpgid02 + + Testcase to check the basic functionality of getpgid(). + +getpgrp01 + Basic test for getpgrp(2) + + +getpriority01 + + Verify that getpriority() succeeds get the scheduling priority of + the current process, process group or user. + + +getpriority02 + + Verify that, + 1) getpriority() sets errno to ESRCH if no process was located + was located for 'which' and 'who' arguments. + 2) getpriority() sets errno to EINVAL if 'which' argument was + not one of PRIO_PROCESS, PRIO_PGRP, or PRIO_USER. + +getresgid01 + + Verify that getresgid() will be successful to get the real, effective + and saved user id of the calling process. + +getresgid02 + + Verify that getresgid() will be successful to get the real, effective + and saved user ids after calling process invokes setregid() to change + the effective/saved gids to that of specified user. + +getresgid03 + + Verify that getresgid() will be successful to get the real, effective + and saved user ids after calling process invokes setresgid() to change + the effective gid to that of specified user. + + +getresuid01 + + Verify that getresuid() will be successful to get the real, effective + and saved user id of the calling process. + +getresuid02 + + Verify that getresuid() will be successful to get the real, effective + and saved user ids after calling process invokes setreuid() to change + the effective/saved uids to that of specified user. + +getresuid03 + + Verify that getresuid() will be successful to get the real, effective + and saved user ids after calling process invokes setresuid() to change + the effective uid to that of specified user. + + +getsid01 + + call getsid() and make sure it succeeds + +getsid02 + + call getsid() with an invalid PID to produce a failure + + +setfsgid01 + + Testcase to check the basic functionality of setfsgid(2) system + call. + +setfsuid01 + + Testcase to test the basic functionality of the setfsuid(2) system + call. + + +setgid01 + + Basic test for the setgid(2) system call. + +setgid02 + + Testcase to ensure that the setgid() system call sets errno to EPERM + + +setgroups01 + + Basic test for the setgroups(2) system call. + +setgroups02 + + Verify that, + 1. setgroups() fails with -1 and sets errno to EINVAL if the size + argument value is > NGROUPS + 2. setgroups() fails with -1 and sets errno to EPERM if the + calling process is not super-user. + +setgroups03 + + Verify that, only root process can invoke setgroups() system call to + set the supplementary group IDs of the process. + + +setpgid01 + + Basic test for setpgid(2) system call. + +setpgid02 + + Testcase to check that setpgid() sets errno correctly. + +setpgid03 + + Test to check the error and trivial conditions in setpgid system call + +setpriority01 + + set the priority for the test process lower. + +setpriority02 + + test for an expected failure by trying to raise + the priority for the test process while not having + permissions to do so. + +setpriority03 + + test for an expected failure by using an invalid + PRIO value + setpriority04 + +setpriority04 + test for an expected failure by using an invalid + process id + + +setpriority05 + test for an expected failure by trying to change + a process with an ID that is different from the + test process + +setregid01 + + Basic test for the setregid(2) system call. + +setregid02 + + Test that setregid() fails and sets the proper errno values when a + non-root user attempts to change the real or effective group id to a + value other than the current gid or the current effective gid. + +setregid03 + + Test setregid() when executed by a non-root user. + +setregid04 + + Test setregid() when executed by root. + +setresuid01 + + Test setresuid() when executed by root. + +setresuid02 + + Test that a non-root user can change the real, effective and saved + uid values through the setresuid system call. + + +setresuid03 + + Test that the setresuid system call sets the proper errno + values when a non-root user attempts to change the real, effective or + saved uid to a value other than one of the current uid, the current + effective uid of the current saved uid. Also verify that setresuid + fails if an invalid uid value is given. + +setreuid01 + + Basic test for the setreuid(2) system call. + +setreuid02 + + Test setreuid() when executed by root. + +setreuid03 + + Test setreuid() when executed by an unprivileged user. + + +setreuid04 + + Test that root can change the real and effective uid to an + unprivileged user. + +setreuid05 + + Test the setreuid() feature, verifying the role of the saved-set-uid + and setreuid's effect on it. + +setreuid06 + + Test that EINVAL is set when setreuid is given an invalid user id. + +setrlimit01 + + Testcase to check the basic functionality of the setrlimit system call. + + +setrlimit02 + + Testcase to test the different errnos set by setrlimit(2) system call. + +setrlimit03 + + Test for EPERM when the super-user tries to increase RLIMIT_NOFILE + beyond the system limit. + +setsid01 + + Test to check the error and trivial conditions in setsid system call + +setuid01 + + Basic test for the setuid(2) system call. + +setuid02 + + Basic test for the setuid(2) system call as root. + +setuid03 + + Test to check the error and trivial conditions in setuid + +fs_perms + + Regression test for Linux filesystem permissions. +uname01 + + Basic test for the uname(2) system call. + +uname02 + + Call uname() with an invalid address to produce a failure + +uname03 + + Call uname() and make sure it succeeds +sysctl01 + + Testcase for testing the basic functionality of sysctl(2) system call. + This testcase attempts to read the kernel parameters using + sysctl({CTL_KERN, KERN_ }, ...) and compares it with the known + values. + +sysctl03 + + Testcase to check that sysctl(2) sets errno to EPERM correctly. + + +sysctl04 + + Testcase to check that sysctl(2) sets errno to ENOTDIR + + +sysctl05 + + Testcase to check that sysctl(2) sets errno to EFAULT + +time01 + + Basic test for the time(2) system call. + + +time02 + + Verify that time(2) returns the value of time in seconds since + the Epoch and stores this value in the memory pointed to by the parameter. + +times01 + + Basic test for the times(2) system call. + +times02 + + Testcase to test that times() sets errno correctly + +times03 + + Testcase to check the basic functionality of the times() system call. + +utime01 + + Verify that the system call utime() successfully sets the modification + and access times of a file to the current time, if the times argument + is null, and the user ID of the process is "root". + +utime02 + + Verify that the system call utime() successfully sets the modification + and access times of a file to the current time, under the following + constraints, + - The times argument is null. + - The user ID of the process is not "root". + - The file is owned by the user ID of the process. + +utime03 + + Verify that the system call utime() successfully sets the modification + and access times of a file to the current time, under the following + constraints, + - The times argument is null. + - The user ID of the process is not "root". + - The file is not owned by the user ID of the process. + - The user ID of the process has write access to the file. + + +utime04 + + Verify that the system call utime() successfully sets the modification + and access times of a file to the time specified by times argument, if + the times argument is not null, and the user ID of the process is "root". + + +utime05 + + Verify that the system call utime() successfully sets the modification + and access times of a file to the value specified by the times argument + under the following constraints, + - The times argument is not null, + - The user ID of the process is not "root". + - The file is owned by the user ID of the process. + + +utime06 + + 1. Verify that the system call utime() fails to set the modification + and access times of a file to the current time, under the following + constraints, + - The times argument is null. + - The user ID of the process is not "root". + - The file is not owned by the user ID of the process. + - The user ID of the process does not have write access to the + file. + 2. Verify that the system call utime() fails to set the modification + and access times of a file if the specified file doesn't exist. + +settimeofday01 + + Testcase to check the basic functionality of settimeofday(). + + +settimeofday02 + + Testcase to check that settimeofday() sets errnos correctly. + +stime01 + + Verify that the system call stime() successfully sets the system's idea + of data and time if invoked by "root" user. + +stime02 + + Verify that the system call stime() fails to set the system's idea + of data and time if invoked by "non-root" user. + +gettimeofday01 + + Testcase to check that gettimeofday(2) sets errno to EFAULT. + + + +alarm01 + + Basic test for alarm(2). + +alarm02 + + Boundary Value Test for alarm(2). + +alarm03 + + Alarm(2) cleared by a fork. + +alarm04 + + Check that when an alarm request is made, the signal SIGALRM is received + even after the process has done an exec(). + +alarm05 + + Check the functionality of the Alarm system call when the time input + parameter is non zero. + +alarm06 + + Check the functionality of the Alarm system call when the time input + parameter is zero. + +alarm07 + + Check the functionality of the alarm() when the time input + parameter is non-zero and the process does a fork. + +getegid01 + + Basic test for getegid(2) + + +geteuid01 + + Basic test for geteuid(2) + + +getgid01 + + Basic test for getgid(2) + +getgid02 + + Testcase to check the basic functionality of getgid(). + +getgid03 + + Testcase to check the basic functionality of getegid(). + + +getpid01 + + Basic test for getpid(2) + + +getpid02 + + Verify that getpid() system call gets the process ID of the of the + calling process. + + +getppid01 + + Testcase to check the basic functionality of the getppid() syscall. + + +getuid01 + + Basic test for getuid(2) + +getuid02 + + Testcase to check the basic functionality of the geteuid() system call. + +getuid03 + + Testcase to check the basic functionality of the getuid() system call. + +nanosleep01 + + Verify that nanosleep() will be successful to suspend the execution + of a process for a specified time. + +nanosleep02 + + Verify that nanosleep() will be successful to suspend the execution + of a process, returns after the receipt of a signal and writes the + remaining sleep time into the structure. + +nanosleep03 + + Verify that nanosleep() will fail to suspend the execution + of a process for a specified time if interrupted by a non-blocked signal. + +nanosleep04 + + Verify that nanosleep() will fail to suspend the execution + of a process if the specified pause time is invalid. + diff --git a/utils/lcov-1.11/example/README b/utils/lcov-1.11/example/README new file mode 100755 index 00000000..cf6cf2e4 --- /dev/null +++ b/utils/lcov-1.11/example/README @@ -0,0 +1,6 @@ + +To get an example of how the LCOV generated HTML output looks like, +type 'make output' and point a web browser to the resulting file + + output/index.html + diff --git a/utils/lcov-1.11/example/descriptions.txt b/utils/lcov-1.11/example/descriptions.txt new file mode 100755 index 00000000..47e60213 --- /dev/null +++ b/utils/lcov-1.11/example/descriptions.txt @@ -0,0 +1,10 @@ +test_noargs + Example program is called without arguments so that default range + [0..9] is used. + +test_2_to_2000 + Example program is called with "2" and "2000" as arguments. + +test_overflow + Example program is called with "0" and "100000" as arguments. The + resulting sum is too large to be stored as an int variable. diff --git a/utils/lcov-1.11/example/example.c b/utils/lcov-1.11/example/example.c new file mode 100755 index 00000000..f9049aa6 --- /dev/null +++ b/utils/lcov-1.11/example/example.c @@ -0,0 +1,60 @@ +/* + * example.c + * + * Calculate the sum of a given range of integer numbers. The range is + * specified by providing two integer numbers as command line argument. + * If no arguments are specified, assume the predefined range [0..9]. + * Abort with an error message if the resulting number is too big to be + * stored as int variable. + * + * This program example is similar to the one found in the GCOV documentation. + * It is used to demonstrate the HTML output generated by LCOV. + * + * The program is split into 3 modules to better demonstrate the 'directory + * overview' function. There are also a lot of bloated comments inserted to + * artificially increase the source code size so that the 'source code + * overview' function makes at least a minimum of sense. + * + */ + +#include +#include +#include "iterate.h" +#include "gauss.h" + +static int start = 0; +static int end = 9; + + +int main (int argc, char* argv[]) +{ + int total1, total2; + + /* Accept a pair of numbers as command line arguments. */ + + if (argc == 3) + { + start = atoi(argv[1]); + end = atoi(argv[2]); + } + + + /* Use both methods to calculate the result. */ + + total1 = iterate_get_sum (start, end); + total2 = gauss_get_sum (start, end); + + + /* Make sure both results are the same. */ + + if (total1 != total2) + { + printf ("Failure (%d != %d)!\n", total1, total2); + } + else + { + printf ("Success, sum[%d..%d] = %d\n", start, end, total1); + } + + return 0; +} diff --git a/utils/lcov-1.11/example/gauss.h b/utils/lcov-1.11/example/gauss.h new file mode 100755 index 00000000..302a4a98 --- /dev/null +++ b/utils/lcov-1.11/example/gauss.h @@ -0,0 +1,6 @@ +#ifndef GAUSS_H +#define GAUSS_H GAUSS_h + +extern int gauss_get_sum (int min, int max); + +#endif /* GAUSS_H */ diff --git a/utils/lcov-1.11/example/iterate.h b/utils/lcov-1.11/example/iterate.h new file mode 100755 index 00000000..47132795 --- /dev/null +++ b/utils/lcov-1.11/example/iterate.h @@ -0,0 +1,6 @@ +#ifndef ITERATE_H +#define ITERATE_H ITERATE_H + +extern int iterate_get_sum (int min, int max); + +#endif /* ITERATE_H */ diff --git a/utils/lcov-1.11/example/methods/gauss.c b/utils/lcov-1.11/example/methods/gauss.c new file mode 100755 index 00000000..9da3ce50 --- /dev/null +++ b/utils/lcov-1.11/example/methods/gauss.c @@ -0,0 +1,48 @@ +/* + * methods/gauss.c + * + * Calculate the sum of a given range of integer numbers. + * + * Somewhat of a more subtle way of calculation - and it even has a story + * behind it: + * + * Supposedly during math classes in elementary school, the teacher of + * young mathematician Gauss gave the class an assignment to calculate the + * sum of all natural numbers between 1 and 100, hoping that this task would + * keep the kids occupied for some time. The story goes that Gauss had the + * result ready after only a few minutes. What he had written on his black + * board was something like this: + * + * 1 + 100 = 101 + * 2 + 99 = 101 + * 3 + 98 = 101 + * . + * . + * 100 + 1 = 101 + * + * s = (1/2) * 100 * 101 = 5050 + * + * A more general form of this formula would be + * + * s = (1/2) * (max + min) * (max - min + 1) + * + * which is used in the piece of code below to implement the requested + * function in constant time, i.e. without dependencies on the size of the + * input parameters. + * + */ + +#include "gauss.h" + + +int gauss_get_sum (int min, int max) +{ + /* This algorithm doesn't work well with invalid range specifications + so we're intercepting them here. */ + if (max < min) + { + return 0; + } + + return (int) ((max + min) * (double) (max - min + 1) / 2); +} diff --git a/utils/lcov-1.11/example/methods/iterate.c b/utils/lcov-1.11/example/methods/iterate.c new file mode 100755 index 00000000..023d1801 --- /dev/null +++ b/utils/lcov-1.11/example/methods/iterate.c @@ -0,0 +1,45 @@ +/* + * methods/iterate.c + * + * Calculate the sum of a given range of integer numbers. + * + * This particular method of implementation works by way of brute force, + * i.e. it iterates over the entire range while adding the numbers to finally + * get the total sum. As a positive side effect, we're able to easily detect + * overflows, i.e. situations in which the sum would exceed the capacity + * of an integer variable. + * + */ + +#include +#include +#include "iterate.h" + + +int iterate_get_sum (int min, int max) +{ + int i, total; + + total = 0; + + /* This is where we loop over each number in the range, including + both the minimum and the maximum number. */ + + for (i = min; i <= max; i++) + { + /* We can detect an overflow by checking whether the new + sum would become negative. */ + + if (total + i < total) + { + printf ("Error: sum too large!\n"); + exit (1); + } + + /* Everything seems to fit into an int, so continue adding. */ + + total += i; + } + + return total; +} diff --git a/utils/lcov-1.11/lcovrc b/utils/lcov-1.11/lcovrc new file mode 100755 index 00000000..5a6d4ebc --- /dev/null +++ b/utils/lcov-1.11/lcovrc @@ -0,0 +1,160 @@ +# +# /etc/lcovrc - system-wide defaults for LCOV +# +# To change settings for a single user, place a customized copy of this file +# at location ~/.lcovrc +# + +# Specify an external style sheet file (same as --css-file option of genhtml) +#genhtml_css_file = gcov.css + +# Specify coverage rate limits (in %) for classifying file entries +# HI: hi_limit <= rate <= 100 graph color: green +# MED: med_limit <= rate < hi_limit graph color: orange +# LO: 0 <= rate < med_limit graph color: red +genhtml_hi_limit = 90 +genhtml_med_limit = 75 + +# Width of line coverage field in source code view +genhtml_line_field_width = 12 + +# Width of branch coverage field in source code view +genhtml_branch_field_width = 16 + +# Width of overview image (used by --frames option of genhtml) +genhtml_overview_width = 80 + +# Resolution of overview navigation: this number specifies the maximum +# difference in lines between the position a user selected from the overview +# and the position the source code window is scrolled to (used by --frames +# option of genhtml) +genhtml_nav_resolution = 4 + +# Clicking a line in the overview image should show the source code view at +# a position a bit further up so that the requested line is not the first +# line in the window. This number specifies that offset in lines (used by +# --frames option of genhtml) +genhtml_nav_offset = 10 + +# Do not remove unused test descriptions if non-zero (same as +# --keep-descriptions option of genhtml) +genhtml_keep_descriptions = 0 + +# Do not remove prefix from directory names if non-zero (same as --no-prefix +# option of genhtml) +genhtml_no_prefix = 0 + +# Do not create source code view if non-zero (same as --no-source option of +# genhtml) +genhtml_no_source = 0 + +# Replace tabs with number of spaces in source view (same as --num-spaces +# option of genhtml) +genhtml_num_spaces = 8 + +# Highlight lines with converted-only data if non-zero (same as --highlight +# option of genhtml) +genhtml_highlight = 0 + +# Include color legend in HTML output if non-zero (same as --legend option of +# genhtml) +genhtml_legend = 0 + +# Use FILE as HTML prolog for generated pages (same as --html-prolog option of +# genhtml) +#genhtml_html_prolog = FILE + +# Use FILE as HTML epilog for generated pages (same as --html-epilog option of +# genhtml) +#genhtml_html_epilog = FILE + +# Use custom filename extension for pages (same as --html-extension option of +# genhtml) +#genhtml_html_extension = html + +# Compress all generated html files with gzip. +#genhtml_html_gzip = 1 + +# Include sorted overview pages (can be disabled by the --no-sort option of +# genhtml) +genhtml_sort = 1 + +# Include function coverage data display (can be disabled by the +# --no-func-coverage option of genhtml) +#genhtml_function_coverage = 1 + +# Include branch coverage data display (can be disabled by the +# --no-branch-coverage option of genhtml) +#genhtml_branch_coverage = 1 + +# Specify the character set of all generated HTML pages +genhtml_charset=UTF-8 + +# Allow HTML markup in test case description text if non-zero +genhtml_desc_html=0 + +# Location of the gcov tool (same as --gcov-info option of geninfo) +#geninfo_gcov_tool = gcov + +# Adjust test names to include operating system information if non-zero +#geninfo_adjust_testname = 0 + +# Calculate checksum for each source code line if non-zero (same as --checksum +# option of geninfo if non-zero, same as --no-checksum if zero) +#geninfo_checksum = 1 + +# Specify whether to capture coverage data for external source files (can +# be overridden by the --external and --no-external options of geninfo/lcov) +#geninfo_external = 1 + +# Enable libtool compatibility mode if non-zero (same as --compat-libtool option +# of geninfo if non-zero, same as --no-compat-libtool if zero) +#geninfo_compat_libtool = 0 + +# Use gcov's --all-blocks option if non-zero +#geninfo_gcov_all_blocks = 1 + +# Specify compatiblity modes (same as --compat option of geninfo). +#geninfo_compat = libtool=on, hammer=auto, split_crc=auto + +# Adjust path to source files by removing or changing path components that +# match the specified pattern (Perl regular expression format) +#geninfo_adjust_src_path = /tmp/build => /usr/src + +# Specify if geninfo should try to automatically determine the base-directory +# when collecting coverage data. +geninfo_auto_base = 1 + +# Directory containing gcov kernel files +# lcov_gcov_dir = /proc/gcov + +# Location of the insmod tool +lcov_insmod_tool = /sbin/insmod + +# Location of the modprobe tool +lcov_modprobe_tool = /sbin/modprobe + +# Location of the rmmod tool +lcov_rmmod_tool = /sbin/rmmod + +# Location for temporary directories +lcov_tmp_dir = /tmp + +# Show full paths during list operation if non-zero (same as --list-full-path +# option of lcov) +lcov_list_full_path = 0 + +# Specify the maximum width for list output. This value is ignored when +# lcov_list_full_path is non-zero. +lcov_list_width = 80 + +# Specify the maximum percentage of file names which may be truncated when +# choosing a directory prefix in list output. This value is ignored when +# lcov_list_full_path is non-zero. +lcov_list_truncate_max = 20 + +# Specify if function coverage data should be collected and processed. +lcov_function_coverage = 1 + +# Specify if branch coverage data should be collected and processed. +lcov_branch_coverage = 0 diff --git a/utils/lcov-1.11/man/gendesc.1 b/utils/lcov-1.11/man/gendesc.1 new file mode 100755 index 00000000..9be5132c --- /dev/null +++ b/utils/lcov-1.11/man/gendesc.1 @@ -0,0 +1,78 @@ +.TH gendesc 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" +.SH NAME +gendesc \- Generate a test case description file +.SH SYNOPSIS +.B gendesc +.RB [ \-h | \-\-help ] +.RB [ \-v | \-\-version ] +.RS 8 +.br +.RB [ \-o | \-\-output\-filename +.IR filename ] +.br +.I inputfile +.SH DESCRIPTION +Convert plain text test case descriptions into a format as understood by +.BR genhtml . +.I inputfile +needs to observe the following format: + +For each test case: +.IP " \-" +one line containing the test case name beginning at the start of the line +.RE +.IP " \-" +one or more lines containing the test case description indented with at +least one whitespace character (tab or space) +.RE + +.B Example input file: + +test01 +.RS +An example test case description. +.br +Description continued +.RE + +test42 +.RS +Supposedly the answer to most of your questions +.RE + +Note: valid test names can consist of letters, decimal digits and the +underscore character ('_'). +.SH OPTIONS +.B \-h +.br +.B \-\-help +.RS +Print a short help text, then exit. +.RE + +.B \-v +.br +.B \-\-version +.RS +Print version number, then exit. +.RE + + +.BI "\-o " filename +.br +.BI "\-\-output\-filename " filename +.RS +Write description data to +.IR filename . + +By default, output is written to STDOUT. +.RE +.SH AUTHOR +Peter Oberparleiter + +.SH SEE ALSO +.BR lcov (1), +.BR genhtml (1), +.BR geninfo (1), +.BR genpng (1), +.BR gcov (1) diff --git a/utils/lcov-1.11/man/genhtml.1 b/utils/lcov-1.11/man/genhtml.1 new file mode 100755 index 00000000..297d80ae --- /dev/null +++ b/utils/lcov-1.11/man/genhtml.1 @@ -0,0 +1,569 @@ +.TH genhtml 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" +.SH NAME +genhtml \- Generate HTML view from LCOV coverage data files +.SH SYNOPSIS +.B genhtml +.RB [ \-h | \-\-help ] +.RB [ \-v | \-\-version ] +.RS 8 +.br +.RB [ \-q | \-\-quiet ] +.RB [ \-s | \-\-show\-details ] +.RB [ \-f | \-\-frames ] +.br +.RB [ \-b | \-\-baseline\-file ] +.IR baseline\-file +.br +.RB [ \-o | \-\-output\-directory +.IR output\-directory ] +.br +.RB [ \-t | \-\-title +.IR title ] +.br +.RB [ \-d | \-\-description\-file +.IR description\-file ] +.br +.RB [ \-k | \-\-keep\-descriptions ] +.RB [ \-c | \-\-css\-file +.IR css\-file ] +.br +.RB [ \-p | \-\-prefix +.IR prefix ] +.RB [ \-\-no\-prefix ] +.br +.RB [ \-\-no\-source ] +.RB [ \-\-num\-spaces +.IR num ] +.RB [ \-\-highlight ] +.br +.RB [ \-\-legend ] +.RB [ \-\-html\-prolog +.IR prolog\-file ] +.br +.RB [ \-\-html\-epilog +.IR epilog\-file ] +.RB [ \-\-html\-extension +.IR extension ] +.br +.RB [ \-\-html\-gzip ] +.RB [ \-\-sort ] +.RB [ \-\-no\-sort ] +.br +.RB [ \-\-function\-coverage ] +.RB [ \-\-no\-function\-coverage ] +.br +.RB [ \-\-branch\-coverage ] +.RB [ \-\-no\-branch\-coverage ] +.br +.RB [ \-\-demangle\-cpp ] +.RB [ \-\-ignore\-errors +.IR errors ] +.br +.RB [ \-\-config\-file +.IR config\-file ] +.RB [ \-\-rc +.IR keyword = value ] +.br +.IR tracefile(s) +.RE +.SH DESCRIPTION +Create an HTML view of coverage data found in +.IR tracefile . +Note that +.I tracefile +may also be a list of filenames. + +HTML output files are created in the current working directory unless the +\-\-output\-directory option is used. If +.I tracefile +ends with ".gz", it is assumed to be GZIP\-compressed and the gunzip tool +will be used to decompress it transparently. + +Note that all source code files have to be present and readable at the +exact file system location they were compiled. + +Use option +.I \--css\-file +to modify layout and colors of the generated HTML output. Files are +marked in different colors depending on the associated coverage rate. By +default, the coverage limits for low, medium and high coverage are set to +0\-75%, 75\-90% and 90\-100% percent respectively. To change these +values, use configuration file options +.IR genhtml_hi_limit " and " genhtml_med_limit . + +Also note that when displaying percentages, 0% and 100% are only printed when +the values are exactly 0% and 100% respectively. Other values which would +conventionally be rounded to 0% or 100% are instead printed as nearest +non-boundary value. This behavior is in accordance with that of the +.BR gcov (1) +tool. + +.SH OPTIONS +.B \-h +.br +.B \-\-help +.RS +Print a short help text, then exit. + +.RE +.B \-v +.br +.B \-\-version +.RS +Print version number, then exit. + +.RE +.B \-q +.br +.B \-\-quiet +.RS +Do not print progress messages. + +Suppresses all informational progress output. When this switch is enabled, +only error or warning messages are printed. + +.RE +.B \-f +.br +.B \-\-frames +.RS +Use HTML frames for source code view. + +If enabled, a frameset is created for each source code file, providing +an overview of the source code as a "clickable" image. Note that this +option will slow down output creation noticeably because each source +code character has to be inspected once. Note also that the GD.pm Perl +module has to be installed for this option to work (it may be obtained +from http://www.cpan.org). + +.RE +.B \-s +.br +.B \-\-show\-details +.RS +Generate detailed directory view. + +When this option is enabled, +.B genhtml +generates two versions of each +file view. One containing the standard information plus a link to a +"detailed" version. The latter additionally contains information about +which test case covered how many lines of each source file. + +.RE +.BI "\-b " baseline\-file +.br +.BI "\-\-baseline\-file " baseline\-file +.RS +Use data in +.I baseline\-file +as coverage baseline. + +The tracefile specified by +.I baseline\-file +is read and all counts found in the original +.I tracefile +are decremented by the corresponding counts in +.I baseline\-file +before creating any output. + +Note that when a count for a particular line in +.I baseline\-file +is greater than the count in the +.IR tracefile , +the result is zero. + +.RE +.BI "\-o " output\-directory +.br +.BI "\-\-output\-directory " output\-directory +.RS +Create files in +.I output\-directory. + +Use this option to tell +.B genhtml +to write the resulting files to a directory other than +the current one. If +.I output\-directory +does not exist, it will be created. + +It is advisable to use this option since depending on the +project size, a lot of files and subdirectories may be created. + +.RE +.BI "\-t " title +.br +.BI "\-\-title " title +.RS +Display +.I title +in header of all pages. + +.I title +is written to the header portion of each generated HTML page to +identify the context in which a particular output +was created. By default this is the name of the tracefile. + +.RE +.BI "\-d " description\-file +.br +.BI "\-\-description\-file " description\-file +.RS +Read test case descriptions from +.IR description\-file . + +All test case descriptions found in +.I description\-file +and referenced in the input data file are read and written to an extra page +which is then incorporated into the HTML output. + +The file format of +.IR "description\-file " is: + +for each test case: +.RS +TN: +.br +TD: + +.RE + +Valid test case names can consist of letters, numbers and the underscore +character ('_'). +.RE +.B \-k +.br +.B \-\-keep\-descriptions +.RS +Do not remove unused test descriptions. + +Keep descriptions found in the description file even if the coverage data +indicates that the associated test case did not cover any lines of code. + +This option can also be configured permanently using the configuration file +option +.IR genhtml_keep_descriptions . + +.RE +.BI "\-c " css\-file +.br +.BI "\-\-css\-file " css\-file +.RS +Use external style sheet file +.IR css\-file . + +Using this option, an extra .css file may be specified which will replace +the default one. This may be helpful if the default colors make your eyes want +to jump out of their sockets :) + +This option can also be configured permanently using the configuration file +option +.IR genhtml_css_file . + +.RE +.BI "\-p " prefix +.br +.BI "\-\-prefix " prefix +.RS +Remove +.I prefix +from all directory names. + +Because lists containing long filenames are difficult to read, there is a +mechanism implemented that will automatically try to shorten all directory +names on the overview page beginning with a common prefix. By default, +this is done using an algorithm that tries to find the prefix which, when +applied, will minimize the resulting sum of characters of all directory +names. + +Use this option to specify the prefix to be removed by yourself. + +.RE +.B \-\-no\-prefix +.RS +Do not remove prefix from directory names. + +This switch will completely disable the prefix mechanism described in the +previous section. + +This option can also be configured permanently using the configuration file +option +.IR genhtml_no_prefix . + +.RE +.B \-\-no\-source +.RS +Do not create source code view. + +Use this switch if you don't want to get a source code view for each file. + +This option can also be configured permanently using the configuration file +option +.IR genhtml_no_source . + +.RE +.BI "\-\-num\-spaces " spaces +.RS +Replace tabs in source view with +.I num +spaces. + +Default value is 8. + +This option can also be configured permanently using the configuration file +option +.IR genhtml_num_spaces . + +.RE +.B \-\-highlight +.RS +Highlight lines with converted\-only coverage data. + +Use this option in conjunction with the \-\-diff option of +.B lcov +to highlight those lines which were only covered in data sets which were +converted from previous source code versions. + +This option can also be configured permanently using the configuration file +option +.IR genhtml_highlight . + +.RE +.B \-\-legend +.RS +Include color legend in HTML output. + +Use this option to include a legend explaining the meaning of color coding +in the resulting HTML output. + +This option can also be configured permanently using the configuration file +option +.IR genhtml_legend . + +.RE +.BI "\-\-html\-prolog " prolog\-file +.RS +Read customized HTML prolog from +.IR prolog\-file . + +Use this option to replace the default HTML prolog (the initial part of the +HTML source code leading up to and including the tag) with the contents +of +.IR prolog\-file . +Within the prolog text, the following words will be replaced when a page is generated: + +.B "@pagetitle@" +.br +The title of the page. + +.B "@basedir@" +.br +A relative path leading to the base directory (e.g. for locating css\-files). + +This option can also be configured permanently using the configuration file +option +.IR genhtml_html_prolog . + +.RE +.BI "\-\-html\-epilog " epilog\-file +.RS +Read customized HTML epilog from +.IR epilog\-file . + +Use this option to replace the default HTML epilog (the final part of the HTML +source including ) with the contents of +.IR epilog\-file . + +Within the epilog text, the following words will be replaced when a page is generated: + +.B "@basedir@" +.br +A relative path leading to the base directory (e.g. for locating css\-files). + +This option can also be configured permanently using the configuration file +option +.IR genhtml_html_epilog . + +.RE +.BI "\-\-html\-extension " extension +.RS +Use customized filename extension for generated HTML pages. + +This option is useful in situations where different filename extensions +are required to render the resulting pages correctly (e.g. php). Note that +a '.' will be inserted between the filename and the extension specified by +this option. + +This option can also be configured permanently using the configuration file +option +.IR genhtml_html_extension . +.RE + +.B \-\-html\-gzip +.RS +Compress all generated html files with gzip and add a .htaccess file specifying +gzip\-encoding in the root output directory. + +Use this option if you want to save space on your webserver. Requires a +webserver with .htaccess support and a browser with support for gzip +compressed html. + +This option can also be configured permanently using the configuration file +option +.IR genhtml_html_gzip . + +.RE +.B \-\-sort +.br +.B \-\-no\-sort +.RS +Specify whether to include sorted views of file and directory overviews. + +Use \-\-sort to include sorted views or \-\-no\-sort to not include them. +Sorted views are +.B enabled +by default. + +When sorted views are enabled, each overview page will contain links to +views of that page sorted by coverage rate. + +This option can also be configured permanently using the configuration file +option +.IR genhtml_sort . + +.RE +.B \-\-function\-coverage +.br +.B \-\-no\-function\-coverage +.RS +Specify whether to display function coverage summaries in HTML output. + +Use \-\-function\-coverage to enable function coverage summaries or +\-\-no\-function\-coverage to disable it. Function coverage summaries are +.B enabled +by default + +When function coverage summaries are enabled, each overview page will contain +the number of functions found and hit per file or directory, together with +the resulting coverage rate. In addition, each source code view will contain +a link to a page which lists all functions found in that file plus the +respective call count for those functions. + +This option can also be configured permanently using the configuration file +option +.IR genhtml_function_coverage . + +.RE +.B \-\-branch\-coverage +.br +.B \-\-no\-branch\-coverage +.RS +Specify whether to display branch coverage data in HTML output. + +Use \-\-branch\-coverage to enable branch coverage display or +\-\-no\-branch\-coverage to disable it. Branch coverage data display is +.B enabled +by default + +When branch coverage display is enabled, each overview page will contain +the number of branches found and hit per file or directory, together with +the resulting coverage rate. In addition, each source code view will contain +an extra column which lists all branches of a line with indications of +whether the branch was taken or not. Branches are shown in the following format: + + ' + ': Branch was taken at least once +.br + ' - ': Branch was not taken +.br + ' # ': The basic block containing the branch was never executed +.br + +Note that it might not always be possible to relate branches to the +corresponding source code statements: during compilation, GCC might shuffle +branches around or eliminate some of them to generate better code. + +This option can also be configured permanently using the configuration file +option +.IR genhtml_branch_coverage . + +.RE +.B \-\-demangle\-cpp +.RS +Specify whether to demangle C++ function names. + +Use this option if you want to convert C++ internal function names to +human readable format for display on the HTML function overview page. +This option requires that the c++filt tool is installed (see +.BR c++filt (1)). + +.RE +.B \-\-ignore\-errors +.I errors +.br +.RS +Specify a list of errors after which to continue processing. + +Use this option to specify a list of one or more classes of errors after which +geninfo should continue processing instead of aborting. + +.I errors +can be a comma\-separated list of the following keywords: + +.B source: +the source code file for a data set could not be found. +.RE + +.B \-\-config\-file +.I config\-file +.br +.RS +Specify a configuration file to use. + +When this option is specified, neither the system\-wide configuration file +/etc/lcovrc, nor the per\-user configuration file ~/.lcovrc is read. + +This option may be useful when there is a need to run several +instances of +.B genhtml +with different configuration file options in parallel. +.RE + +.B \-\-rc +.IR keyword = value +.br +.RS +Override a configuration directive. + +Use this option to specify a +.IR keyword = value +statement which overrides the corresponding configuration statement in +the lcovrc configuration file. You can specify this option more than once +to override multiple configuration statements. +See +.BR lcovrc (5) +for a list of available keywords and their meaning. +.RE + +.SH FILES + +.I /etc/lcovrc +.RS +The system\-wide configuration file. +.RE + +.I ~/.lcovrc +.RS +The per\-user configuration file. +.RE + +.SH AUTHOR +Peter Oberparleiter + +.SH SEE ALSO +.BR lcov (1), +.BR lcovrc (5), +.BR geninfo (1), +.BR genpng (1), +.BR gendesc (1), +.BR gcov (1) diff --git a/utils/lcov-1.11/man/geninfo.1 b/utils/lcov-1.11/man/geninfo.1 new file mode 100755 index 00000000..4229b466 --- /dev/null +++ b/utils/lcov-1.11/man/geninfo.1 @@ -0,0 +1,531 @@ +.TH geninfo 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" +.SH NAME +geninfo \- Generate tracefiles from .da files +.SH SYNOPSIS +.B geninfo +.RB [ \-h | \-\-help ] +.RB [ \-v | \-\-version ] +.RB [ \-q | \-\-quiet ] +.br +.RS 8 +.RB [ \-i | \-\-initial ] +.RB [ \-t | \-\-test\-name +.IR test\-name ] +.br +.RB [ \-o | \-\-output\-filename +.IR filename ] +.RB [ \-f | \-\-follow ] +.br +.RB [ \-b | \-\-base\-directory +.IR directory ] +.br +.RB [ \-\-checksum ] +.RB [ \-\-no\-checksum ] +.br +.RB [ \-\-compat\-libtool ] +.RB [ \-\-no\-compat\-libtool ] +.br +.RB [ \-\-gcov\-tool +.IR tool ] +.RB [ \-\-ignore\-errors +.IR errors ] +.br +.RB [ \-\-no\-recursion ] +.I directory +.RB [ \-\-external ] +.RB [ \-\-no\-external ] +.br +.RB [ \-\-config\-file +.IR config\-file ] +.RB [ \-\-no\-markers ] +.br +.RB [ \-\-derive\-func\-data ] +.RB [ \-\-compat +.IR mode =on|off|auto] +.br +.RB [ \-\-rc +.IR keyword = value ] +.RE +.SH DESCRIPTION +.B geninfo +converts all GCOV coverage data files found in +.I directory +into tracefiles, which the +.B genhtml +tool can convert to HTML output. + +Unless the \-\-output\-filename option is specified, +.B geninfo +writes its +output to one file per .da file, the name of which is generated by simply +appending ".info" to the respective .da file name. + +Note that the current user needs write access to both +.I directory +as well as to the original source code location. This is necessary because +some temporary files have to be created there during the conversion process. + +Note also that +.B geninfo +is called from within +.BR lcov , +so that there is usually no need to call it directly. + +.B Exclusion markers + +To exclude specific lines of code from a tracefile, you can add exclusion +markers to the source code. Additionally you can exclude specific branches from +branch coverage without excluding the involved lines from line and function +coverage. Exclusion markers are keywords which can for example be added in the +form of a comment. + +The following markers are recognized by geninfo: + +LCOV_EXCL_LINE +.RS +Lines containing this marker will be excluded. +.br +.RE +LCOV_EXCL_START +.RS +Marks the beginning of an excluded section. The current line is part of this +section. +.br +.RE +LCOV_EXCL_STOP +.RS +Marks the end of an excluded section. The current line not part of this +section. +.RE +.br +LCOV_EXCL_BR_LINE +.RS +Lines containing this marker will be excluded from branch coverage. +.br +.RE +LCOV_EXCL_BR_START +.RS +Marks the beginning of a section which is excluded from branch coverage. The +current line is part of this section. +.br +.RE +LCOV_EXCL_BR_STOP +.RS +Marks the end of a section which is excluded from branch coverage. The current +line not part of this section. +.RE +.br + +.SH OPTIONS + +.B \-b +.I directory +.br +.B \-\-base\-directory +.I directory +.br +.RS +.RI "Use " directory +as base directory for relative paths. + +Use this option to specify the base directory of a build\-environment +when geninfo produces error messages like: + +.RS +ERROR: could not read source file /home/user/project/subdir1/subdir2/subdir1/subdir2/file.c +.RE + +In this example, use /home/user/project as base directory. + +This option is required when using geninfo on projects built with libtool or +similar build environments that work with a base directory, i.e. environments, +where the current working directory when invoking the compiler is not the same +directory in which the source code file is located. + +Note that this option will not work in environments where multiple base +directories are used. In that case use configuration file setting +.B geninfo_auto_base=1 +(see +.BR lcovrc (5)). +.RE + +.B \-\-checksum +.br +.B \-\-no\-checksum +.br +.RS +Specify whether to generate checksum data when writing tracefiles. + +Use \-\-checksum to enable checksum generation or \-\-no\-checksum to +disable it. Checksum generation is +.B disabled +by default. + +When checksum generation is enabled, a checksum will be generated for each +source code line and stored along with the coverage data. This checksum will +be used to prevent attempts to combine coverage data from different source +code versions. + +If you don't work with different source code versions, disable this option +to speed up coverage data processing and to reduce the size of tracefiles. +.RE + +.B \-\-compat +.IR mode = value [, mode = value ,...] +.br +.RS +Set compatibility mode. + +Use \-\-compat to specify that geninfo should enable one or more compatibility +modes when capturing coverage data. You can provide a comma-separated list +of mode=value pairs to specify the values for multiple modes. + +Valid +.I values +are: + +.B on +.RS +Enable compatibility mode. +.RE +.B off +.RS +Disable compatibility mode. +.RE +.B auto +.RS +Apply auto-detection to determine if compatibility mode is required. Note that +auto-detection is not available for all compatibility modes. +.RE + +If no value is specified, 'on' is assumed as default value. + +Valid +.I modes +are: + +.B libtool +.RS +Enable this mode if you are capturing coverage data for a project that +was built using the libtool mechanism. See also +\-\-compat\-libtool. + +The default value for this setting is 'on'. + +.RE +.B hammer +.RS +Enable this mode if you are capturing coverage data for a project that +was built using a version of GCC 3.3 that contains a modification +(hammer patch) of later GCC versions. You can identify a modified GCC 3.3 +by checking the build directory of your project for files ending in the +extension '.bbg'. Unmodified versions of GCC 3.3 name these files '.bb'. + +The default value for this setting is 'auto'. + +.RE +.B split_crc +.RS +Enable this mode if you are capturing coverage data for a project that +was built using a version of GCC 4.6 that contains a modification +(split function checksums) of later GCC versions. Typical error messages +when running geninfo on coverage data produced by such GCC versions are +\'out of memory' and 'reached unexpected end of file'. + +The default value for this setting is 'auto' +.RE + +.RE + +.B \-\-compat\-libtool +.br +.B \-\-no\-compat\-libtool +.br +.RS +Specify whether to enable libtool compatibility mode. + +Use \-\-compat\-libtool to enable libtool compatibility mode or \-\-no\-compat\-libtool +to disable it. The libtool compatibility mode is +.B enabled +by default. + +When libtool compatibility mode is enabled, geninfo will assume that the source +code relating to a .da file located in a directory named ".libs" can be +found in its parent directory. + +If you have directories named ".libs" in your build environment but don't use +libtool, disable this option to prevent problems when capturing coverage data. +.RE + +.B \-\-config\-file +.I config\-file +.br +.RS +Specify a configuration file to use. + +When this option is specified, neither the system\-wide configuration file +/etc/lcovrc, nor the per\-user configuration file ~/.lcovrc is read. + +This option may be useful when there is a need to run several +instances of +.B geninfo +with different configuration file options in parallel. +.RE + +.B \-\-derive\-func\-data +.br +.RS +Calculate function coverage data from line coverage data. + +Use this option to collect function coverage data, even if the version of the +gcov tool installed on the test system does not provide this data. lcov will +instead derive function coverage data from line coverage data and +information about which lines belong to a function. +.RE + +.B \-\-external +.br +.B \-\-no\-external +.br +.RS +Specify whether to capture coverage data for external source files. + +External source files are files which are not located in one of the directories +specified by \-\-directory or \-\-base\-directory. Use \-\-external to include +external source files while capturing coverage data or \-\-no\-external to +ignore this data. + +Data for external source files is +.B included +by default. +.RE + +.B \-f +.br +.B \-\-follow +.RS +Follow links when searching .da files. +.RE + +.B \-\-gcov\-tool +.I tool +.br +.RS +Specify the location of the gcov tool. +.RE + +.B \-h +.br +.B \-\-help +.RS +Print a short help text, then exit. +.RE + +.B \-\-ignore\-errors +.I errors +.br +.RS +Specify a list of errors after which to continue processing. + +Use this option to specify a list of one or more classes of errors after which +geninfo should continue processing instead of aborting. + +.I errors +can be a comma\-separated list of the following keywords: + +.B gcov: +the gcov tool returned with a non\-zero return code. + +.B source: +the source code file for a data set could not be found. +.RE + +.B \-i +.br +.B \-\-initial +.RS +Capture initial zero coverage data. + +Run geninfo with this option on the directories containing .bb, .bbg or .gcno +files before running any test case. The result is a "baseline" coverage data +file that contains zero coverage for every instrumented line and function. +Combine this data file (using lcov \-a) with coverage data files captured +after a test run to ensure that the percentage of total lines covered is +correct even when not all object code files were loaded during the test. + +Note: currently, the \-\-initial option does not generate branch coverage +information. +.RE + +.B \-\-no\-markers +.br +.RS +Use this option if you want to get coverage data without regard to exclusion +markers in the source code file. +.RE + +.B \-\-no\-recursion +.br +.RS +Use this option if you want to get coverage data for the specified directory +only without processing subdirectories. +.RE + +.BI "\-o " output\-filename +.br +.BI "\-\-output\-filename " output\-filename +.RS +Write all data to +.IR output\-filename . + +If you want to have all data written to a single file (for easier +handling), use this option to specify the respective filename. By default, +one tracefile will be created for each processed .da file. +.RE + +.B \-q +.br +.B \-\-quiet +.RS +Do not print progress messages. + +Suppresses all informational progress output. When this switch is enabled, +only error or warning messages are printed. +.RE + +.B \-\-rc +.IR keyword = value +.br +.RS +Override a configuration directive. + +Use this option to specify a +.IR keyword = value +statement which overrides the corresponding configuration statement in +the lcovrc configuration file. You can specify this option more than once +to override multiple configuration statements. +See +.BR lcovrc (5) +for a list of available keywords and their meaning. +.RE + +.BI "\-t " testname +.br +.BI "\-\-test\-name " testname +.RS +Use test case name +.I testname +for resulting data. Valid test case names can consist of letters, decimal +digits and the underscore character ('_'). + +This proves useful when data from several test cases is merged (i.e. by +simply concatenating the respective tracefiles) in which case a test +name can be used to differentiate between data from each test case. +.RE + +.B \-v +.br +.B \-\-version +.RS +Print version number, then exit. +.RE + + +.SH FILES + +.I /etc/lcovrc +.RS +The system\-wide configuration file. +.RE + +.I ~/.lcovrc +.RS +The per\-user configuration file. +.RE + +Following is a quick description of the tracefile format as used by +.BR genhtml ", " geninfo " and " lcov . + +A tracefile is made up of several human\-readable lines of text, +divided into sections. If available, a tracefile begins with the +.I testname +which is stored in the following format: + + TN: + +For each source file referenced in the .da file, there is a section containing +filename and coverage data: + + SF: + +Following is a list of line numbers for each function name found in the +source file: + + FN:, + +Next, there is a list of execution counts for each instrumented function: + + FNDA:, + +This list is followed by two lines containing the number of functions found +and hit: + + FNF: + FNH: + +Branch coverage information is stored which one line per branch: + + BRDA:,,, + +Block number and branch number are gcc internal IDs for the branch. Taken is +either '-' if the basic block containing the branch was never executed or +a number indicating how often that branch was taken. + +Branch coverage summaries are stored in two lines: + + BRF: + BRH: + +Then there is a list of execution counts for each instrumented line +(i.e. a line which resulted in executable code): + + DA:,[,] + +Note that there may be an optional checksum present for each instrumented +line. The current +.B geninfo +implementation uses an MD5 hash as checksumming algorithm. + +At the end of a section, there is a summary about how many lines +were found and how many were actually instrumented: + + LH: + LF: + +Each sections ends with: + + end_of_record + +In addition to the main source code file there are sections for all +#included files which also contain executable code. + +Note that the absolute path of a source file is generated by interpreting +the contents of the respective .bb file (see +.BR "gcov " (1) +for more information on this file type). Relative filenames are prefixed +with the directory in which the .bb file is found. + +Note also that symbolic links to the .bb file will be resolved so that the +actual file path is used instead of the path to a link. This approach is +necessary for the mechanism to work with the /proc/gcov files. + +.SH AUTHOR +Peter Oberparleiter + +.SH SEE ALSO +.BR lcov (1), +.BR lcovrc (5), +.BR genhtml (1), +.BR genpng (1), +.BR gendesc (1), +.BR gcov (1) diff --git a/utils/lcov-1.11/man/genpng.1 b/utils/lcov-1.11/man/genpng.1 new file mode 100755 index 00000000..e5c412af --- /dev/null +++ b/utils/lcov-1.11/man/genpng.1 @@ -0,0 +1,101 @@ +.TH genpng 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" +.SH NAME +genpng \- Generate an overview image from a source file +.SH SYNOPSIS +.B genpng +.RB [ \-h | \-\-help ] +.RB [ \-v | \-\-version ] +.RS 7 +.br +.RB [ \-t | \-\-tab\-size +.IR tabsize ] +.RB [ \-w | \-\-width +.IR width ] +.br +.RB [ \-o | \-\-output\-filename +.IR output\-filename ] +.br +.IR source\-file +.SH DESCRIPTION +.B genpng +creates an overview image for a given source code file of either +plain text or .gcov file format. + +Note that the +.I GD.pm +Perl module has to be installed for this script to work +(it may be obtained from +.IR http://www.cpan.org ). + +Note also that +.B genpng +is called from within +.B genhtml +so that there is usually no need to call it directly. + +.SH OPTIONS +.B \-h +.br +.B \-\-help +.RS +Print a short help text, then exit. +.RE + +.B \-v +.br +.B \-\-version +.RS +Print version number, then exit. +.RE + +.BI "\-t " tab\-size +.br +.BI "\-\-tab\-size " tab\-size +.RS +Use +.I tab\-size +spaces in place of tab. + +All occurrences of tabulator signs in the source code file will be replaced +by the number of spaces defined by +.I tab\-size +(default is 4). +.RE + +.BI "\-w " width +.br +.BI "\-\-width " width +.RS +Set width of output image to +.I width +pixel. + +The resulting image will be exactly +.I width +pixel wide (default is 80). + +Note that source code lines which are longer than +.I width +will be truncated. +.RE + + +.BI "\-o " filename +.br +.BI "\-\-output\-filename " filename +.RS +Write image to +.IR filename . + +Specify a name for the resulting image file (default is +.IR source\-file .png). +.RE +.SH AUTHOR +Peter Oberparleiter + +.SH SEE ALSO +.BR lcov (1), +.BR genhtml (1), +.BR geninfo (1), +.BR gendesc (1), +.BR gcov (1) diff --git a/utils/lcov-1.11/man/lcov.1 b/utils/lcov-1.11/man/lcov.1 new file mode 100755 index 00000000..16d01de5 --- /dev/null +++ b/utils/lcov-1.11/man/lcov.1 @@ -0,0 +1,886 @@ +.TH lcov 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" +.SH NAME +lcov \- a graphical GCOV front\-end +.SH SYNOPSIS +.B lcov +.BR \-c | \-\-capture +.RS 5 +.br +.RB [ \-d | \-\-directory +.IR directory ] +.RB [ \-k | \-\-kernel\-directory +.IR directory ] +.br +.RB [ \-o | \-\-output\-file +.IR tracefile ] +.RB [ \-t | \-\-test\-name +.IR testname ] +.br +.RB [ \-b | \-\-base\-directory +.IR directory ] +.RB [ \-i | \-\-initial ] +.RB [ \-\-gcov\-tool +.IR tool ] +.br +.RB [ \-\-checksum ] +.RB [ \-\-no\-checksum ] +.RB [ \-\-no\-recursion ] +.RB [ \-f | \-\-follow ] +.br +.RB [ \-\-compat\-libtool ] +.RB [ \-\-no\-compat\-libtool ] +.RB [ \-\-ignore\-errors +.IR errors ] +.br +.RB [ \-\-to\-package +.IR package ] +.RB [ \-\-from\-package +.IR package ] +.RB [ \-q | \-\-quiet ] +.br +.RB [ \-\-no\-markers ] +.RB [ \-\-external ] +.RB [ \-\-no\-external ] +.br +.RB [ \-\-config\-file +.IR config\-file ] +.RB [ \-\-rc +.IR keyword = value ] +.br +.RB [ \-\-compat +.IR mode =on|off|auto] +.br +.RE + +.B lcov +.BR \-z | \-\-zerocounters +.RS 5 +.br +.RB [ \-d | \-\-directory +.IR directory ] +.RB [ \-\-no\-recursion ] +.RB [ \-f | \-\-follow ] +.br +.RB [ \-q | \-\-quiet ] +.br +.RE + +.B lcov +.BR \-l | \-\-list +.I tracefile +.RS 5 +.br +.RB [ \-q | \-\-quiet ] +.RB [ \-\-list\-full\-path ] +.RB [ \-\-no\-list\-full\-path ] +.br +.RB [ \-\-config\-file +.IR config\-file ] +.RB [ \-\-rc +.IR keyword = value ] +.br +.RE + +.B lcov +.BR \-a | \-\-add\-tracefile +.I tracefile +.RS 5 +.br +.RB [ \-o | \-\-output\-file +.IR tracefile ] +.RB [ \-\-checksum ] +.RB [ \-\-no\-checksum ] +.br +.RB [ \-q | \-\-quiet ] +.RB [ \-\-config\-file +.IR config\-file ] +.RB [ \-\-rc +.IR keyword = value ] +.br +.RE + +.B lcov +.BR \-e | \-\-extract +.I tracefile pattern +.RS 5 +.br +.RB [ \-o | \-\-output\-file +.IR tracefile ] +.RB [ \-\-checksum ] +.RB [ \-\-no\-checksum ] +.br +.RB [ \-q | \-\-quiet ] +.RB [ \-\-config\-file +.IR config\-file ] +.RB [ \-\-rc +.IR keyword = value ] +.br +.RE + +.B lcov +.BR \-r | \-\-remove +.I tracefile pattern +.RS 5 +.br +.RB [ \-o | \-\-output\-file +.IR tracefile ] +.RB [ \-\-checksum ] +.RB [ \-\-no\-checksum ] +.br +.RB [ \-q | \-\-quiet ] +.RB [ \-\-config\-file +.IR config\-file ] +.RB [ \-\-rc +.IR keyword = value ] +.br +.RE + +.B lcov +.BR \-\-diff +.IR "tracefile diff" +.RS 5 +.br +.RB [ \-o | \-\-output\-file +.IR tracefile ] +.RB [ \-\-checksum ] +.RB [ \-\-no\-checksum ] +.br +.RB [ \-\-convert\-filenames ] +.RB [ \-\-strip +.IR depth ] +.RB [ \-\-path +.IR path ] +.RB [ \-q | \-\-quiet ] +.br +.RB [ \-\-config\-file +.IR config\-file ] +.RB [ \-\-rc +.IR keyword = value ] +.br +.RE + +.B lcov +.BR \-\-summary +.I tracefile +.RS 5 +.br +.RB [ \-q | \-\-quiet ] +.br +.RE + +.B lcov +.RB [ \-h | \-\-help ] +.RB [ \-v | \-\-version ] +.RS 5 +.br +.RE + +.SH DESCRIPTION +.B lcov +is a graphical front\-end for GCC's coverage testing tool gcov. It collects +line, function and branch coverage data for multiple source files and creates +HTML pages containing the source code annotated with coverage information. +It also adds overview pages for easy navigation within the file structure. + +Use +.B lcov +to collect coverage data and +.B genhtml +to create HTML pages. Coverage data can either be collected from the +currently running Linux kernel or from a user space application. To do this, +you have to complete the following preparation steps: + +For Linux kernel coverage: +.RS +Follow the setup instructions for the gcov\-kernel infrastructure: +.I http://ltp.sourceforge.net/coverage/gcov.php +.br + + +.RE +For user space application coverage: +.RS +Compile the application with GCC using the options +"\-fprofile\-arcs" and "\-ftest\-coverage". +.RE + +Please note that this man page refers to the output format of +.B lcov +as ".info file" or "tracefile" and that the output of GCOV +is called ".da file". + +Also note that when printing percentages, 0% and 100% are only printed when +the values are exactly 0% and 100% respectively. Other values which would +conventionally be rounded to 0% or 100% are instead printed as nearest +non-boundary value. This behavior is in accordance with that of the +.BR gcov (1) +tool. + +.SH OPTIONS + + +.B \-a +.I tracefile +.br +.B \-\-add\-tracefile +.I tracefile +.br +.RS +Add contents of +.IR tracefile . + +Specify several tracefiles using the \-a switch to combine the coverage data +contained in these files by adding up execution counts for matching test and +filename combinations. + +The result of the add operation will be written to stdout or the tracefile +specified with \-o. + +Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be +specified at a time. + +.RE + +.B \-b +.I directory +.br +.B \-\-base\-directory +.I directory +.br +.RS +.RI "Use " directory +as base directory for relative paths. + +Use this option to specify the base directory of a build\-environment +when lcov produces error messages like: + +.RS +ERROR: could not read source file /home/user/project/subdir1/subdir2/subdir1/subdir2/file.c +.RE + +In this example, use /home/user/project as base directory. + +This option is required when using lcov on projects built with libtool or +similar build environments that work with a base directory, i.e. environments, +where the current working directory when invoking the compiler is not the same +directory in which the source code file is located. + +Note that this option will not work in environments where multiple base +directories are used. In that case use configuration file setting +.B geninfo_auto_base=1 +(see +.BR lcovrc (5)). +.RE + +.B \-c +.br +.B \-\-capture +.br +.RS +Capture coverage data. + +By default captures the current kernel execution counts and writes the +resulting coverage data to the standard output. Use the \-\-directory +option to capture counts for a user space program. + +The result of the capture operation will be written to stdout or the tracefile +specified with \-o. + +Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be +specified at a time. +.RE + +.B \-\-checksum +.br +.B \-\-no\-checksum +.br +.RS +Specify whether to generate checksum data when writing tracefiles. + +Use \-\-checksum to enable checksum generation or \-\-no\-checksum to +disable it. Checksum generation is +.B disabled +by default. + +When checksum generation is enabled, a checksum will be generated for each +source code line and stored along with the coverage data. This checksum will +be used to prevent attempts to combine coverage data from different source +code versions. + +If you don't work with different source code versions, disable this option +to speed up coverage data processing and to reduce the size of tracefiles. +.RE + +.B \-\-compat +.IR mode = value [, mode = value ,...] +.br +.RS +Set compatibility mode. + +Use \-\-compat to specify that lcov should enable one or more compatibility +modes when capturing coverage data. You can provide a comma-separated list +of mode=value pairs to specify the values for multiple modes. + +Valid +.I values +are: + +.B on +.RS +Enable compatibility mode. +.RE +.B off +.RS +Disable compatibility mode. +.RE +.B auto +.RS +Apply auto-detection to determine if compatibility mode is required. Note that +auto-detection is not available for all compatibility modes. +.RE + +If no value is specified, 'on' is assumed as default value. + +Valid +.I modes +are: + +.B libtool +.RS +Enable this mode if you are capturing coverage data for a project that +was built using the libtool mechanism. See also +\-\-compat\-libtool. + +The default value for this setting is 'on'. + +.RE +.B hammer +.RS +Enable this mode if you are capturing coverage data for a project that +was built using a version of GCC 3.3 that contains a modification +(hammer patch) of later GCC versions. You can identify a modified GCC 3.3 +by checking the build directory of your project for files ending in the +extension '.bbg'. Unmodified versions of GCC 3.3 name these files '.bb'. + +The default value for this setting is 'auto'. + +.RE +.B split_crc +.RS +Enable this mode if you are capturing coverage data for a project that +was built using a version of GCC 4.6 that contains a modification +(split function checksums) of later GCC versions. Typical error messages +when running lcov on coverage data produced by such GCC versions are +\'out of memory' and 'reached unexpected end of file'. + +The default value for this setting is 'auto' +.RE + +.RE + +.B \-\-compat\-libtool +.br +.B \-\-no\-compat\-libtool +.br +.RS +Specify whether to enable libtool compatibility mode. + +Use \-\-compat\-libtool to enable libtool compatibility mode or \-\-no\-compat\-libtool +to disable it. The libtool compatibility mode is +.B enabled +by default. + +When libtool compatibility mode is enabled, lcov will assume that the source +code relating to a .da file located in a directory named ".libs" can be +found in its parent directory. + +If you have directories named ".libs" in your build environment but don't use +libtool, disable this option to prevent problems when capturing coverage data. +.RE + +.B \-\-config\-file +.I config\-file +.br +.RS +Specify a configuration file to use. + +When this option is specified, neither the system\-wide configuration file +/etc/lcovrc, nor the per\-user configuration file ~/.lcovrc is read. + +This option may be useful when there is a need to run several +instances of +.B lcov +with different configuration file options in parallel. +.RE + +.B \-\-convert\-filenames +.br +.RS +Convert filenames when applying diff. + +Use this option together with \-\-diff to rename the file names of processed +data sets according to the data provided by the diff. +.RE + +.B \-\-diff +.I tracefile +.I difffile +.br +.RS +Convert coverage data in +.I tracefile +using source code diff file +.IR difffile . + +Use this option if you want to merge coverage data from different source code +levels of a program, e.g. when you have data taken from an older version +and want to combine it with data from a more current version. +.B lcov +will try to map source code lines between those versions and adjust the coverage +data respectively. +.I difffile +needs to be in unified format, i.e. it has to be created using the "\-u" option +of the +.B diff +tool. + +Note that lines which are not present in the old version will not be counted +as instrumented, therefore tracefiles resulting from this operation should +not be interpreted individually but together with other tracefiles taken +from the newer version. Also keep in mind that converted coverage data should +only be used for overview purposes as the process itself introduces a loss +of accuracy. + +The result of the diff operation will be written to stdout or the tracefile +specified with \-o. + +Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be +specified at a time. +.RE + +.B \-d +.I directory +.br +.B \-\-directory +.I directory +.br +.RS +Use .da files in +.I directory +instead of kernel. + +If you want to work on coverage data for a user space program, use this +option to specify the location where the program was compiled (that's +where the counter files ending with .da will be stored). + +Note that you may specify this option more than once. +.RE + +.B \-\-external +.br +.B \-\-no\-external +.br +.RS +Specify whether to capture coverage data for external source files. + +External source files are files which are not located in one of the directories +specified by \-\-directory or \-\-base\-directory. Use \-\-external to include +external source files while capturing coverage data or \-\-no\-external to +ignore this data. + +Data for external source files is +.B included +by default. +.RE + +.B \-e +.I tracefile +.I pattern +.br +.B \-\-extract +.I tracefile +.I pattern +.br +.RS +Extract data from +.IR tracefile . + +Use this switch if you want to extract coverage data for only a particular +set of files from a tracefile. Additional command line parameters will be +interpreted as shell wildcard patterns (note that they may need to be +escaped accordingly to prevent the shell from expanding them first). +Every file entry in +.I tracefile +which matches at least one of those patterns will be extracted. + +The result of the extract operation will be written to stdout or the tracefile +specified with \-o. + +Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be +specified at a time. +.RE + +.B \-f +.br +.B \-\-follow +.br +.RS +Follow links when searching for .da files. +.RE + +.B \-\-from\-package +.I package +.br +.RS +Use .da files in +.I package +instead of kernel or directory. + +Use this option if you have separate machines for build and test and +want to perform the .info file creation on the build machine. See +\-\-to\-package for more information. +.RE + +.B \-\-gcov\-tool +.I tool +.br +.RS +Specify the location of the gcov tool. +.RE + +.B \-h +.br +.B \-\-help +.br +.RS +Print a short help text, then exit. +.RE + +.B \-\-ignore\-errors +.I errors +.br +.RS +Specify a list of errors after which to continue processing. + +Use this option to specify a list of one or more classes of errors after which +lcov should continue processing instead of aborting. + +.I errors +can be a comma\-separated list of the following keywords: + +.B gcov: +the gcov tool returned with a non\-zero return code. + +.B source: +the source code file for a data set could not be found. + +.B graph: +the graph file could not be found or is corrupted. +.RE + +.B \-i +.br +.B \-\-initial +.RS +Capture initial zero coverage data. + +Run lcov with \-c and this option on the directories containing .bb, .bbg +or .gcno files before running any test case. The result is a "baseline" +coverage data file that contains zero coverage for every instrumented line. +Combine this data file (using lcov \-a) with coverage data files captured +after a test run to ensure that the percentage of total lines covered is +correct even when not all source code files were loaded during the test. + +Recommended procedure when capturing data for a test case: + +1. create baseline coverage data file +.RS +# lcov \-c \-i \-d appdir \-o app_base.info +.br + +.RE +2. perform test +.RS +# appdir/test +.br + +.RE +3. create test coverage data file +.RS +# lcov \-c \-d appdir \-o app_test.info +.br + +.RE +4. combine baseline and test coverage data +.RS +# lcov \-a app_base.info \-a app_test.info \-o app_total.info +.br + +.RE +.RE + +.B \-k +.I subdirectory +.br +.B \-\-kernel\-directory +.I subdirectory +.br +.RS +Capture kernel coverage data only from +.IR subdirectory . + +Use this option if you don't want to get coverage data for all of the +kernel, but only for specific subdirectories. This option may be specified +more than once. + +Note that you may need to specify the full path to the kernel subdirectory +depending on the version of the kernel gcov support. +.RE + +.B \-l +.I tracefile +.br +.B \-\-list +.I tracefile +.br +.RS +List the contents of the +.IR tracefile . + +Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be +specified at a time. +.RE + +.B \-\-list\-full\-path +.br +.B \-\-no\-list\-full\-path +.br +.RS +Specify whether to show full paths during list operation. + +Use \-\-list\-full\-path to show full paths during list operation +or \-\-no\-list\-full\-path to show shortened paths. Paths are +.B shortened +by default. +.RE + +.B \-\-no\-markers +.br +.RS +Use this option if you want to get coverage data without regard to exclusion +markers in the source code file. See +.BR "geninfo " (1) +for details on exclusion markers. +.RE + +.B \-\-no\-recursion +.br +.RS +Use this option if you want to get coverage data for the specified directory +only without processing subdirectories. +.RE + +.B \-o +.I tracefile +.br +.B \-\-output\-file +.I tracefile +.br +.RS +Write data to +.I tracefile +instead of stdout. + +Specify "\-" as a filename to use the standard output. + +By convention, lcov\-generated coverage data files are called "tracefiles" and +should have the filename extension ".info". +.RE + +.B \-\-path +.I path +.br +.RS +Strip path from filenames when applying diff. + +Use this option together with \-\-diff to tell lcov to disregard the specified +initial path component when matching between tracefile and diff filenames. +.RE + +.B \-q +.br +.B \-\-quiet +.br +.RS +Do not print progress messages. + +This option is implied when no output filename is specified to prevent +progress messages to mess with coverage data which is also printed to +the standard output. +.RE + +.B \-\-rc +.IR keyword = value +.br +.RS +Override a configuration directive. + +Use this option to specify a +.IR keyword = value +statement which overrides the corresponding configuration statement in +the lcovrc configuration file. You can specify this option more than once +to override multiple configuration statements. +See +.BR lcovrc (5) +for a list of available keywords and their meaning. +.RE + +.B \-r +.I tracefile +.I pattern +.br +.B \-\-remove +.I tracefile +.I pattern +.br +.RS +Remove data from +.IR tracefile . + +Use this switch if you want to remove coverage data for a particular +set of files from a tracefile. Additional command line parameters will be +interpreted as shell wildcard patterns (note that they may need to be +escaped accordingly to prevent the shell from expanding them first). +Every file entry in +.I tracefile +which matches at least one of those patterns will be removed. + +The result of the remove operation will be written to stdout or the tracefile +specified with \-o. + +Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be +specified at a time. +.RE + +.B \-\-strip +.I depth +.br +.RS +Strip path components when applying diff. + +Use this option together with \-\-diff to tell lcov to disregard the specified +number of initial directories when matching tracefile and diff filenames. +.RE + +.B \-\-summary +.I tracefile +.br +.RS +Show summary coverage information for the specified tracefile. + +Note that you may specify this option more than once. + +Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be +specified at a time. +.RE + +.B \-t +.I testname +.br +.B \-\-test\-name +.I testname +.br +.RS +Specify test name to be stored in the tracefile. + +This name identifies a coverage data set when more than one data set is merged +into a combined tracefile (see option \-a). + +Valid test names can consist of letters, decimal digits and the underscore +character ("_"). +.RE + +.B \-\-to\-package +.I package +.br +.RS +Store .da files for later processing. + +Use this option if you have separate machines for build and test and +want to perform the .info file creation on the build machine. To do this, +follow these steps: + +On the test machine: +.RS +.br +\- run the test +.br +\- run lcov \-c [\-d directory] \-\-to-package +.I file +.br +\- copy +.I file +to the build machine +.RE +.br + +On the build machine: +.RS +.br +\- run lcov \-c \-\-from-package +.I file +[\-o and other options] +.RE +.br + +This works for both kernel and user space coverage data. Note that you might +have to specify the path to the build directory using \-b with +either \-\-to\-package or \-\-from-package. Note also that the package data +must be converted to a .info file before recompiling the program or it will +become invalid. +.RE + +.B \-v +.br +.B \-\-version +.br +.RS +Print version number, then exit. +.RE + +.B \-z +.br +.B \-\-zerocounters +.br +.RS +Reset all execution counts to zero. + +By default tries to reset kernel execution counts. Use the \-\-directory +option to reset all counters of a user space program. + +Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be +specified at a time. +.RE + +.SH FILES + +.I /etc/lcovrc +.RS +The system\-wide configuration file. +.RE + +.I ~/.lcovrc +.RS +The per\-user configuration file. +.RE + +.SH AUTHOR +Peter Oberparleiter + +.SH SEE ALSO +.BR lcovrc (5), +.BR genhtml (1), +.BR geninfo (1), +.BR genpng (1), +.BR gendesc (1), +.BR gcov (1) diff --git a/utils/lcov-1.11/man/lcovrc.5 b/utils/lcov-1.11/man/lcovrc.5 new file mode 100755 index 00000000..36a42364 --- /dev/null +++ b/utils/lcov-1.11/man/lcovrc.5 @@ -0,0 +1,841 @@ +.TH lcovrc 5 "LCOV 1.11" 2014\-05\-23 "User Manuals" + +.SH NAME +lcovrc \- lcov configuration file + +.SH DESCRIPTION +The +.I lcovrc +file contains configuration information for the +.B lcov +code coverage tool (see +.BR lcov (1)). +.br + +The system\-wide configuration file is located at +.IR /etc/lcovrc . +To change settings for a single user, place a customized copy of this file at +location +.IR ~/.lcovrc . +Where available, command\-line options override configuration file settings. + +Lines in a configuration file can either be: +.IP " *" +empty lines or lines consisting only of white space characters. These lines are +ignored. +.IP " *" +comment lines which start with a hash sign ('#'). These are treated like empty +lines and will be ignored. +.IP " *" +statements in the form +.RI ' key " = " value '. +A list of valid statements and their description can be found in +section 'OPTIONS' below. +.PP + +.B Example configuration: +.IP +# +.br +# Example LCOV configuration file +.br +# +.br + +# External style sheet file +.br +#genhtml_css_file = gcov.css +.br + +# Coverage rate limits +.br +genhtml_hi_limit = 90 +.br +genhtml_med_limit = 75 +.br + +# Width of line coverage field in source code view +.br +genhtml_line_field_width = 12 +.br + +# Width of branch coverage field in source code view +.br +genhtml_branch_field_width = 16 +.br + +# Width of overview image +.br +genhtml_overview_width = 80 +.br + +# Resolution of overview navigation +.br +genhtml_nav_resolution = 4 +.br + +# Offset for source code navigation +.br +genhtml_nav_offset = 10 +.br + +# Do not remove unused test descriptions if non\-zero +.br +genhtml_keep_descriptions = 0 +.br + +# Do not remove prefix from directory names if non\-zero +.br +genhtml_no_prefix = 0 +.br + +# Do not create source code view if non\-zero +.br +genhtml_no_source = 0 +.br + +# Specify size of tabs +.br +genhtml_num_spaces = 8 +.br + +# Highlight lines with converted\-only data if non\-zero +.br +genhtml_highlight = 0 +.br + +# Include color legend in HTML output if non\-zero +.br +genhtml_legend = 0 +.br + +# Include HTML file at start of HTML output +.br +#genhtml_html_prolog = prolog.html +.br + +# Include HTML file at end of HTML output +.br +#genhtml_html_epilog = epilog.html +.br + +# Use custom HTML file extension +.br +#genhtml_html_extension = html +.br + +# Compress all generated html files with gzip. +.br +#genhtml_html_gzip = 1 +.br + +# Include sorted overview pages +.br +genhtml_sort = 1 +.br + +# Include function coverage data display +.br +#genhtml_function_coverage = 1 +.br + +# Include branch coverage data display +.br +#genhtml_branch_coverage = 1 +.br + +# Specify the character set of all generated HTML pages +.br +genhtml_charset=UTF\-8 +.br + +# Allow HTML markup in test case description text if non\-zero +.br +genhtml_desc_html=0 +.br + +# Location of the gcov tool +.br +#geninfo_gcov_tool = gcov +.br + +# Adjust test names if non\-zero +.br +#geninfo_adjust_testname = 0 +.br + +# Calculate a checksum for each line if non\-zero +.br +geninfo_checksum = 0 +.br + +# Enable libtool compatibility mode if non\-zero +.br +geninfo_compat_libtool = 0 +.br + +# Specify whether to capture coverage data for external source +.br +# files +.br +#geninfo_external = 1 +.br + +# Use gcov's --all-blocks option if non-zero +.br +#geninfo_gcov_all_blocks = 1 +.br + +# Specify compatiblity modes (same as \-\-compat option +.br +# of geninfo) +.br +#geninfo_compat = libtool=on, hammer=auto, split_crc=auto +.br + +# Adjust path to source files by removing or changing path +.br +# components that match the specified pattern (Perl regular +.br +# expression format) +.br +#geninfo_adjust_src_path = /tmp/build => /usr/src + +# Specify if geninfo should try to automatically determine +.br +# the base-directory when collecting coverage data. +.br +geninfo_auto_base = 1 +.br + +# Directory containing gcov kernel files +.br +lcov_gcov_dir = /proc/gcov +.br + +# Location for temporary directories +.br +lcov_tmp_dir = /tmp +.br + +# Show full paths during list operation if non\-zero +.br +lcov_list_full_path = 0 +.br + +# Specify the maximum width for list output. This value is +.br +# ignored when lcov_list_full_path is non\-zero. +.br +lcov_list_width = 80 +.br + +# Specify the maximum percentage of file names which may be +.br +# truncated when choosing a directory prefix in list output. +.br +# This value is ignored when lcov_list_full_path is non\-zero. +.br +lcov_list_truncate_max = 20 + +# Specify if function coverage data should be collected and +.br +# processed. +.br +lcov_function_coverage = 1 +.br + +# Specify if branch coverage data should be collected and +.br +# processed. +.br +lcov_branch_coverage = 0 +.br +.PP + +.SH OPTIONS + +.BR genhtml_css_file " =" +.I filename +.IP +Specify an external style sheet file. Use this option to modify the appearance of the HTML output as generated by +.BR genhtml . +During output generation, a copy of this file will be placed in the output +directory. +.br + +This option corresponds to the \-\-css\-file command line option of +.BR genhtml . +.br + +By default, a standard CSS file is generated. +.PP + +.BR genhtml_hi_limit " =" +.I hi_limit +.br +.BR genhtml_med_limit " =" +.I med_limit +.br +.IP +Specify coverage rate limits for classifying file entries. Use this option to +modify the coverage rates (in percent) for line, function and branch coverage at +which a result is classified as high, medium or low coverage. This +classification affects the color of the corresponding entries on the overview +pages of the HTML output: +.br + +High: hi_limit <= rate <= 100 default color: green +.br +Medium: med_limit <= rate < hi_limit default color: orange +.br +Low: 0 <= rate < med_limit default color: red +.br + +Defaults are 90 and 75 percent. +.PP + +.BR genhtml_line_field_width " =" +.I number_of_characters +.IP +Specify the width (in characters) of the source code view column containing +line coverage information. +.br + +Default is 12. +.PP + +.BR genhtml_branch_field_width " =" +.I number_of_characters +.IP +Specify the width (in characters) of the source code view column containing +branch coverage information. +.br + +Default is 16. +.PP + +.BR genhtml_overview_width " =" +.I pixel_size +.IP +Specify the width (in pixel) of the overview image created when generating HTML +output using the \-\-frames option of +.BR genhtml . +.br + +Default is 80. +.PP + +.BR genhtml_nav_resolution " =" +.I lines +.IP +Specify the resolution of overview navigation when generating HTML output using +the \-\-frames option of +.BR genhtml . +This number specifies the maximum difference in lines between the position a +user selected from the overview and the position the source code window is +scrolled to. +.br + +Default is 4. +.PP + + +.BR genhtml_nav_offset " =" +.I lines +.IP +Specify the overview navigation line offset as applied when generating HTML +output using the \-\-frames option of +.BR genhtml. +.br + +Clicking a line in the overview image should show the source code view at +a position a bit further up, so that the requested line is not the first +line in the window. This number specifies that offset. +.br + +Default is 10. +.PP + + +.BR genhtml_keep_descriptions " =" +.IR 0 | 1 +.IP +If non\-zero, keep unused test descriptions when generating HTML output using +.BR genhtml . +.br + +This option corresponds to the \-\-keep\-descriptions option of +.BR genhtml . +.br + +Default is 0. +.PP + +.BR genhtml_no_prefix " =" +.IR 0 | 1 +.IP +If non\-zero, do not try to find and remove a common prefix from directory names. +.br + +This option corresponds to the \-\-no\-prefix option of +.BR genhtml . +.br + +Default is 0. +.PP + +.BR genhtml_no_source " =" +.IR 0 | 1 +.IP +If non\-zero, do not create a source code view when generating HTML output using +.BR genhtml . +.br + +This option corresponds to the \-\-no\-source option of +.BR genhtml . +.br + +Default is 0. +.PP + +.BR genhtml_num_spaces " =" +.I num +.IP +Specify the number of spaces to use as replacement for tab characters in the +HTML source code view as generated by +.BR genhtml . +.br + +This option corresponds to the \-\-num\-spaces option of +.BR genthml . +.br + +Default is 8. + +.PP + +.BR genhtml_highlight " =" +.IR 0 | 1 +.IP +If non\-zero, highlight lines with converted\-only data in +HTML output as generated by +.BR genhtml . +.br + +This option corresponds to the \-\-highlight option of +.BR genhtml . +.br + +Default is 0. +.PP + +.BR genhtml_legend " =" +.IR 0 | 1 +.IP +If non\-zero, include a legend explaining the meaning of color coding in the HTML +output as generated by +.BR genhtml . +.br + +This option corresponds to the \-\-legend option of +.BR genhtml . +.br + +Default is 0. +.PP + +.BR genhtml_html_prolog " =" +.I filename +.IP +If set, include the contents of the specified file at the beginning of HTML +output. + +This option corresponds to the \-\-html\-prolog option of +.BR genhtml . +.br + +Default is to use no extra prolog. +.PP + +.BR genhtml_html_epilog " =" +.I filename +.IP +If set, include the contents of the specified file at the end of HTML output. + +This option corresponds to the \-\-html\-epilog option of +.BR genhtml . +.br + +Default is to use no extra epilog. +.PP + +.BR genhtml_html_extension " =" +.I extension +.IP +If set, use the specified string as filename extension for generated HTML files. + +This option corresponds to the \-\-html\-extension option of +.BR genhtml . +.br + +Default extension is "html". +.PP + +.BR genhtml_html_gzip " =" +.IR 0 | 1 +.IP +If set, compress all html files using gzip. + +This option corresponds to the \-\-html\-gzip option of +.BR genhtml . +.br + +Default extension is 0. +.PP + +.BR genhtml_sort " =" +.IR 0 | 1 +.IP +If non\-zero, create overview pages sorted by coverage rates when generating +HTML output using +.BR genhtml . +.br + +This option can be set to 0 by using the \-\-no\-sort option of +.BR genhtml . +.br + +Default is 1. +.PP + +.BR genhtml_function_coverage " =" +.IR 0 | 1 +.IP +If non\-zero, include function coverage data when generating HTML output using +.BR genhtml . +.br + +This option can be set to 0 by using the \-\-no\-function\-coverage option of +.BR genhtml . +.br + +Default is 1. +.PP + +.BR genhtml_branch_coverage " =" +.IR 0 | 1 +.IP +If non\-zero, include branch coverage data when generating HTML output using +.BR genhtml . +.br + +This option can be set to 0 by using the \-\-no\-branch\-coverage option of +.BR genhtml . +.br + +Default is 1. +.PP + +.BR genhtml_charset " =" +.I charset +.IP +Specify the character set of all generated HTML pages. +.br + +Use this option if the source code contains characters which are not +part of the default character set. Note that this option is ignored +when a custom HTML prolog is specified (see also +.BR genhtml_html_prolog ). +.br + +Default is UTF-8. +.PP + +.BR genhtml_desc_html " =" +.IR 0 | 1 +.IP +If non-zero, test case descriptions may contain HTML markup. + +Set this option to one if you want to embed HTML markup (for example to +include links) in test case descriptions. When set to zero, HTML markup +characters will be escaped to show up as plain text on the test case +description page. +.br + +Default is 0. +.PP +. +.BR geninfo_gcov_tool " =" +.I path_to_gcov +.IP +Specify the location of the gcov tool (see +.BR gcov (1)) +which is used to generate coverage information from data files. +.br + +Default is 'gcov'. +.PP + +.BR geninfo_adjust_testname " =" +.IR 0 | 1 +.IP +If non\-zero, adjust test names to include operating system information +when capturing coverage data. +.br + +Default is 0. +.PP + +.BR geninfo_checksum " =" +.IR 0 | 1 +.IP +If non\-zero, generate source code checksums when capturing coverage data. +Checksums are useful to prevent merging coverage data from incompatible +source code versions but checksum generation increases the size of coverage +files and the time used to generate those files. +.br + +This option corresponds to the \-\-checksum and \-\-no\-checksum command line +option of +.BR geninfo . +.br + +Default is 0. +.PP + +.BR geninfo_compat_libtool " =" +.IR 0 | 1 +.IP +If non\-zero, enable libtool compatibility mode. When libtool compatibility +mode is enabled, lcov will assume that the source code relating to a .da file +located in a directory named ".libs" can be found in its parent directory. +.br + +This option corresponds to the \-\-compat\-libtool and \-\-no\-compat\-libtool +command line option of +.BR geninfo . +.br + +Default is 1. +.PP + +.BR geninfo_external " =" +.IR 0 | 1 +.IP +If non\-zero, capture coverage data for external source files. + +External source files are files which are not located in one of the directories +(including sub-directories) +specified by the \-\-directory or \-\-base\-directory options of +.BR lcov / geninfo . + +Default is 1. +.PP + +.BR geninfo_gcov_all_blocks " =" +.IR 0 | 1 +.IP +If non\-zero, call the gcov tool with option --all-blocks. + +Using --all-blocks will produce more detailed branch coverage information for +each line. Set this option to zero if you do not need detailed branch coverage +information to speed up the process of capturing code coverage or to work +around a bug in some versions of gcov which will cause it to endlessly loop +when analysing some files. + +Default is 1. +.PP + +.BR geninfo_compat " =" +.IR mode = value [, mode = value ,...] +.IP +Specify that geninfo should enable one or more compatibility modes +when capturing coverage data. + +This option corresponds to the \-\-compat command line option of +.BR geninfo . + +Default is 'libtool=on, hammer=auto, split_crc=auto'. +.PP + +.BR geninfo_adjust_src_path " =" +.IR pattern " => " replacement +.br +.BR geninfo_adjust_src_path " =" +.I pattern +.IP +Adjust source paths when capturing coverage data. + +Use this option in situations where geninfo cannot find the correct +path to source code files of a project. By providing a +.I pattern +in Perl regular expression format (see +.BR perlre (1)) +and an optional replacement string, you can instruct geninfo to +remove or change parts of the incorrect source path. + +.B Example: +.br + +1. When geninfo reports that it cannot find source file +.br + + /path/to/src/.libs/file.c +.br + +while the file is actually located in +.br + + /path/to/src/file.c +.br + +use the following parameter: +.br + + geninfo_adjust_src_path = /.libs + +This will remove all "/.libs" strings from the path. + +2. When geninfo reports that it cannot find source file +.br + + /tmp/build/file.c +.br + +while the file is actually located in +.br + + /usr/src/file.c +.br + +use the following parameter: +.br + + geninfo_adjust_src_path = /tmp/build => /usr/src +.br + +This will change all "/tmp/build" strings in the path to "/usr/src". +.PP + +.BR geninfo_auto_base " =" +.IR 0 | 1 +.IP +If non\-zero, apply a heuristic to determine the base directory when +collecting coverage data. +.br + +Use this option when using geninfo on projects built with libtool or +similar build environments that work with multiple base directories, +i.e. environments, where the current working directory when invoking the +compiler ist not the same directory in which the source code file is +located, and in addition, is different between files of the same project. +.br + +Default is 1. +.PP + +.BR lcov_gcov_dir " =" +.I path_to_kernel_coverage_data +.IP +Specify the path to the directory where kernel coverage data can be found +or leave undefined for auto-detection. +.br + +Default is auto-detection. +.PP + +.BR lcov_tmp_dir " =" +.I temp +.IP +Specify the location of a directory used for temporary files. +.br + +Default is '/tmp'. +.PP + +.BR lcov_list_full_path " =" +.IR 0 | 1 +.IP +If non-zero, print the full path to source code files during a list operation. +.br + +This option corresponds to the \-\-list\-full\-path option of +.BR lcov . +.br + +Default is 0. +.PP + +.BR lcov_list_max_width " =" +.IR width +.IP +Specify the maximum width for list output. This value is ignored when +lcov_list_full_path is non\-zero. +.br + +Default is 80. +.PP + +.BR lcov_list_truncate_max +.B " =" +.IR percentage +.IP +Specify the maximum percentage of file names which may be truncated when +choosing a directory prefix in list output. This value is ignored when +lcov_list_full_path is non\-zero. +.br + +Default is 20. +.PP + +.BR lcov_function_coverage " =" +.IR 0 | 1 +.IP +Specify whether lcov should handle function coverage data. +.br + +Setting this option to 0 can reduce memory and CPU time consumption +when lcov is collecting and processing coverage data, as well as +reduce the size of the resulting data files. Note that setting +.B genhtml_function_coverage +will override this option for HTML generation. +.br + +Default is 1. +.PP + +.BR lcov_branch_coverage " =" +.IR 0 | 1 +.IP +Specify whether lcov should handle branch coverage data. +.br + +Setting this option to 0 can reduce memory and CPU time consumption +when lcov is collecting and processing coverage data, as well as +reduce the size of the resulting data files. Note that setting +.B genhtml_branch_coverage +will override this option for HTML generation. +.br + +Default is 0. +.PP + +.SH FILES + +.TP +.I /etc/lcovrc +The system\-wide +.B lcov +configuration file. + +.TP +.I ~/.lcovrc +The individual per\-user configuration file. +.PP + +.SH SEE ALSO +.BR lcov (1), +.BR genhtml (1), +.BR geninfo (1), +.BR gcov (1) diff --git a/utils/lcov-1.11/rpm/lcov.spec b/utils/lcov-1.11/rpm/lcov.spec new file mode 100755 index 00000000..31775205 --- /dev/null +++ b/utils/lcov-1.11/rpm/lcov.spec @@ -0,0 +1,51 @@ +Summary: A graphical GCOV front-end +Name: lcov +Version: 1.11 +Release: 1 +License: GPL +Group: Development/Tools +URL: http://ltp.sourceforge.net/coverage/lcov.php +Source0: http://downloads.sourceforge.net/ltp/lcov-%{version}.tar.gz +BuildRoot: /var/tmp/%{name}-%{version}-root +BuildArch: noarch +Requires: perl >= 5.8.8 + +%description +LCOV is a graphical front-end for GCC's coverage testing tool gcov. It collects +gcov data for multiple source files and creates HTML pages containing the +source code annotated with coverage information. It also adds overview pages +for easy navigation within the file structure. + +%prep +%setup -q -n lcov-%{version} + +%build +exit 0 + +%install +rm -rf $RPM_BUILD_ROOT +make install PREFIX=$RPM_BUILD_ROOT + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root) +/usr/bin +/usr/share +/etc + +%changelog +* Mon May 07 2012 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) +- added dependency on perl 5.8.8 for >>& open mode support +* Wed Aug 13 2008 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) +- changed description + summary text +* Mon Aug 20 2007 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) +- fixed "Copyright" tag +* Mon Jul 14 2003 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) +- removed variables for version/release to support source rpm building +- added initial rm command in install section +* Mon Apr 7 2003 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) +- implemented variables for version/release +* Fri Oct 8 2002 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) +- created initial spec file From f2895cb5b67f2be60a7921b8ae124280f1009cc1 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 6 Sep 2015 23:53:31 -0400 Subject: [PATCH 037/212] remove optimizations when compiling with coverage check --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 9b42062a..b911afff 100644 --- a/configure.ac +++ b/configure.ac @@ -37,5 +37,5 @@ AC_TYPE_SIZE_T AC_CONFIG_FILES([Makefile]) AC_ARG_ENABLE(coverage, - AC_HELP_STRING([--enable-coverage],[Enable code coverage]), [CXXFLAGS="$CXXFLAGS -g -ftest-coverage -fprofile-arcs"]) + AC_HELP_STRING([--enable-coverage],[Enable code coverage]), [CXXFLAGS=" -O0 -g -ftest-coverage -fprofile-arcs"]) AC_OUTPUT From 297799411bc26829036914a4112a76897c584fb5 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 6 Sep 2015 23:53:56 -0400 Subject: [PATCH 038/212] add and improve coverage makefile targets --- Makefile.am | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Makefile.am b/Makefile.am index 4c9d6b94..4dd96a86 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,16 +12,17 @@ librestclient_cpp_la_SOURCES=source/restclient.cpp librestclient_cpp_la_CXXFLAGS=-fPIC librestclient_cpp_la_LDFLAGS=-version-info 1:0:1 -.PHONY: check clean-coverage-files coverage-html +.PHONY: test check clean-coverage-files coverage-html test: check ./test-program -clean-coverage-files: +clean-local: find . -name "*.gcda" -print0 | xargs -0 rm -coverage.info: - ./utils/lcov-1.11/bin/lcov --remove coverage.info "/usr*" -o coverage.info +coverage.info: test + ./utils/lcov-1.11/bin/lcov --compat-libtool --capture --directory source --output-file coverage.info + ./utils/lcov-1.11/bin/lcov --compat-libtool --remove coverage.info "/usr*" -o coverage.info coverage-html: coverage.info - ./utils/lcov-1.11/bin/genhtml coverage.info --output-directory html + ./utils/lcov-1.11/bin/genhtml -t "restclient-cpp coverage report" --legend --show-details coverage.info --output-directory html From 72f9e9ac987387b37fe43cd1ef33108e2530435f Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 7 Sep 2015 00:02:09 -0400 Subject: [PATCH 039/212] first stab at adding coveralls integration via travis --- .travis.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d022031c..47275b67 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,12 @@ language: cpp # command to install dependencies -script: ./autogen.sh && ./configure && make test +script: ./autogen.sh && ./configure --enable-coverage && make test before_script: - ./utils/build_gtest.sh + - gem install coveralls-lcov +after_success: + - make coverage.info + - coveralls-lcov coverage.info sudo: false addons: apt: From b00f3adf51bdb9118ca650521b9f8fc1d8fbaa94 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 7 Sep 2015 00:08:26 -0400 Subject: [PATCH 040/212] add coveralls badge to README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d3c60ca5..e1d661ee 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# REST client for C++ [![Build Status](https://travis-ci.org/mrtazz/restclient-cpp.svg?branch=master)](https://travis-ci.org/mrtazz/restclient-cpp) +# REST client for C++ [![Build Status](https://travis-ci.org/mrtazz/restclient-cpp.svg?branch=master)](https://travis-ci.org/mrtazz/restclient-cpp) [![Coverage Status](https://coveralls.io/repos/mrtazz/restclient-cpp/badge.svg?branch=master&service=github)](https://coveralls.io/github/mrtazz/restclient-cpp?branch=master) ## About This is a simple REST client for C++. It wraps libcurl for HTTP requests. From bb5b2b28f87996c6b9922609cf30348a19dd9ed1 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 7 Sep 2015 11:39:34 -0400 Subject: [PATCH 041/212] add packagecloud badge to README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e1d661ee..c1828dff 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# REST client for C++ [![Build Status](https://travis-ci.org/mrtazz/restclient-cpp.svg?branch=master)](https://travis-ci.org/mrtazz/restclient-cpp) [![Coverage Status](https://coveralls.io/repos/mrtazz/restclient-cpp/badge.svg?branch=master&service=github)](https://coveralls.io/github/mrtazz/restclient-cpp?branch=master) +# REST client for C++ +[![Build Status](https://travis-ci.org/mrtazz/restclient-cpp.svg?branch=master)](https://travis-ci.org/mrtazz/restclient-cpp) [![Coverage Status](https://coveralls.io/repos/mrtazz/restclient-cpp/badge.svg?branch=master&service=github)](https://coveralls.io/github/mrtazz/restclient-cpp?branch=master) ![Packagecloud](https://img.shields.io/badge/packagecloud-available-green.svg) ## About This is a simple REST client for C++. It wraps libcurl for HTTP requests. From 00bf8e1421b0fb5a4e0a09f7f44ec03e1edecb8b Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 7 Sep 2015 11:41:21 -0400 Subject: [PATCH 042/212] make packagecloud badge a link --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c1828dff..7404e232 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # REST client for C++ -[![Build Status](https://travis-ci.org/mrtazz/restclient-cpp.svg?branch=master)](https://travis-ci.org/mrtazz/restclient-cpp) [![Coverage Status](https://coveralls.io/repos/mrtazz/restclient-cpp/badge.svg?branch=master&service=github)](https://coveralls.io/github/mrtazz/restclient-cpp?branch=master) ![Packagecloud](https://img.shields.io/badge/packagecloud-available-green.svg) +[![Build Status](https://travis-ci.org/mrtazz/restclient-cpp.svg?branch=master)](https://travis-ci.org/mrtazz/restclient-cpp) +[![Coverage Status](https://coveralls.io/repos/mrtazz/restclient-cpp/badge.svg?branch=master&service=github)](https://coveralls.io/github/mrtazz/restclient-cpp?branch=master) +[![Packagecloud](https://img.shields.io/badge/packagecloud-available-green.svg)](https://packagecloud.io/mrtazz/restclient-cpp) ## About This is a simple REST client for C++. It wraps libcurl for HTTP requests. From c467955d6f81375d15e2c8be2dc2f51b150f1315 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 7 Oct 2015 07:29:07 -0400 Subject: [PATCH 043/212] remove calls to curl_global_cleanup this method is not threadsafe and should not be called from a library. It cleans up a lot of non-local setups and thus should be called from the application. Maybe it's worth adding a cleanup function to restclient for this to make it more explicit that a global cleanup needs to be done by the caller. However it would only call curl_global_cleanup right now anyways. reference: http://curl.haxx.se/mail/lib-2012-05/0034.html fixes #19 #29 --- source/restclient.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/source/restclient.cpp b/source/restclient.cpp index 7d5a3135..9be97366 100644 --- a/source/restclient.cpp +++ b/source/restclient.cpp @@ -104,7 +104,7 @@ RestClient::response RestClient::get(const std::string& url, const headermap& he ret.body = "Operation Timeout."; return ret; } - + ret.body = "Failed to query."; ret.code = -1; return ret; @@ -115,7 +115,6 @@ RestClient::response RestClient::get(const std::string& url, const headermap& he curl_slist_free_all(hlist); curl_easy_cleanup(curl); - curl_global_cleanup(); } return ret; @@ -215,7 +214,7 @@ RestClient::response RestClient::post(const std::string& url, ret.body = "Operation Timeout."; return ret; } - + ret.body = "Failed to query."; ret.code = -1; return ret; @@ -226,7 +225,6 @@ RestClient::response RestClient::post(const std::string& url, curl_slist_free_all(hlist); curl_easy_cleanup(curl); - curl_global_cleanup(); } return ret; @@ -337,7 +335,7 @@ RestClient::response RestClient::put(const std::string& url, ret.body = "Operation Timeout."; return ret; } - + ret.body = "Failed to query."; ret.code = -1; return ret; @@ -348,7 +346,6 @@ RestClient::response RestClient::put(const std::string& url, curl_slist_free_all(hlist); curl_easy_cleanup(curl); - curl_global_cleanup(); } return ret; @@ -436,7 +433,7 @@ RestClient::response RestClient::del(const std::string& url, ret.body = "Operation Timeout."; return ret; } - + ret.body = "Failed to query."; ret.code = -1; return ret; @@ -447,7 +444,6 @@ RestClient::response RestClient::del(const std::string& url, curl_slist_free_all(hlist); curl_easy_cleanup(curl); - curl_global_cleanup(); } return ret; From 4ade9fd7e5aa1add53e75e2199bcf1e1e4d55d8a Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 7 Oct 2015 07:46:17 -0400 Subject: [PATCH 044/212] add automatic doc build & deploy this adds a Make target to automatically build and deploy docs and hooks it up to travis-ci. This commit also ports the packaging tasks from a utils shell script to a Make target. --- .gitignore | 8 + .travis.yml | 15 +- Makefile.am | 56 +- doxygen.config | 2362 +++++++++++++++++++++++++++++++++++++++ utils/build_packages.sh | 58 - 5 files changed, 2435 insertions(+), 64 deletions(-) create mode 100644 doxygen.config delete mode 100755 utils/build_packages.sh diff --git a/.gitignore b/.gitignore index 74a7b5e0..dde92fe0 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,11 @@ m4 *gcno html coverage.info + +# packaging +*.rpm +*.deb +usr + +# generated files +docs diff --git a/.travis.yml b/.travis.yml index 47275b67..ff828d71 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,20 @@ language: cpp -# command to install dependencies script: ./autogen.sh && ./configure --enable-coverage && make test before_script: - - ./utils/build_gtest.sh - - gem install coveralls-lcov +- ./utils/build_gtest.sh +- gem install coveralls-lcov after_success: - - make coverage.info - - coveralls-lcov coverage.info +- make coverage.info +- coveralls-lcov coverage.info +- test $TRAVIS_PULL_REQUEST == "false" && test $TRAVIS_BRANCH == "master" && make + deploy-docs sudo: false addons: apt: packages: - build-essential - libcurl4-openssl-dev + - doxygen +env: + global: + secure: RBqsrKEQwH7g4gFKqIDvMIPctt402mxnW36RYg8X5yRZhAyiiF116m9G514coNDYndbnxtNLhtzMI5Vq+vVcDasXsms52VHedVXWTtJ/GfQo4GrTFaPNblG/WsWhwJqU/kSoldkX1G/rLKz6F+ds0ZCEUPy/4rPFlCF+jUJTR/I= diff --git a/Makefile.am b/Makefile.am index 4dd96a86..77776854 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,7 +12,7 @@ librestclient_cpp_la_SOURCES=source/restclient.cpp librestclient_cpp_la_CXXFLAGS=-fPIC librestclient_cpp_la_LDFLAGS=-version-info 1:0:1 -.PHONY: test check clean-coverage-files coverage-html +.PHONY: test check clean-coverage-files coverage-html docs clean-docs deploy-docs doxygen jekyll packages rpm deb test: check ./test-program @@ -26,3 +26,57 @@ coverage.info: test coverage-html: coverage.info ./utils/lcov-1.11/bin/genhtml -t "restclient-cpp coverage report" --legend --show-details coverage.info --output-directory html + +local-install: + $(MAKE) install PREFIX=usr + +NAME=restclient-cpp +VERSION = $(shell git describe --tags --always --dirty) +BUILDER = $(shell echo "`git config user.name` <`git config user.email`>") +PKG_RELEASE ?= 1 +PROJECT_URL="https://github.com/mrtazz/$(NAME)" +FPM_FLAGS= --name $(NAME) --version $(VERSION) --iteration $(PKG_RELEASE) --epoch 1 --license MIT --maintainer "$(BUILDER)" --url $(PROJECT_URL) --vendor mrtazz usr + +rpm: + fpm -t rpm -s dir $(FPM_FLAGS) + +deb: + fpm -t deb -s dir $(FPM_FLAGS) + +packages: local-install rpm deb + +include/snyder/version.h: + m4 -I m4 --define=M4_SNYDER_VERSION=$(VERSION) version.h.m4 > $@ + + +GAUGES_CODE="539c6c8de32bb442640005f3" + +doxygen: + doxygen doxygen.config + +jekyll: + echo "gaugesid: $(GAUGES_CODE)" > docs/_config.yml + echo "projecturl: $(PROJECT_URL)" >> docs/_config.yml + echo "basesite: http://www.unwiredcouch.com" >> docs/_config.yml + echo "markdown: redcarpet" >> docs/_config.yml + echo "---" > docs/index.md + echo "layout: project" >> docs/index.md + echo "title: restclient-cpp" >> docs/index.md + echo "---" >> docs/index.md + cat README.md >> docs/index.md + +docs: doxygen jekyll + +clean-docs: + rm -rf ./docs + +deploy-docs: docs + cd docs && git init && git remote add upstream "https://${GH_TOKEN}@github.com/mrtazz/$(NAME).git" && \ + git submodule add https://github.com/mrtazz/jekyll-layouts.git ./_layouts && \ + git submodule update --init && \ + git fetch upstream && git reset upstream/gh-pages && \ + git config user.name 'Daniel Schauenberg' && git config user.email d@unwiredcouch.com && \ + touch . && git add -A . && \ + git commit -m "rebuild pages at $(VERSION)" && \ + git push upstream HEAD:gh-pages + diff --git a/doxygen.config b/doxygen.config new file mode 100644 index 00000000..4348acd6 --- /dev/null +++ b/doxygen.config @@ -0,0 +1,2362 @@ +# Doxyfile 1.8.9.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "restclient-cpp" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "metrics library for C++11" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. +# Note: If this tag is empty the current directory is searched. + +INPUT = . include/restclient-cpp source + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank the +# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, +# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, +# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, +# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, +# *.qsf, *.as and *.js. + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = README.md + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = ref + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /

$func_code$count_code
$name$count
$alt
-END_OF_HTML - ; - } - elsif ($width == 100) - { - # Full coverage - $graph_code = (<$alt -END_OF_HTML - ; - } - else - { - # Positive coverage - $graph_code = (<$alt$alt -END_OF_HTML - ; - } - - # Remove leading tabs from all lines - $graph_code =~ s/^\t+//gm; - chomp($graph_code); - - return($graph_code); -} - -# -# sub classify_rate(found, hit, med_limit, high_limit) -# -# Return 0 for low rate, 1 for medium rate and 2 for hi rate. -# - -sub classify_rate($$$$) -{ - my ($found, $hit, $med, $hi) = @_; - my $rate; - - if ($found == 0) { - return 2; - } - $rate = rate($hit, $found); - if ($rate < $med) { - return 0; - } elsif ($rate < $hi) { - return 1; - } - return 2; -} - - -# -# write_html(filehandle, html_code) -# -# Write out HTML_CODE to FILEHANDLE while removing a leading tabulator mark -# in each line of HTML_CODE. -# - -sub write_html(*$) -{ - local *HTML_HANDLE = $_[0]; - my $html_code = $_[1]; - - # Remove leading tab from all lines - $html_code =~ s/^\t//gm; - - print(HTML_HANDLE $html_code) - or die("ERROR: cannot write HTML data ($!)\n"); -} - - -# -# write_html_prolog(filehandle, base_dir, pagetitle) -# -# Write an HTML prolog common to all HTML files to FILEHANDLE. PAGETITLE will -# be used as HTML page title. BASE_DIR contains a relative path which points -# to the base directory. -# - -sub write_html_prolog(*$$) -{ - my $basedir = $_[1]; - my $pagetitle = $_[2]; - my $prolog; - - $prolog = $html_prolog; - $prolog =~ s/\@pagetitle\@/$pagetitle/g; - $prolog =~ s/\@basedir\@/$basedir/g; - - write_html($_[0], $prolog); -} - - -# -# write_header_prolog(filehandle, base_dir) -# -# Write beginning of page header HTML code. -# - -sub write_header_prolog(*$) -{ - # ************************************************************* - - write_html($_[0], < - $title - - - - - -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_header_line(handle, content) -# -# Write a header line with the specified table contents. -# - -sub write_header_line(*@) -{ - my ($handle, @content) = @_; - my $entry; - - write_html($handle, " \n"); - foreach $entry (@content) { - my ($width, $class, $text, $colspan) = @{$entry}; - - if (defined($width)) { - $width = " width=\"$width\""; - } else { - $width = ""; - } - if (defined($class)) { - $class = " class=\"$class\""; - } else { - $class = ""; - } - if (defined($colspan)) { - $colspan = " colspan=\"$colspan\""; - } else { - $colspan = ""; - } - $text = "" if (!defined($text)); - write_html($handle, - " $text\n"); - } - write_html($handle, " \n"); -} - - -# -# write_header_epilog(filehandle, base_dir) -# -# Write end of page header HTML code. -# - -sub write_header_epilog(*$) -{ - # ************************************************************* - - write_html($_[0], < -
- - - - - - -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_file_table_prolog(handle, file_heading, ([heading, num_cols], ...)) -# -# Write heading for file table. -# - -sub write_file_table_prolog(*$@) -{ - my ($handle, $file_heading, @columns) = @_; - my $num_columns = 0; - my $file_width; - my $col; - my $width; - - $width = 20 if (scalar(@columns) == 1); - $width = 10 if (scalar(@columns) == 2); - $width = 8 if (scalar(@columns) > 2); - - foreach $col (@columns) { - my ($heading, $cols) = @{$col}; - - $num_columns += $cols; - } - $file_width = 100 - $num_columns * $width; - - # Table definition - write_html($handle, < - - - - -END_OF_HTML - # Empty first row - foreach $col (@columns) { - my ($heading, $cols) = @{$col}; - - while ($cols-- > 0) { - write_html($handle, < -END_OF_HTML - } - } - # Next row - write_html($handle, < - - - -END_OF_HTML - # Heading row - foreach $col (@columns) { - my ($heading, $cols) = @{$col}; - my $colspan = ""; - - $colspan = " colspan=$cols" if ($cols > 1); - write_html($handle, <$heading -END_OF_HTML - } - write_html($handle, < -END_OF_HTML -} - - -# write_file_table_entry(handle, base_dir, filename, page_link, -# ([ found, hit, med_limit, hi_limit, graph ], ..) -# -# Write an entry of the file table. -# - -sub write_file_table_entry(*$$$@) -{ - my ($handle, $base_dir, $filename, $page_link, @entries) = @_; - my $file_code; - my $entry; - my $esc_filename = escape_html($filename); - - # Add link to source if provided - if (defined($page_link) && $page_link ne "") { - $file_code = "$esc_filename"; - } else { - $file_code = $esc_filename; - } - - # First column: filename - write_html($handle, < - -END_OF_HTML - # Columns as defined - foreach $entry (@entries) { - my ($found, $hit, $med, $hi, $graph) = @{$entry}; - my $bar_graph; - my $class; - my $rate; - - # Generate bar graph if requested - if ($graph) { - $bar_graph = get_bar_graph_code($base_dir, $found, - $hit); - write_html($handle, < - $bar_graph - -END_OF_HTML - } - # Get rate color and text - if ($found == 0) { - $rate = "-"; - $class = "Hi"; - } else { - $rate = rate($hit, $found, " %"); - $class = $rate_name[classify_rate($found, $hit, - $med, $hi)]; - } - write_html($handle, <$rate - -END_OF_HTML - } - # End of row - write_html($handle, < -END_OF_HTML -} - - -# -# write_file_table_detail_entry(filehandle, test_name, ([found, hit], ...)) -# -# Write entry for detail section in file table. -# - -sub write_file_table_detail_entry(*$@) -{ - my ($handle, $test, @entries) = @_; - my $entry; - - if ($test eq "") { - $test = "<unnamed>"; - } elsif ($test =~ /^(.*),diff$/) { - $test = $1." (converted)"; - } - # Testname - write_html($handle, < - -END_OF_HTML - # Test data - foreach $entry (@entries) { - my ($found, $hit) = @{$entry}; - my $rate = rate($hit, $found, " %"); - - write_html($handle, <$rate - -END_OF_HTML - } - - write_html($handle, < - -END_OF_HTML - - # ************************************************************* -} - - -# -# write_file_table_epilog(filehandle) -# -# Write end of file table HTML code. -# - -sub write_file_table_epilog(*) -{ - # ************************************************************* - - write_html($_[0], < - -
- -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_test_table_prolog(filehandle, table_heading) -# -# Write heading for test case description table. -# - -sub write_test_table_prolog(*$) -{ - # ************************************************************* - - write_html($_[0], < -

$file_heading$file_code$hit / $found$test$hit / $found
- - - - - - - - - - - - -

$_[1]
-
-END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_test_table_entry(filehandle, test_name, test_description) -# -# Write entry for the test table. -# - -sub write_test_table_entry(*$$) -{ - # ************************************************************* - - write_html($_[0], <$_[1]  -
$_[2]

-END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_test_table_epilog(filehandle) -# -# Write end of test description table HTML code. -# - -sub write_test_table_epilog(*) -{ - # ************************************************************* - - write_html($_[0], < -
- -
- -END_OF_HTML - ; - - # ************************************************************* -} - - -sub fmt_centered($$) -{ - my ($width, $text) = @_; - my $w0 = length($text); - my $w1 = int(($width - $w0) / 2); - my $w2 = $width - $w0 - $w1; - - return (" "x$w1).$text.(" "x$w2); -} - - -# -# write_source_prolog(filehandle) -# -# Write start of source code table. -# - -sub write_source_prolog(*) -{ - my $lineno_heading = " "; - my $branch_heading = ""; - my $line_heading = fmt_centered($line_field_width, "Line data"); - my $source_heading = " Source code"; - - if ($br_coverage) { - $branch_heading = fmt_centered($br_field_width, "Branch data"). - " "; - } - # ************************************************************* - - write_html($_[0], < - -
- - - -
${lineno_heading}${branch_heading}${line_heading} ${source_heading}
-
-END_OF_HTML
-	;
-
-	# *************************************************************
-}
-
-
-#
-# get_branch_blocks(brdata)
-#
-# Group branches that belong to the same basic block.
-#
-# Returns: [block1, block2, ...]
-# block:   [branch1, branch2, ...]
-# branch:  [block_num, branch_num, taken_count, text_length, open, close]
-#
-
-sub get_branch_blocks($)
-{
-	my ($brdata) = @_;
-	my $last_block_num;
-	my $block = [];
-	my @blocks;
-	my $i;
-	my $num = br_ivec_len($brdata);
-
-	# Group branches
-	for ($i = 0; $i < $num; $i++) {
-		my ($block_num, $branch, $taken) = br_ivec_get($brdata, $i);
-		my $br;
-
-		if (defined($last_block_num) && $block_num != $last_block_num) {
-			push(@blocks, $block);
-			$block = [];
-		}
-		$br = [$block_num, $branch, $taken, 3, 0, 0];
-		push(@{$block}, $br);
-		$last_block_num = $block_num;
-	}
-	push(@blocks, $block) if (scalar(@{$block}) > 0);
-
-	# Add braces to first and last branch in group
-	foreach $block (@blocks) {
-		$block->[0]->[$BR_OPEN] = 1;
-		$block->[0]->[$BR_LEN]++;
-		$block->[scalar(@{$block}) - 1]->[$BR_CLOSE] = 1;
-		$block->[scalar(@{$block}) - 1]->[$BR_LEN]++;
-	}
-
-	return @blocks;
-}
-
-#
-# get_block_len(block)
-#
-# Calculate total text length of all branches in a block of branches.
-#
-
-sub get_block_len($)
-{
-	my ($block) = @_;
-	my $len = 0;
-	my $branch;
-
-	foreach $branch (@{$block}) {
-		$len += $branch->[$BR_LEN];
-	}
-
-	return $len;
-}
-
-
-#
-# get_branch_html(brdata)
-#
-# Return a list of HTML lines which represent the specified branch coverage
-# data in source code view.
-#
-
-sub get_branch_html($)
-{
-	my ($brdata) = @_;
-	my @blocks = get_branch_blocks($brdata);
-	my $block;
-	my $branch;
-	my $line_len = 0;
-	my $line = [];	# [branch2|" ", branch|" ", ...]
-	my @lines;	# [line1, line2, ...]
-	my @result;
-
-	# Distribute blocks to lines
-	foreach $block (@blocks) {
-		my $block_len = get_block_len($block);
-
-		# Does this block fit into the current line?
-		if ($line_len + $block_len <= $br_field_width) {
-			# Add it
-			$line_len += $block_len;
-			push(@{$line}, @{$block});
-			next;
-		} elsif ($block_len <= $br_field_width) {
-			# It would fit if the line was empty - add it to new
-			# line
-			push(@lines, $line);
-			$line_len = $block_len;
-			$line = [ @{$block} ];
-			next;
-		}
-		# Split the block into several lines
-		foreach $branch (@{$block}) {
-			if ($line_len + $branch->[$BR_LEN] >= $br_field_width) {
-				# Start a new line
-				if (($line_len + 1 <= $br_field_width) &&
-				    scalar(@{$line}) > 0 &&
-				    !$line->[scalar(@$line) - 1]->[$BR_CLOSE]) {
-					# Try to align branch symbols to be in
-					# one # row
-					push(@{$line}, " ");
-				}
-				push(@lines, $line);
-				$line_len = 0;
-				$line = [];
-			}
-			push(@{$line}, $branch);
-			$line_len += $branch->[$BR_LEN];
-		}
-	}
-	push(@lines, $line);
-
-	# Convert to HTML
-	foreach $line (@lines) {
-		my $current = "";
-		my $current_len = 0;
-
-		foreach $branch (@$line) {
-			# Skip alignment space
-			if ($branch eq " ") {
-				$current .= " ";
-				$current_len++;
-				next;
-			}
-
-			my ($block_num, $br_num, $taken, $len, $open, $close) =
-			   @{$branch};
-			my $class;
-			my $title;
-			my $text;
-
-			if ($taken eq '-') {
-				$class	= "branchNoExec";
-				$text	= " # ";
-				$title	= "Branch $br_num was not executed";
-			} elsif ($taken == 0) {
-				$class	= "branchNoCov";
-				$text	= " - ";
-				$title	= "Branch $br_num was not taken";
-			} else {
-				$class	= "branchCov";
-				$text	= " + ";
-				$title	= "Branch $br_num was taken $taken ".
-					  "time";
-				$title .= "s" if ($taken > 1);
-			}
-			$current .= "[" if ($open);
-			$current .= "";
-			$current .= $text."";
-			$current .= "]" if ($close);
-			$current_len += $len;
-		}
-
-		# Right-align result text
-		if ($current_len < $br_field_width) {
-			$current = (" "x($br_field_width - $current_len)).
-				   $current;
-		}
-		push(@result, $current);
-	}
-
-	return @result;
-}
-
-
-#
-# format_count(count, width)
-#
-# Return a right-aligned representation of count that fits in width characters.
-#
-
-sub format_count($$)
-{
-	my ($count, $width) = @_;
-	my $result;
-	my $exp;
-
-	$result = sprintf("%*.0f", $width, $count);
-	while (length($result) > $width) {
-		last if ($count < 10);
-		$exp++;
-		$count = int($count/10);
-		$result = sprintf("%*s", $width, ">$count*10^$exp");
-	}
-	return $result;
-}
-
-#
-# write_source_line(filehandle, line_num, source, hit_count, converted,
-#                   brdata, add_anchor)
-#
-# Write formatted source code line. Return a line in a format as needed
-# by gen_png()
-#
-
-sub write_source_line(*$$$$$$)
-{
-	my ($handle, $line, $source, $count, $converted, $brdata,
-	    $add_anchor) = @_;
-	my $source_format;
-	my $count_format;
-	my $result;
-	my $anchor_start = "";
-	my $anchor_end = "";
-	my $count_field_width = $line_field_width - 1;
-	my @br_html;
-	my $html;
-
-	# Get branch HTML data for this line
-	@br_html = get_branch_html($brdata) if ($br_coverage);
-
-	if (!defined($count)) {
-		$result		= "";
-		$source_format	= "";
-		$count_format	= " "x$count_field_width;
-	}
-	elsif ($count == 0) {
-		$result		= $count;
-		$source_format	= '';
-		$count_format	= format_count($count, $count_field_width);
-	}
-	elsif ($converted && defined($highlight)) {
-		$result		= "*".$count;
-		$source_format	= '';
-		$count_format	= format_count($count, $count_field_width);
-	}
-	else {
-		$result		= $count;
-		$source_format	= '';
-		$count_format	= format_count($count, $count_field_width);
-	}
-	$result .= ":".$source;
-
-	# Write out a line number navigation anchor every $nav_resolution
-	# lines if necessary
-	if ($add_anchor)
-	{
-		$anchor_start	= "";
-		$anchor_end	= "";
-	}
-
-
-	# *************************************************************
-
-	$html = $anchor_start;
-	$html .= "".sprintf("%8d", $line)." ";
-	$html .= shift(@br_html).":" if ($br_coverage);
-	$html .= "$source_format$count_format : ";
-	$html .= escape_html($source);
-	$html .= "" if ($source_format);
-	$html .= $anchor_end."\n";
-
-	write_html($handle, $html);
-
-	if ($br_coverage) {
-		# Add lines for overlong branch information
-		foreach (@br_html) {
-			write_html($handle, "".
-				   "         $_\n");
-		}
-	}
-	# *************************************************************
-
-	return($result);
-}
-
-
-#
-# write_source_epilog(filehandle)
-#
-# Write end of source code table.
-#
-
-sub write_source_epilog(*)
-{
-	# *************************************************************
-
-	write_html($_[0], <
-	      
-	    
-	  
-	  
- -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_html_epilog(filehandle, base_dir[, break_frames]) -# -# Write HTML page footer to FILEHANDLE. BREAK_FRAMES should be set when -# this page is embedded in a frameset, clicking the URL link will then -# break this frameset. -# - -sub write_html_epilog(*$;$) -{ - my $basedir = $_[1]; - my $break_code = ""; - my $epilog; - - if (defined($_[2])) - { - $break_code = " target=\"_parent\""; - } - - # ************************************************************* - - write_html($_[0], < - - Generated by: $lcov_version - -
-END_OF_HTML - ; - - $epilog = $html_epilog; - $epilog =~ s/\@basedir\@/$basedir/g; - - write_html($_[0], $epilog); -} - - -# -# write_frameset(filehandle, basedir, basename, pagetitle) -# -# - -sub write_frameset(*$$$) -{ - my $frame_width = $overview_width + 40; - - # ************************************************************* - - write_html($_[0], < - - - - - - $_[3] - - - - - - - - <center>Frames not supported by your browser!<br></center> - - - - -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# sub write_overview_line(filehandle, basename, line, link) -# -# - -sub write_overview_line(*$$$) -{ - my $y1 = $_[2] - 1; - my $y2 = $y1 + $nav_resolution - 1; - my $x2 = $overview_width - 1; - - # ************************************************************* - - write_html($_[0], < -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_overview(filehandle, basedir, basename, pagetitle, lines) -# -# - -sub write_overview(*$$$$) -{ - my $index; - my $max_line = $_[4] - 1; - my $offset; - - # ************************************************************* - - write_html($_[0], < - - - - - $_[3] - - - - - - -END_OF_HTML - ; - - # ************************************************************* - - # Make $offset the next higher multiple of $nav_resolution - $offset = ($nav_offset + $nav_resolution - 1) / $nav_resolution; - $offset = sprintf("%d", $offset ) * $nav_resolution; - - # Create image map for overview image - for ($index = 1; $index <= $_[4]; $index += $nav_resolution) - { - # Enforce nav_offset - if ($index < $offset + 1) - { - write_overview_line($_[0], $_[2], $index, 1); - } - else - { - write_overview_line($_[0], $_[2], $index, $index - $offset); - } - } - - # ************************************************************* - - write_html($_[0], < - -
- Top

- Overview -
- - -END_OF_HTML - ; - - # ************************************************************* -} - - -sub max($$) -{ - my ($a, $b) = @_; - - return $a if ($a > $b); - return $b; -} - - -# -# write_header(filehandle, type, trunc_file_name, rel_file_name, lines_found, -# lines_hit, funcs_found, funcs_hit, sort_type) -# -# Write a complete standard page header. TYPE may be (0, 1, 2, 3, 4) -# corresponding to (directory view header, file view header, source view -# header, test case description header, function view header) -# - -sub write_header(*$$$$$$$$$$) -{ - local *HTML_HANDLE = $_[0]; - my $type = $_[1]; - my $trunc_name = $_[2]; - my $rel_filename = $_[3]; - my $lines_found = $_[4]; - my $lines_hit = $_[5]; - my $fn_found = $_[6]; - my $fn_hit = $_[7]; - my $br_found = $_[8]; - my $br_hit = $_[9]; - my $sort_type = $_[10]; - my $base_dir; - my $view; - my $test; - my $base_name; - my $style; - my $rate; - my @row_left; - my @row_right; - my $num_rows; - my $i; - my $esc_trunc_name = escape_html($trunc_name); - - $base_name = basename($rel_filename); - - # Prepare text for "current view" field - if ($type == $HDR_DIR) - { - # Main overview - $base_dir = ""; - $view = $overview_title; - } - elsif ($type == $HDR_FILE) - { - # Directory overview - $base_dir = get_relative_base_path($rel_filename); - $view = "". - "$overview_title - $esc_trunc_name"; - } - elsif ($type == $HDR_SOURCE || $type == $HDR_FUNC) - { - # File view - my $dir_name = dirname($rel_filename); - my $esc_base_name = escape_html($base_name); - my $esc_dir_name = escape_html($dir_name); - - $base_dir = get_relative_base_path($dir_name); - if ($frames) - { - # Need to break frameset when clicking any of these - # links - $view = "$overview_title - ". - "". - "$esc_dir_name - $esc_base_name"; - } - else - { - $view = "". - "$overview_title - ". - "". - "$esc_dir_name - $esc_base_name"; - } - - # Add function suffix - if ($func_coverage) { - $view .= ""; - if ($type == $HDR_SOURCE) { - if ($sort) { - $view .= " (source / functions)"; - } else { - $view .= " (source / functions)"; - } - } elsif ($type == $HDR_FUNC) { - $view .= " (source / functions)"; - } - $view .= ""; - } - } - elsif ($type == $HDR_TESTDESC) - { - # Test description header - $base_dir = ""; - $view = "". - "$overview_title - test case descriptions"; - } - - # Prepare text for "test" field - $test = escape_html($test_title); - - # Append link to test description page if available - if (%test_description && ($type != $HDR_TESTDESC)) - { - if ($frames && ($type == $HDR_SOURCE || $type == $HDR_FUNC)) - { - # Need to break frameset when clicking this link - $test .= " ( ". - "". - "view descriptions )"; - } - else - { - $test .= " ( ". - "". - "view descriptions )"; - } - } - - # Write header - write_header_prolog(*HTML_HANDLE, $base_dir); - - # Left row - push(@row_left, [[ "10%", "headerItem", "Current view:" ], - [ "35%", "headerValue", $view ]]); - push(@row_left, [[undef, "headerItem", "Test:"], - [undef, "headerValue", $test]]); - push(@row_left, [[undef, "headerItem", "Date:"], - [undef, "headerValue", $date]]); - - # Right row - if ($legend && ($type == $HDR_SOURCE || $type == $HDR_FUNC)) { - my $text = <hit
- not hit -END_OF_HTML - if ($br_coverage) { - $text .= <+
taken - - not taken - # not executed -END_OF_HTML - } - push(@row_left, [[undef, "headerItem", "Legend:"], - [undef, "headerValueLeg", $text]]); - } elsif ($legend && ($type != $HDR_TESTDESC)) { - my $text = <low: < $med_limit % - medium: >= $med_limit % - high: >= $hi_limit % -END_OF_HTML - push(@row_left, [[undef, "headerItem", "Legend:"], - [undef, "headerValueLeg", $text]]); - } - if ($type == $HDR_TESTDESC) { - push(@row_right, [[ "55%" ]]); - } else { - push(@row_right, [["15%", undef, undef ], - ["10%", "headerCovTableHead", "Hit" ], - ["10%", "headerCovTableHead", "Total" ], - ["15%", "headerCovTableHead", "Coverage"]]); - } - # Line coverage - $style = $rate_name[classify_rate($lines_found, $lines_hit, - $med_limit, $hi_limit)]; - $rate = rate($lines_hit, $lines_found, " %"); - push(@row_right, [[undef, "headerItem", "Lines:"], - [undef, "headerCovTableEntry", $lines_hit], - [undef, "headerCovTableEntry", $lines_found], - [undef, "headerCovTableEntry$style", $rate]]) - if ($type != $HDR_TESTDESC); - # Function coverage - if ($func_coverage) { - $style = $rate_name[classify_rate($fn_found, $fn_hit, - $fn_med_limit, $fn_hi_limit)]; - $rate = rate($fn_hit, $fn_found, " %"); - push(@row_right, [[undef, "headerItem", "Functions:"], - [undef, "headerCovTableEntry", $fn_hit], - [undef, "headerCovTableEntry", $fn_found], - [undef, "headerCovTableEntry$style", $rate]]) - if ($type != $HDR_TESTDESC); - } - # Branch coverage - if ($br_coverage) { - $style = $rate_name[classify_rate($br_found, $br_hit, - $br_med_limit, $br_hi_limit)]; - $rate = rate($br_hit, $br_found, " %"); - push(@row_right, [[undef, "headerItem", "Branches:"], - [undef, "headerCovTableEntry", $br_hit], - [undef, "headerCovTableEntry", $br_found], - [undef, "headerCovTableEntry$style", $rate]]) - if ($type != $HDR_TESTDESC); - } - - # Print rows - $num_rows = max(scalar(@row_left), scalar(@row_right)); - for ($i = 0; $i < $num_rows; $i++) { - my $left = $row_left[$i]; - my $right = $row_right[$i]; - - if (!defined($left)) { - $left = [[undef, undef, undef], [undef, undef, undef]]; - } - if (!defined($right)) { - $right = []; - } - write_header_line(*HTML_HANDLE, @{$left}, - [ $i == 0 ? "5%" : undef, undef, undef], - @{$right}); - } - - # Fourth line - write_header_epilog(*HTML_HANDLE, $base_dir); -} - - -# -# get_sorted_keys(hash_ref, sort_type) -# - -sub get_sorted_keys($$) -{ - my ($hash, $type) = @_; - - if ($type == $SORT_FILE) { - # Sort by name - return sort(keys(%{$hash})); - } elsif ($type == $SORT_LINE) { - # Sort by line coverage - return sort({$hash->{$a}[7] <=> $hash->{$b}[7]} keys(%{$hash})); - } elsif ($type == $SORT_FUNC) { - # Sort by function coverage; - return sort({$hash->{$a}[8] <=> $hash->{$b}[8]} keys(%{$hash})); - } elsif ($type == $SORT_BRANCH) { - # Sort by br coverage; - return sort({$hash->{$a}[9] <=> $hash->{$b}[9]} keys(%{$hash})); - } -} - -sub get_sort_code($$$) -{ - my ($link, $alt, $base) = @_; - my $png; - my $link_start; - my $link_end; - - if (!defined($link)) { - $png = "glass.png"; - $link_start = ""; - $link_end = ""; - } else { - $png = "updown.png"; - $link_start = ''; - $link_end = ""; - } - - return ' '.$link_start. - ''.$link_end.''; -} - -sub get_file_code($$$$) -{ - my ($type, $text, $sort_button, $base) = @_; - my $result = $text; - my $link; - - if ($sort_button) { - if ($type == $HEAD_NO_DETAIL) { - $link = "index.$html_ext"; - } else { - $link = "index-detail.$html_ext"; - } - } - $result .= get_sort_code($link, "Sort by name", $base); - - return $result; -} - -sub get_line_code($$$$$) -{ - my ($type, $sort_type, $text, $sort_button, $base) = @_; - my $result = $text; - my $sort_link; - - if ($type == $HEAD_NO_DETAIL) { - # Just text - if ($sort_button) { - $sort_link = "index-sort-l.$html_ext"; - } - } elsif ($type == $HEAD_DETAIL_HIDDEN) { - # Text + link to detail view - $result .= ' ( show details )'; - if ($sort_button) { - $sort_link = "index-sort-l.$html_ext"; - } - } else { - # Text + link to standard view - $result .= ' ( hide details )'; - if ($sort_button) { - $sort_link = "index-detail-sort-l.$html_ext"; - } - } - # Add sort button - $result .= get_sort_code($sort_link, "Sort by line coverage", $base); - - return $result; -} - -sub get_func_code($$$$) -{ - my ($type, $text, $sort_button, $base) = @_; - my $result = $text; - my $link; - - if ($sort_button) { - if ($type == $HEAD_NO_DETAIL) { - $link = "index-sort-f.$html_ext"; - } else { - $link = "index-detail-sort-f.$html_ext"; - } - } - $result .= get_sort_code($link, "Sort by function coverage", $base); - return $result; -} - -sub get_br_code($$$$) -{ - my ($type, $text, $sort_button, $base) = @_; - my $result = $text; - my $link; - - if ($sort_button) { - if ($type == $HEAD_NO_DETAIL) { - $link = "index-sort-b.$html_ext"; - } else { - $link = "index-detail-sort-b.$html_ext"; - } - } - $result .= get_sort_code($link, "Sort by branch coverage", $base); - return $result; -} - -# -# write_file_table(filehandle, base_dir, overview, testhash, testfnchash, -# testbrhash, fileview, sort_type) -# -# Write a complete file table. OVERVIEW is a reference to a hash containing -# the following mapping: -# -# filename -> "lines_found,lines_hit,funcs_found,funcs_hit,page_link, -# func_link" -# -# TESTHASH is a reference to the following hash: -# -# filename -> \%testdata -# %testdata: name of test affecting this file -> \%testcount -# %testcount: line number -> execution count for a single test -# -# Heading of first column is "Filename" if FILEVIEW is true, "Directory name" -# otherwise. -# - -sub write_file_table(*$$$$$$$) -{ - local *HTML_HANDLE = $_[0]; - my $base_dir = $_[1]; - my $overview = $_[2]; - my $testhash = $_[3]; - my $testfnchash = $_[4]; - my $testbrhash = $_[5]; - my $fileview = $_[6]; - my $sort_type = $_[7]; - my $filename; - my $bar_graph; - my $hit; - my $found; - my $fn_found; - my $fn_hit; - my $br_found; - my $br_hit; - my $page_link; - my $testname; - my $testdata; - my $testfncdata; - my $testbrdata; - my %affecting_tests; - my $line_code = ""; - my $func_code; - my $br_code; - my $file_code; - my @head_columns; - - # Determine HTML code for column headings - if (($base_dir ne "") && $show_details) - { - my $detailed = keys(%{$testhash}); - - $file_code = get_file_code($detailed ? $HEAD_DETAIL_HIDDEN : - $HEAD_NO_DETAIL, - $fileview ? "Filename" : "Directory", - $sort && $sort_type != $SORT_FILE, - $base_dir); - $line_code = get_line_code($detailed ? $HEAD_DETAIL_SHOWN : - $HEAD_DETAIL_HIDDEN, - $sort_type, - "Line Coverage", - $sort && $sort_type != $SORT_LINE, - $base_dir); - $func_code = get_func_code($detailed ? $HEAD_DETAIL_HIDDEN : - $HEAD_NO_DETAIL, - "Functions", - $sort && $sort_type != $SORT_FUNC, - $base_dir); - $br_code = get_br_code($detailed ? $HEAD_DETAIL_HIDDEN : - $HEAD_NO_DETAIL, - "Branches", - $sort && $sort_type != $SORT_BRANCH, - $base_dir); - } else { - $file_code = get_file_code($HEAD_NO_DETAIL, - $fileview ? "Filename" : "Directory", - $sort && $sort_type != $SORT_FILE, - $base_dir); - $line_code = get_line_code($HEAD_NO_DETAIL, $sort_type, "Line Coverage", - $sort && $sort_type != $SORT_LINE, - $base_dir); - $func_code = get_func_code($HEAD_NO_DETAIL, "Functions", - $sort && $sort_type != $SORT_FUNC, - $base_dir); - $br_code = get_br_code($HEAD_NO_DETAIL, "Branches", - $sort && $sort_type != $SORT_BRANCH, - $base_dir); - } - push(@head_columns, [ $line_code, 3 ]); - push(@head_columns, [ $func_code, 2]) if ($func_coverage); - push(@head_columns, [ $br_code, 2]) if ($br_coverage); - - write_file_table_prolog(*HTML_HANDLE, $file_code, @head_columns); - - foreach $filename (get_sorted_keys($overview, $sort_type)) - { - my @columns; - ($found, $hit, $fn_found, $fn_hit, $br_found, $br_hit, - $page_link) = @{$overview->{$filename}}; - - # Line coverage - push(@columns, [$found, $hit, $med_limit, $hi_limit, 1]); - # Function coverage - if ($func_coverage) { - push(@columns, [$fn_found, $fn_hit, $fn_med_limit, - $fn_hi_limit, 0]); - } - # Branch coverage - if ($br_coverage) { - push(@columns, [$br_found, $br_hit, $br_med_limit, - $br_hi_limit, 0]); - } - write_file_table_entry(*HTML_HANDLE, $base_dir, $filename, - $page_link, @columns); - - $testdata = $testhash->{$filename}; - $testfncdata = $testfnchash->{$filename}; - $testbrdata = $testbrhash->{$filename}; - - # Check whether we should write test specific coverage - # as well - if (!($show_details && $testdata)) { next; } - - # Filter out those tests that actually affect this file - %affecting_tests = %{ get_affecting_tests($testdata, - $testfncdata, $testbrdata) }; - - # Does any of the tests affect this file at all? - if (!%affecting_tests) { next; } - - foreach $testname (keys(%affecting_tests)) - { - my @results; - ($found, $hit, $fn_found, $fn_hit, $br_found, $br_hit) = - split(",", $affecting_tests{$testname}); - - # Insert link to description of available - if ($test_description{$testname}) - { - $testname = "". - "$testname"; - } - - push(@results, [$found, $hit]); - push(@results, [$fn_found, $fn_hit]) if ($func_coverage); - push(@results, [$br_found, $br_hit]) if ($br_coverage); - write_file_table_detail_entry(*HTML_HANDLE, $testname, - @results); - } - } - - write_file_table_epilog(*HTML_HANDLE); -} - - -# -# get_found_and_hit(hash) -# -# Return the count for entries (found) and entries with an execution count -# greater than zero (hit) in a hash (linenumber -> execution count) as -# a list (found, hit) -# - -sub get_found_and_hit($) -{ - my %hash = %{$_[0]}; - my $found = 0; - my $hit = 0; - - # Calculate sum - $found = 0; - $hit = 0; - - foreach (keys(%hash)) - { - $found++; - if ($hash{$_}>0) { $hit++; } - } - - return ($found, $hit); -} - - -# -# get_func_found_and_hit(sumfnccount) -# -# Return (f_found, f_hit) for sumfnccount -# - -sub get_func_found_and_hit($) -{ - my ($sumfnccount) = @_; - my $function; - my $fn_found; - my $fn_hit; - - $fn_found = scalar(keys(%{$sumfnccount})); - $fn_hit = 0; - foreach $function (keys(%{$sumfnccount})) { - if ($sumfnccount->{$function} > 0) { - $fn_hit++; - } - } - return ($fn_found, $fn_hit); -} - - -# -# br_taken_to_num(taken) -# -# Convert a branch taken value .info format to number format. -# - -sub br_taken_to_num($) -{ - my ($taken) = @_; - - return 0 if ($taken eq '-'); - return $taken + 1; -} - - -# -# br_num_to_taken(taken) -# -# Convert a branch taken value in number format to .info format. -# - -sub br_num_to_taken($) -{ - my ($taken) = @_; - - return '-' if ($taken == 0); - return $taken - 1; -} - - -# -# br_taken_add(taken1, taken2) -# -# Return the result of taken1 + taken2 for 'branch taken' values. -# - -sub br_taken_add($$) -{ - my ($t1, $t2) = @_; - - return $t1 if (!defined($t2)); - return $t2 if (!defined($t1)); - return $t1 if ($t2 eq '-'); - return $t2 if ($t1 eq '-'); - return $t1 + $t2; -} - - -# -# br_taken_sub(taken1, taken2) -# -# Return the result of taken1 - taken2 for 'branch taken' values. Return 0 -# if the result would become negative. -# - -sub br_taken_sub($$) -{ - my ($t1, $t2) = @_; - - return $t1 if (!defined($t2)); - return undef if (!defined($t1)); - return $t1 if ($t1 eq '-'); - return $t1 if ($t2 eq '-'); - return 0 if $t2 > $t1; - return $t1 - $t2; -} - - -# -# br_ivec_len(vector) -# -# Return the number of entries in the branch coverage vector. -# - -sub br_ivec_len($) -{ - my ($vec) = @_; - - return 0 if (!defined($vec)); - return (length($vec) * 8 / $BR_VEC_WIDTH) / $BR_VEC_ENTRIES; -} - - -# -# br_ivec_get(vector, number) -# -# Return an entry from the branch coverage vector. -# - -sub br_ivec_get($$) -{ - my ($vec, $num) = @_; - my $block; - my $branch; - my $taken; - my $offset = $num * $BR_VEC_ENTRIES; - - # Retrieve data from vector - $block = vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH); - $block = -1 if ($block == $BR_VEC_MAX); - $branch = vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH); - $taken = vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH); - - # Decode taken value from an integer - $taken = br_num_to_taken($taken); - - return ($block, $branch, $taken); -} - - -# -# br_ivec_push(vector, block, branch, taken) -# -# Add an entry to the branch coverage vector. If an entry with the same -# branch ID already exists, add the corresponding taken values. -# - -sub br_ivec_push($$$$) -{ - my ($vec, $block, $branch, $taken) = @_; - my $offset; - my $num = br_ivec_len($vec); - my $i; - - $vec = "" if (!defined($vec)); - $block = $BR_VEC_MAX if $block < 0; - - # Check if branch already exists in vector - for ($i = 0; $i < $num; $i++) { - my ($v_block, $v_branch, $v_taken) = br_ivec_get($vec, $i); - $v_block = $BR_VEC_MAX if $v_block < 0; - - next if ($v_block != $block || $v_branch != $branch); - - # Add taken counts - $taken = br_taken_add($taken, $v_taken); - last; - } - - $offset = $i * $BR_VEC_ENTRIES; - $taken = br_taken_to_num($taken); - - # Add to vector - vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH) = $block; - vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH) = $branch; - vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH) = $taken; - - return $vec; -} - - -# -# get_br_found_and_hit(sumbrcount) -# -# Return (br_found, br_hit) for sumbrcount -# - -sub get_br_found_and_hit($) -{ - my ($sumbrcount) = @_; - my $line; - my $br_found = 0; - my $br_hit = 0; - - foreach $line (keys(%{$sumbrcount})) { - my $brdata = $sumbrcount->{$line}; - my $i; - my $num = br_ivec_len($brdata); - - for ($i = 0; $i < $num; $i++) { - my $taken; - - (undef, undef, $taken) = br_ivec_get($brdata, $i); - - $br_found++; - $br_hit++ if ($taken ne "-" && $taken > 0); - } - } - - return ($br_found, $br_hit); -} - - -# -# get_affecting_tests(testdata, testfncdata, testbrdata) -# -# HASHREF contains a mapping filename -> (linenumber -> exec count). Return -# a hash containing mapping filename -> "lines found, lines hit" for each -# filename which has a nonzero hit count. -# - -sub get_affecting_tests($$$) -{ - my ($testdata, $testfncdata, $testbrdata) = @_; - my $testname; - my $testcount; - my $testfnccount; - my $testbrcount; - my %result; - my $found; - my $hit; - my $fn_found; - my $fn_hit; - my $br_found; - my $br_hit; - - foreach $testname (keys(%{$testdata})) - { - # Get (line number -> count) hash for this test case - $testcount = $testdata->{$testname}; - $testfnccount = $testfncdata->{$testname}; - $testbrcount = $testbrdata->{$testname}; - - # Calculate sum - ($found, $hit) = get_found_and_hit($testcount); - ($fn_found, $fn_hit) = get_func_found_and_hit($testfnccount); - ($br_found, $br_hit) = get_br_found_and_hit($testbrcount); - - if ($hit>0) - { - $result{$testname} = "$found,$hit,$fn_found,$fn_hit,". - "$br_found,$br_hit"; - } - } - - return(\%result); -} - - -sub get_hash_reverse($) -{ - my ($hash) = @_; - my %result; - - foreach (keys(%{$hash})) { - $result{$hash->{$_}} = $_; - } - - return \%result; -} - -# -# write_source(filehandle, source_filename, count_data, checksum_data, -# converted_data, func_data, sumbrcount) -# -# Write an HTML view of a source code file. Returns a list containing -# data as needed by gen_png(). -# -# Die on error. -# - -sub write_source($$$$$$$) -{ - local *HTML_HANDLE = $_[0]; - local *SOURCE_HANDLE; - my $source_filename = $_[1]; - my %count_data; - my $line_number; - my @result; - my $checkdata = $_[3]; - my $converted = $_[4]; - my $funcdata = $_[5]; - my $sumbrcount = $_[6]; - my $datafunc = get_hash_reverse($funcdata); - my $add_anchor; - my @file; - - if ($_[2]) - { - %count_data = %{$_[2]}; - } - - if (!open(SOURCE_HANDLE, "<", $source_filename)) { - my @lines; - my $last_line = 0; - - if (!$ignore[$ERROR_SOURCE]) { - die("ERROR: cannot read $source_filename\n"); - } - - # Continue without source file - warn("WARNING: cannot read $source_filename!\n"); - - @lines = sort( { $a <=> $b } keys(%count_data)); - if (@lines) { - $last_line = $lines[scalar(@lines) - 1]; - } - return ( ":" ) if ($last_line < 1); - - # Simulate gcov behavior - for ($line_number = 1; $line_number <= $last_line; - $line_number++) { - push(@file, "/* EOF */"); - } - } else { - @file = ; - } - - write_source_prolog(*HTML_HANDLE); - $line_number = 0; - foreach (@file) { - $line_number++; - chomp($_); - - # Also remove CR from line-end - s/\015$//; - - # Source code matches coverage data? - if (defined($checkdata->{$line_number}) && - ($checkdata->{$line_number} ne md5_base64($_))) - { - die("ERROR: checksum mismatch at $source_filename:". - "$line_number\n"); - } - - $add_anchor = 0; - if ($frames) { - if (($line_number - 1) % $nav_resolution == 0) { - $add_anchor = 1; - } - } - if ($func_coverage) { - if ($line_number == 1) { - $add_anchor = 1; - } elsif (defined($datafunc->{$line_number + - $func_offset})) { - $add_anchor = 1; - } - } - push (@result, - write_source_line(HTML_HANDLE, $line_number, - $_, $count_data{$line_number}, - $converted->{$line_number}, - $sumbrcount->{$line_number}, $add_anchor)); - } - - close(SOURCE_HANDLE); - write_source_epilog(*HTML_HANDLE); - return(@result); -} - - -sub funcview_get_func_code($$$) -{ - my ($name, $base, $type) = @_; - my $result; - my $link; - - if ($sort && $type == 1) { - $link = "$name.func.$html_ext"; - } - $result = "Function Name"; - $result .= get_sort_code($link, "Sort by function name", $base); - - return $result; -} - -sub funcview_get_count_code($$$) -{ - my ($name, $base, $type) = @_; - my $result; - my $link; - - if ($sort && $type == 0) { - $link = "$name.func-sort-c.$html_ext"; - } - $result = "Hit count"; - $result .= get_sort_code($link, "Sort by hit count", $base); - - return $result; -} - -# -# funcview_get_sorted(funcdata, sumfncdata, sort_type) -# -# Depending on the value of sort_type, return a list of functions sorted -# by name (type 0) or by the associated call count (type 1). -# - -sub funcview_get_sorted($$$) -{ - my ($funcdata, $sumfncdata, $type) = @_; - - if ($type == 0) { - return sort(keys(%{$funcdata})); - } - return sort({ - $sumfncdata->{$b} == $sumfncdata->{$a} ? - $a cmp $b : $sumfncdata->{$a} <=> $sumfncdata->{$b} - } keys(%{$sumfncdata})); -} - -# -# write_function_table(filehandle, source_file, sumcount, funcdata, -# sumfnccount, testfncdata, sumbrcount, testbrdata, -# base_name, base_dir, sort_type) -# -# Write an HTML table listing all functions in a source file, including -# also function call counts and line coverages inside of each function. -# -# Die on error. -# - -sub write_function_table(*$$$$$$$$$$) -{ - local *HTML_HANDLE = $_[0]; - my $source = $_[1]; - my $sumcount = $_[2]; - my $funcdata = $_[3]; - my $sumfncdata = $_[4]; - my $testfncdata = $_[5]; - my $sumbrcount = $_[6]; - my $testbrdata = $_[7]; - my $name = $_[8]; - my $base = $_[9]; - my $type = $_[10]; - my $func; - my $func_code; - my $count_code; - - # Get HTML code for headings - $func_code = funcview_get_func_code($name, $base, $type); - $count_code = funcview_get_count_code($name, $base, $type); - write_html(*HTML_HANDLE, < - - - - - - -END_OF_HTML - ; - - # Get a sorted table - foreach $func (funcview_get_sorted($funcdata, $sumfncdata, $type)) { - if (!defined($funcdata->{$func})) - { - next; - } - - my $startline = $funcdata->{$func} - $func_offset; - my $name = $func; - my $count = $sumfncdata->{$name}; - my $countstyle; - - # Escape special characters - $name = escape_html($name); - if ($startline < 1) { - $startline = 1; - } - if ($count == 0) { - $countstyle = "coverFnLo"; - } else { - $countstyle = "coverFnHi"; - } - - write_html(*HTML_HANDLE, < - - - -END_OF_HTML - ; - } - write_html(*HTML_HANDLE, < -
- -END_OF_HTML - ; -} - - -# -# info(printf_parameter) -# -# Use printf to write PRINTF_PARAMETER to stdout only when the $quiet flag -# is not set. -# - -sub info(@) -{ - if (!$quiet) - { - # Print info string - printf(@_); - } -} - - -# -# subtract_counts(data_ref, base_ref) -# - -sub subtract_counts($$) -{ - my %data = %{$_[0]}; - my %base = %{$_[1]}; - my $line; - my $data_count; - my $base_count; - my $hit = 0; - my $found = 0; - - foreach $line (keys(%data)) - { - $found++; - $data_count = $data{$line}; - $base_count = $base{$line}; - - if (defined($base_count)) - { - $data_count -= $base_count; - - # Make sure we don't get negative numbers - if ($data_count<0) { $data_count = 0; } - } - - $data{$line} = $data_count; - if ($data_count > 0) { $hit++; } - } - - return (\%data, $found, $hit); -} - - -# -# subtract_fnccounts(data, base) -# -# Subtract function call counts found in base from those in data. -# Return (data, f_found, f_hit). -# - -sub subtract_fnccounts($$) -{ - my %data; - my %base; - my $func; - my $data_count; - my $base_count; - my $fn_hit = 0; - my $fn_found = 0; - - %data = %{$_[0]} if (defined($_[0])); - %base = %{$_[1]} if (defined($_[1])); - foreach $func (keys(%data)) { - $fn_found++; - $data_count = $data{$func}; - $base_count = $base{$func}; - - if (defined($base_count)) { - $data_count -= $base_count; - - # Make sure we don't get negative numbers - if ($data_count < 0) { - $data_count = 0; - } - } - - $data{$func} = $data_count; - if ($data_count > 0) { - $fn_hit++; - } - } - - return (\%data, $fn_found, $fn_hit); -} - - -# -# apply_baseline(data_ref, baseline_ref) -# -# Subtract the execution counts found in the baseline hash referenced by -# BASELINE_REF from actual data in DATA_REF. -# - -sub apply_baseline($$) -{ - my %data_hash = %{$_[0]}; - my %base_hash = %{$_[1]}; - my $filename; - my $testname; - my $data; - my $data_testdata; - my $data_funcdata; - my $data_checkdata; - my $data_testfncdata; - my $data_testbrdata; - my $data_count; - my $data_testfnccount; - my $data_testbrcount; - my $base; - my $base_checkdata; - my $base_sumfnccount; - my $base_sumbrcount; - my $base_count; - my $sumcount; - my $sumfnccount; - my $sumbrcount; - my $found; - my $hit; - my $fn_found; - my $fn_hit; - my $br_found; - my $br_hit; - - foreach $filename (keys(%data_hash)) - { - # Get data set for data and baseline - $data = $data_hash{$filename}; - $base = $base_hash{$filename}; - - # Skip data entries for which no base entry exists - if (!defined($base)) - { - next; - } - - # Get set entries for data and baseline - ($data_testdata, undef, $data_funcdata, $data_checkdata, - $data_testfncdata, undef, $data_testbrdata) = - get_info_entry($data); - (undef, $base_count, undef, $base_checkdata, undef, - $base_sumfnccount, undef, $base_sumbrcount) = - get_info_entry($base); - - # Check for compatible checksums - merge_checksums($data_checkdata, $base_checkdata, $filename); - - # sumcount has to be calculated anew - $sumcount = {}; - $sumfnccount = {}; - $sumbrcount = {}; - - # For each test case, subtract test specific counts - foreach $testname (keys(%{$data_testdata})) - { - # Get counts of both data and baseline - $data_count = $data_testdata->{$testname}; - $data_testfnccount = $data_testfncdata->{$testname}; - $data_testbrcount = $data_testbrdata->{$testname}; - - ($data_count, undef, $hit) = - subtract_counts($data_count, $base_count); - ($data_testfnccount) = - subtract_fnccounts($data_testfnccount, - $base_sumfnccount); - ($data_testbrcount) = - combine_brcount($data_testbrcount, - $base_sumbrcount, $BR_SUB); - - - # Check whether this test case did hit any line at all - if ($hit > 0) - { - # Write back resulting hash - $data_testdata->{$testname} = $data_count; - $data_testfncdata->{$testname} = - $data_testfnccount; - $data_testbrdata->{$testname} = - $data_testbrcount; - } - else - { - # Delete test case which did not impact this - # file - delete($data_testdata->{$testname}); - delete($data_testfncdata->{$testname}); - delete($data_testbrdata->{$testname}); - } - - # Add counts to sum of counts - ($sumcount, $found, $hit) = - add_counts($sumcount, $data_count); - ($sumfnccount, $fn_found, $fn_hit) = - add_fnccount($sumfnccount, $data_testfnccount); - ($sumbrcount, $br_found, $br_hit) = - combine_brcount($sumbrcount, $data_testbrcount, - $BR_ADD); - } - - # Write back resulting entry - set_info_entry($data, $data_testdata, $sumcount, $data_funcdata, - $data_checkdata, $data_testfncdata, $sumfnccount, - $data_testbrdata, $sumbrcount, $found, $hit, - $fn_found, $fn_hit, $br_found, $br_hit); - - $data_hash{$filename} = $data; - } - - return (\%data_hash); -} - - -# -# remove_unused_descriptions() -# -# Removes all test descriptions from the global hash %test_description which -# are not present in %info_data. -# - -sub remove_unused_descriptions() -{ - my $filename; # The current filename - my %test_list; # Hash containing found test names - my $test_data; # Reference to hash test_name -> count_data - my $before; # Initial number of descriptions - my $after; # Remaining number of descriptions - - $before = scalar(keys(%test_description)); - - foreach $filename (keys(%info_data)) - { - ($test_data) = get_info_entry($info_data{$filename}); - foreach (keys(%{$test_data})) - { - $test_list{$_} = ""; - } - } - - # Remove descriptions for tests which are not in our list - foreach (keys(%test_description)) - { - if (!defined($test_list{$_})) - { - delete($test_description{$_}); - } - } - - $after = scalar(keys(%test_description)); - if ($after < $before) - { - info("Removed ".($before - $after). - " unused descriptions, $after remaining.\n"); - } -} - - -# -# apply_prefix(filename, prefix) -# -# If FILENAME begins with PREFIX, remove PREFIX from FILENAME and return -# resulting string, otherwise return FILENAME. -# - -sub apply_prefix($$) -{ - my $filename = $_[0]; - my $prefix = $_[1]; - - if (defined($prefix) && ($prefix ne "")) - { - if ($filename =~ /^\Q$prefix\E\/(.*)$/) - { - return substr($filename, length($prefix) + 1); - } - } - - return $filename; -} - - -# -# system_no_output(mode, parameters) -# -# Call an external program using PARAMETERS while suppressing depending on -# the value of MODE: -# -# MODE & 1: suppress STDOUT -# MODE & 2: suppress STDERR -# -# Return 0 on success, non-zero otherwise. -# - -sub system_no_output($@) -{ - my $mode = shift; - my $result; - local *OLD_STDERR; - local *OLD_STDOUT; - - # Save old stdout and stderr handles - ($mode & 1) && open(OLD_STDOUT, ">>&", "STDOUT"); - ($mode & 2) && open(OLD_STDERR, ">>&", "STDERR"); - - # Redirect to /dev/null - ($mode & 1) && open(STDOUT, ">", "/dev/null"); - ($mode & 2) && open(STDERR, ">", "/dev/null"); - - system(@_); - $result = $?; - - # Close redirected handles - ($mode & 1) && close(STDOUT); - ($mode & 2) && close(STDERR); - - # Restore old handles - ($mode & 1) && open(STDOUT, ">>&", "OLD_STDOUT"); - ($mode & 2) && open(STDERR, ">>&", "OLD_STDERR"); - - return $result; -} - - -# -# read_config(filename) -# -# Read configuration file FILENAME and return a reference to a hash containing -# all valid key=value pairs found. -# - -sub read_config($) -{ - my $filename = $_[0]; - my %result; - my $key; - my $value; - local *HANDLE; - - if (!open(HANDLE, "<", $filename)) - { - warn("WARNING: cannot read configuration file $filename\n"); - return undef; - } - while () - { - chomp; - # Skip comments - s/#.*//; - # Remove leading blanks - s/^\s+//; - # Remove trailing blanks - s/\s+$//; - next unless length; - ($key, $value) = split(/\s*=\s*/, $_, 2); - if (defined($key) && defined($value)) - { - $result{$key} = $value; - } - else - { - warn("WARNING: malformed statement in line $. ". - "of configuration file $filename\n"); - } - } - close(HANDLE); - return \%result; -} - - -# -# apply_config(REF) -# -# REF is a reference to a hash containing the following mapping: -# -# key_string => var_ref -# -# where KEY_STRING is a keyword and VAR_REF is a reference to an associated -# variable. If the global configuration hashes CONFIG or OPT_RC contain a value -# for keyword KEY_STRING, VAR_REF will be assigned the value for that keyword. -# - -sub apply_config($) -{ - my $ref = $_[0]; - - foreach (keys(%{$ref})) - { - if (defined($opt_rc{$_})) { - ${$ref->{$_}} = $opt_rc{$_}; - } elsif (defined($config->{$_})) { - ${$ref->{$_}} = $config->{$_}; - } - } -} - - -# -# get_html_prolog(FILENAME) -# -# If FILENAME is defined, return contents of file. Otherwise return default -# HTML prolog. Die on error. -# - -sub get_html_prolog($) -{ - my $filename = $_[0]; - my $result = ""; - - if (defined($filename)) - { - local *HANDLE; - - open(HANDLE, "<", $filename) - or die("ERROR: cannot open html prolog $filename!\n"); - while () - { - $result .= $_; - } - close(HANDLE); - } - else - { - $result = < - - - - - - \@pagetitle\@ - - - - - -END_OF_HTML - ; - } - - return $result; -} - - -# -# get_html_epilog(FILENAME) -# -# If FILENAME is defined, return contents of file. Otherwise return default -# HTML epilog. Die on error. -# -sub get_html_epilog($) -{ - my $filename = $_[0]; - my $result = ""; - - if (defined($filename)) - { - local *HANDLE; - - open(HANDLE, "<", $filename) - or die("ERROR: cannot open html epilog $filename!\n"); - while () - { - $result .= $_; - } - close(HANDLE); - } - else - { - $result = < - -END_OF_HTML - ; - } - - return $result; - -} - -sub warn_handler($) -{ - my ($msg) = @_; - - warn("$tool_name: $msg"); -} - -sub die_handler($) -{ - my ($msg) = @_; - - die("$tool_name: $msg"); -} - -# -# parse_ignore_errors(@ignore_errors) -# -# Parse user input about which errors to ignore. -# - -sub parse_ignore_errors(@) -{ - my (@ignore_errors) = @_; - my @items; - my $item; - - return if (!@ignore_errors); - - foreach $item (@ignore_errors) { - $item =~ s/\s//g; - if ($item =~ /,/) { - # Split and add comma-separated parameters - push(@items, split(/,/, $item)); - } else { - # Add single parameter - push(@items, $item); - } - } - foreach $item (@items) { - my $item_id = $ERROR_ID{lc($item)}; - - if (!defined($item_id)) { - die("ERROR: unknown argument for --ignore-errors: ". - "$item\n"); - } - $ignore[$item_id] = 1; - } -} - -# -# rate(hit, found[, suffix, precision, width]) -# -# Return the coverage rate [0..100] for HIT and FOUND values. 0 is only -# returned when HIT is 0. 100 is only returned when HIT equals FOUND. -# PRECISION specifies the precision of the result. SUFFIX defines a -# string that is appended to the result if FOUND is non-zero. Spaces -# are added to the start of the resulting string until it is at least WIDTH -# characters wide. -# - -sub rate($$;$$$) -{ - my ($hit, $found, $suffix, $precision, $width) = @_; - my $rate; - - # Assign defaults if necessary - $precision = 1 if (!defined($precision)); - $suffix = "" if (!defined($suffix)); - $width = 0 if (!defined($width)); - - return sprintf("%*s", $width, "-") if (!defined($found) || $found == 0); - $rate = sprintf("%.*f", $precision, $hit * 100 / $found); - - # Adjust rates if necessary - if ($rate == 0 && $hit > 0) { - $rate = sprintf("%.*f", $precision, 1 / 10 ** $precision); - } elsif ($rate == 100 && $hit != $found) { - $rate = sprintf("%.*f", $precision, 100 - 1 / 10 ** $precision); - } - - return sprintf("%*s", $width, $rate.$suffix); -} diff --git a/utils/lcov-1.11/bin/geninfo b/utils/lcov-1.11/bin/geninfo deleted file mode 100755 index 1f029632..00000000 --- a/utils/lcov-1.11/bin/geninfo +++ /dev/null @@ -1,3755 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (c) International Business Machines Corp., 2002,2012 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# geninfo -# -# This script generates .info files from data files as created by code -# instrumented with gcc's built-in profiling mechanism. Call it with -# --help and refer to the geninfo man page to get information on usage -# and available options. -# -# -# Authors: -# 2002-08-23 created by Peter Oberparleiter -# IBM Lab Boeblingen -# based on code by Manoj Iyer and -# Megan Bock -# IBM Austin -# 2002-09-05 / Peter Oberparleiter: implemented option that allows file list -# 2003-04-16 / Peter Oberparleiter: modified read_gcov so that it can also -# parse the new gcov format which is to be introduced in gcc 3.3 -# 2003-04-30 / Peter Oberparleiter: made info write to STDERR, not STDOUT -# 2003-07-03 / Peter Oberparleiter: added line checksum support, added -# --no-checksum -# 2003-09-18 / Nigel Hinds: capture branch coverage data from GCOV -# 2003-12-11 / Laurent Deniel: added --follow option -# workaround gcov (<= 3.2.x) bug with empty .da files -# 2004-01-03 / Laurent Deniel: Ignore empty .bb files -# 2004-02-16 / Andreas Krebbel: Added support for .gcno/.gcda files and -# gcov versioning -# 2004-08-09 / Peter Oberparleiter: added configuration file support -# 2008-07-14 / Tom Zoerner: added --function-coverage command line option -# 2008-08-13 / Peter Oberparleiter: modified function coverage -# implementation (now enabled per default) -# - -use strict; -use File::Basename; -use File::Spec::Functions qw /abs2rel catdir file_name_is_absolute splitdir - splitpath catpath/; -use Getopt::Long; -use Digest::MD5 qw(md5_base64); -if( $^O eq "msys" ) -{ - require File::Spec::Win32; -} - -# Constants -our $lcov_version = 'LCOV version 1.11'; -our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; -our $gcov_tool = "gcov"; -our $tool_name = basename($0); - -our $GCOV_VERSION_4_7_0 = 0x40700; -our $GCOV_VERSION_3_4_0 = 0x30400; -our $GCOV_VERSION_3_3_0 = 0x30300; -our $GCNO_FUNCTION_TAG = 0x01000000; -our $GCNO_LINES_TAG = 0x01450000; -our $GCNO_FILE_MAGIC = 0x67636e6f; -our $BBG_FILE_MAGIC = 0x67626267; - -# Error classes which users may specify to ignore during processing -our $ERROR_GCOV = 0; -our $ERROR_SOURCE = 1; -our $ERROR_GRAPH = 2; -our %ERROR_ID = ( - "gcov" => $ERROR_GCOV, - "source" => $ERROR_SOURCE, - "graph" => $ERROR_GRAPH, -); - -our $EXCL_START = "LCOV_EXCL_START"; -our $EXCL_STOP = "LCOV_EXCL_STOP"; -our $EXCL_LINE = "LCOV_EXCL_LINE"; - -# Marker to exclude branch coverage but keep function and line coveage -our $EXCL_BR_START = "LCOV_EXCL_BR_START"; -our $EXCL_BR_STOP = "LCOV_EXCL_BR_STOP"; -our $EXCL_BR_LINE = "LCOV_EXCL_BR_LINE"; - -# Compatibility mode values -our $COMPAT_VALUE_OFF = 0; -our $COMPAT_VALUE_ON = 1; -our $COMPAT_VALUE_AUTO = 2; - -# Compatibility mode value names -our %COMPAT_NAME_TO_VALUE = ( - "off" => $COMPAT_VALUE_OFF, - "on" => $COMPAT_VALUE_ON, - "auto" => $COMPAT_VALUE_AUTO, -); - -# Compatiblity modes -our $COMPAT_MODE_LIBTOOL = 1 << 0; -our $COMPAT_MODE_HAMMER = 1 << 1; -our $COMPAT_MODE_SPLIT_CRC = 1 << 2; - -# Compatibility mode names -our %COMPAT_NAME_TO_MODE = ( - "libtool" => $COMPAT_MODE_LIBTOOL, - "hammer" => $COMPAT_MODE_HAMMER, - "split_crc" => $COMPAT_MODE_SPLIT_CRC, - "android_4_4_0" => $COMPAT_MODE_SPLIT_CRC, -); - -# Map modes to names -our %COMPAT_MODE_TO_NAME = ( - $COMPAT_MODE_LIBTOOL => "libtool", - $COMPAT_MODE_HAMMER => "hammer", - $COMPAT_MODE_SPLIT_CRC => "split_crc", -); - -# Compatibility mode default values -our %COMPAT_MODE_DEFAULTS = ( - $COMPAT_MODE_LIBTOOL => $COMPAT_VALUE_ON, - $COMPAT_MODE_HAMMER => $COMPAT_VALUE_AUTO, - $COMPAT_MODE_SPLIT_CRC => $COMPAT_VALUE_AUTO, -); - -# Compatibility mode auto-detection routines -sub compat_hammer_autodetect(); -our %COMPAT_MODE_AUTO = ( - $COMPAT_MODE_HAMMER => \&compat_hammer_autodetect, - $COMPAT_MODE_SPLIT_CRC => 1, # will be done later -); - -our $BR_LINE = 0; -our $BR_BLOCK = 1; -our $BR_BRANCH = 2; -our $BR_TAKEN = 3; -our $BR_VEC_ENTRIES = 4; -our $BR_VEC_WIDTH = 32; -our $BR_VEC_MAX = vec(pack('b*', 1 x $BR_VEC_WIDTH), 0, $BR_VEC_WIDTH); - -our $UNNAMED_BLOCK = -1; - -# Prototypes -sub print_usage(*); -sub gen_info($); -sub process_dafile($$); -sub match_filename($@); -sub solve_ambiguous_match($$$); -sub split_filename($); -sub solve_relative_path($$); -sub read_gcov_header($); -sub read_gcov_file($); -sub info(@); -sub get_gcov_version(); -sub system_no_output($@); -sub read_config($); -sub apply_config($); -sub get_exclusion_data($); -sub apply_exclusion_data($$); -sub process_graphfile($$); -sub filter_fn_name($); -sub warn_handler($); -sub die_handler($); -sub graph_error($$); -sub graph_expect($); -sub graph_read(*$;$$); -sub graph_skip(*$;$); -sub sort_uniq(@); -sub sort_uniq_lex(@); -sub graph_cleanup($); -sub graph_find_base($); -sub graph_from_bb($$$); -sub graph_add_order($$$); -sub read_bb_word(*;$); -sub read_bb_value(*;$); -sub read_bb_string(*$); -sub read_bb($); -sub read_bbg_word(*;$); -sub read_bbg_value(*;$); -sub read_bbg_string(*); -sub read_bbg_lines_record(*$$$$$); -sub read_bbg($); -sub read_gcno_word(*;$$); -sub read_gcno_value(*$;$$); -sub read_gcno_string(*$); -sub read_gcno_lines_record(*$$$$$$); -sub determine_gcno_split_crc($$$); -sub read_gcno_function_record(*$$$$); -sub read_gcno($); -sub get_gcov_capabilities(); -sub get_overall_line($$$$); -sub print_overall_rate($$$$$$$$$); -sub br_gvec_len($); -sub br_gvec_get($$); -sub debug($); -sub int_handler(); -sub parse_ignore_errors(@); -sub is_external($); -sub compat_name($); -sub parse_compat_modes($); -sub is_compat($); -sub is_compat_auto($); - - -# Global variables -our $gcov_version; -our $gcov_version_string; -our $graph_file_extension; -our $data_file_extension; -our @data_directory; -our $test_name = ""; -our $quiet; -our $help; -our $output_filename; -our $base_directory; -our $version; -our $follow; -our $checksum; -our $no_checksum; -our $opt_compat_libtool; -our $opt_no_compat_libtool; -our $rc_adjust_src_path;# Regexp specifying parts to remove from source path -our $adjust_src_pattern; -our $adjust_src_replace; -our $adjust_testname; -our $config; # Configuration file contents -our @ignore_errors; # List of errors to ignore (parameter) -our @ignore; # List of errors to ignore (array) -our $initial; -our $no_recursion = 0; -our $maxdepth; -our $no_markers = 0; -our $opt_derive_func_data = 0; -our $opt_external = 1; -our $opt_no_external; -our $debug = 0; -our $gcov_caps; -our @gcov_options; -our @internal_dirs; -our $opt_config_file; -our $opt_gcov_all_blocks = 1; -our $opt_compat; -our %opt_rc; -our %compat_value; -our $gcno_split_crc; -our $func_coverage = 1; -our $br_coverage = 0; -our $rc_auto_base = 1; - -our $cwd = `pwd`; -chomp($cwd); - - -# -# Code entry point -# - -# Register handler routine to be called when interrupted -$SIG{"INT"} = \&int_handler; -$SIG{__WARN__} = \&warn_handler; -$SIG{__DIE__} = \&die_handler; - -# Prettify version string -$lcov_version =~ s/\$\s*Revision\s*:?\s*(\S+)\s*\$/$1/; - -# Set LC_ALL so that gcov output will be in a unified format -$ENV{"LC_ALL"} = "C"; - -# Check command line for a configuration file name -Getopt::Long::Configure("pass_through", "no_auto_abbrev"); -GetOptions("config-file=s" => \$opt_config_file, - "rc=s%" => \%opt_rc); -Getopt::Long::Configure("default"); - -# Remove spaces around rc options -while (my ($key, $value) = each(%opt_rc)) { - delete($opt_rc{$key}); - - $key =~ s/^\s+|\s+$//g; - $value =~ s/^\s+|\s+$//g; - - $opt_rc{$key} = $value; -} - -# Read configuration file if available -if (defined($opt_config_file)) { - $config = read_config($opt_config_file); -} elsif (defined($ENV{"HOME"}) && (-r $ENV{"HOME"}."/.lcovrc")) -{ - $config = read_config($ENV{"HOME"}."/.lcovrc"); -} -elsif (-r "/etc/lcovrc") -{ - $config = read_config("/etc/lcovrc"); -} - -if ($config || %opt_rc) -{ - # Copy configuration file and --rc values to variables - apply_config({ - "geninfo_gcov_tool" => \$gcov_tool, - "geninfo_adjust_testname" => \$adjust_testname, - "geninfo_checksum" => \$checksum, - "geninfo_no_checksum" => \$no_checksum, # deprecated - "geninfo_compat_libtool" => \$opt_compat_libtool, - "geninfo_external" => \$opt_external, - "geninfo_gcov_all_blocks" => \$opt_gcov_all_blocks, - "geninfo_compat" => \$opt_compat, - "geninfo_adjust_src_path" => \$rc_adjust_src_path, - "geninfo_auto_base" => \$rc_auto_base, - "lcov_function_coverage" => \$func_coverage, - "lcov_branch_coverage" => \$br_coverage, - }); - - # Merge options - if (defined($no_checksum)) - { - $checksum = ($no_checksum ? 0 : 1); - $no_checksum = undef; - } - - # Check regexp - if (defined($rc_adjust_src_path)) { - my ($pattern, $replace) = split(/\s*=>\s*/, - $rc_adjust_src_path); - local $SIG{__DIE__}; - eval '$adjust_src_pattern = qr>'.$pattern.'>;'; - if (!defined($adjust_src_pattern)) { - my $msg = $@; - - chomp($msg); - $msg =~ s/at \(eval.*$//; - warn("WARNING: invalid pattern in ". - "geninfo_adjust_src_path: $msg\n"); - } elsif (!defined($replace)) { - # If no replacement is specified, simply remove pattern - $adjust_src_replace = ""; - } else { - $adjust_src_replace = $replace; - } - } -} - -# Parse command line options -if (!GetOptions("test-name|t=s" => \$test_name, - "output-filename|o=s" => \$output_filename, - "checksum" => \$checksum, - "no-checksum" => \$no_checksum, - "base-directory|b=s" => \$base_directory, - "version|v" =>\$version, - "quiet|q" => \$quiet, - "help|h|?" => \$help, - "follow|f" => \$follow, - "compat-libtool" => \$opt_compat_libtool, - "no-compat-libtool" => \$opt_no_compat_libtool, - "gcov-tool=s" => \$gcov_tool, - "ignore-errors=s" => \@ignore_errors, - "initial|i" => \$initial, - "no-recursion" => \$no_recursion, - "no-markers" => \$no_markers, - "derive-func-data" => \$opt_derive_func_data, - "debug" => \$debug, - "external" => \$opt_external, - "no-external" => \$opt_no_external, - "compat=s" => \$opt_compat, - "config-file=s" => \$opt_config_file, - "rc=s%" => \%opt_rc, - )) -{ - print(STDERR "Use $tool_name --help to get usage information\n"); - exit(1); -} -else -{ - # Merge options - if (defined($no_checksum)) - { - $checksum = ($no_checksum ? 0 : 1); - $no_checksum = undef; - } - - if (defined($opt_no_compat_libtool)) - { - $opt_compat_libtool = ($opt_no_compat_libtool ? 0 : 1); - $opt_no_compat_libtool = undef; - } - - if (defined($opt_no_external)) { - $opt_external = 0; - $opt_no_external = undef; - } -} - -@data_directory = @ARGV; - -# Check for help option -if ($help) -{ - print_usage(*STDOUT); - exit(0); -} - -# Check for version option -if ($version) -{ - print("$tool_name: $lcov_version\n"); - exit(0); -} - -# Check gcov tool -if (system_no_output(3, $gcov_tool, "--help") == -1) -{ - die("ERROR: need tool $gcov_tool!\n"); -} - -($gcov_version, $gcov_version_string) = get_gcov_version(); - -# Determine gcov options -$gcov_caps = get_gcov_capabilities(); -push(@gcov_options, "-b") if ($gcov_caps->{'branch-probabilities'} && - ($br_coverage || $func_coverage)); -push(@gcov_options, "-c") if ($gcov_caps->{'branch-counts'} && - $br_coverage); -push(@gcov_options, "-a") if ($gcov_caps->{'all-blocks'} && - $opt_gcov_all_blocks && $br_coverage); -push(@gcov_options, "-p") if ($gcov_caps->{'preserve-paths'}); - -# Determine compatibility modes -parse_compat_modes($opt_compat); - -# Determine which errors the user wants us to ignore -parse_ignore_errors(@ignore_errors); - -# Make sure test names only contain valid characters -if ($test_name =~ s/\W/_/g) -{ - warn("WARNING: invalid characters removed from testname!\n"); -} - -# Adjust test name to include uname output if requested -if ($adjust_testname) -{ - $test_name .= "__".`uname -a`; - $test_name =~ s/\W/_/g; -} - -# Make sure base_directory contains an absolute path specification -if ($base_directory) -{ - $base_directory = solve_relative_path($cwd, $base_directory); -} - -# Check for follow option -if ($follow) -{ - $follow = "-follow" -} -else -{ - $follow = ""; -} - -# Determine checksum mode -if (defined($checksum)) -{ - # Normalize to boolean - $checksum = ($checksum ? 1 : 0); -} -else -{ - # Default is off - $checksum = 0; -} - -# Determine max depth for recursion -if ($no_recursion) -{ - $maxdepth = "-maxdepth 1"; -} -else -{ - $maxdepth = ""; -} - -# Check for directory name -if (!@data_directory) -{ - die("No directory specified\n". - "Use $tool_name --help to get usage information\n"); -} -else -{ - foreach (@data_directory) - { - stat($_); - if (!-r _) - { - die("ERROR: cannot read $_!\n"); - } - } -} - -if ($gcov_version < $GCOV_VERSION_3_4_0) -{ - if (is_compat($COMPAT_MODE_HAMMER)) - { - $data_file_extension = ".da"; - $graph_file_extension = ".bbg"; - } - else - { - $data_file_extension = ".da"; - $graph_file_extension = ".bb"; - } -} -else -{ - $data_file_extension = ".gcda"; - $graph_file_extension = ".gcno"; -} - -# Check output filename -if (defined($output_filename) && ($output_filename ne "-")) -{ - # Initially create output filename, data is appended - # for each data file processed - local *DUMMY_HANDLE; - open(DUMMY_HANDLE, ">", $output_filename) - or die("ERROR: cannot create $output_filename!\n"); - close(DUMMY_HANDLE); - - # Make $output_filename an absolute path because we're going - # to change directories while processing files - if (!($output_filename =~ /^\/(.*)$/)) - { - $output_filename = $cwd."/".$output_filename; - } -} - -# Build list of directories to identify external files -foreach my $entry(@data_directory, $base_directory) { - next if (!defined($entry)); - push(@internal_dirs, solve_relative_path($cwd, $entry)); -} - -# Do something -foreach my $entry (@data_directory) { - gen_info($entry); -} - -if ($initial && $br_coverage) { - warn("Note: --initial does not generate branch coverage ". - "data\n"); -} -info("Finished .info-file creation\n"); - -exit(0); - - - -# -# print_usage(handle) -# -# Print usage information. -# - -sub print_usage(*) -{ - local *HANDLE = $_[0]; - - print(HANDLE < -# -# For each source file name referenced in the data file, there is a section -# containing source code and coverage data: -# -# SF: -# FN:, for each function -# DA:, for each instrumented line -# LH: greater than 0 -# LF: -# -# Sections are separated by: -# -# end_of_record -# -# In addition to the main source code file there are sections for each -# #included file containing executable code. Note that the absolute path -# of a source file is generated by interpreting the contents of the respective -# graph file. Relative filenames are prefixed with the directory in which the -# graph file is found. Note also that symbolic links to the graph file will be -# resolved so that the actual file path is used instead of the path to a link. -# This approach is necessary for the mechanism to work with the /proc/gcov -# files. -# -# Die on error. -# - -sub gen_info($) -{ - my $directory = $_[0]; - my @file_list; - my $file; - my $prefix; - my $type; - my $ext; - - if ($initial) { - $type = "graph"; - $ext = $graph_file_extension; - } else { - $type = "data"; - $ext = $data_file_extension; - } - - if (-d $directory) - { - info("Scanning $directory for $ext files ...\n"); - - @file_list = `find "$directory" $maxdepth $follow -name \\*$ext -type f 2>/dev/null`; - chomp(@file_list); - if (!@file_list) { - warn("WARNING: no $ext files found in $directory - ". - "skipping!\n"); - return; - } - $prefix = get_common_prefix(1, @file_list); - info("Found %d %s files in %s\n", $#file_list+1, $type, - $directory); - } - else - { - @file_list = ($directory); - $prefix = ""; - } - - # Process all files in list - foreach $file (@file_list) { - # Process file - if ($initial) { - process_graphfile($file, $prefix); - } else { - process_dafile($file, $prefix); - } - } -} - - -# -# derive_data(contentdata, funcdata, bbdata) -# -# Calculate function coverage data by combining line coverage data and the -# list of lines belonging to a function. -# -# contentdata: [ instr1, count1, source1, instr2, count2, source2, ... ] -# instr: Instrumentation flag for line n -# count: Execution count for line n -# source: Source code for line n -# -# funcdata: [ count1, func1, count2, func2, ... ] -# count: Execution count for function number n -# func: Function name for function number n -# -# bbdata: function_name -> [ line1, line2, ... ] -# line: Line number belonging to the corresponding function -# - -sub derive_data($$$) -{ - my ($contentdata, $funcdata, $bbdata) = @_; - my @gcov_content = @{$contentdata}; - my @gcov_functions = @{$funcdata}; - my %fn_count; - my %ln_fn; - my $line; - my $maxline; - my %fn_name; - my $fn; - my $count; - - if (!defined($bbdata)) { - return @gcov_functions; - } - - # First add existing function data - while (@gcov_functions) { - $count = shift(@gcov_functions); - $fn = shift(@gcov_functions); - - $fn_count{$fn} = $count; - } - - # Convert line coverage data to function data - foreach $fn (keys(%{$bbdata})) { - my $line_data = $bbdata->{$fn}; - my $line; - my $fninstr = 0; - - if ($fn eq "") { - next; - } - # Find the lowest line count for this function - $count = 0; - foreach $line (@$line_data) { - my $linstr = $gcov_content[ ( $line - 1 ) * 3 + 0 ]; - my $lcount = $gcov_content[ ( $line - 1 ) * 3 + 1 ]; - - next if (!$linstr); - $fninstr = 1; - if (($lcount > 0) && - (($count == 0) || ($lcount < $count))) { - $count = $lcount; - } - } - next if (!$fninstr); - $fn_count{$fn} = $count; - } - - - # Check if we got data for all functions - foreach $fn (keys(%fn_name)) { - if ($fn eq "") { - next; - } - if (defined($fn_count{$fn})) { - next; - } - warn("WARNING: no derived data found for function $fn\n"); - } - - # Convert hash to list in @gcov_functions format - foreach $fn (sort(keys(%fn_count))) { - push(@gcov_functions, $fn_count{$fn}, $fn); - } - - return @gcov_functions; -} - -# -# get_filenames(directory, pattern) -# -# Return a list of filenames found in directory which match the specified -# pattern. -# -# Die on error. -# - -sub get_filenames($$) -{ - my ($dirname, $pattern) = @_; - my @result; - my $directory; - local *DIR; - - opendir(DIR, $dirname) or - die("ERROR: cannot read directory $dirname\n"); - while ($directory = readdir(DIR)) { - push(@result, $directory) if ($directory =~ /$pattern/); - } - closedir(DIR); - - return @result; -} - -# -# process_dafile(da_filename, dir) -# -# Create a .info file for a single data file. -# -# Die on error. -# - -sub process_dafile($$) -{ - my ($file, $dir) = @_; - my $da_filename; # Name of data file to process - my $da_dir; # Directory of data file - my $source_dir; # Directory of source file - my $da_basename; # data filename without ".da/.gcda" extension - my $bb_filename; # Name of respective graph file - my $bb_basename; # Basename of the original graph file - my $graph; # Contents of graph file - my $instr; # Contents of graph file part 2 - my $gcov_error; # Error code of gcov tool - my $object_dir; # Directory containing all object files - my $source_filename; # Name of a source code file - my $gcov_file; # Name of a .gcov file - my @gcov_content; # Content of a .gcov file - my $gcov_branches; # Branch content of a .gcov file - my @gcov_functions; # Function calls of a .gcov file - my @gcov_list; # List of generated .gcov files - my $line_number; # Line number count - my $lines_hit; # Number of instrumented lines hit - my $lines_found; # Number of instrumented lines found - my $funcs_hit; # Number of instrumented functions hit - my $funcs_found; # Number of instrumented functions found - my $br_hit; - my $br_found; - my $source; # gcov source header information - my $object; # gcov object header information - my @matches; # List of absolute paths matching filename - my $base_dir; # Base directory for current file - my @tmp_links; # Temporary links to be cleaned up - my @result; - my $index; - my $da_renamed; # If data file is to be renamed - local *INFO_HANDLE; - - info("Processing %s\n", abs2rel($file, $dir)); - # Get path to data file in absolute and normalized form (begins with /, - # contains no more ../ or ./) - $da_filename = solve_relative_path($cwd, $file); - - # Get directory and basename of data file - ($da_dir, $da_basename) = split_filename($da_filename); - - $source_dir = $da_dir; - if (is_compat($COMPAT_MODE_LIBTOOL)) { - # Avoid files from .libs dirs - $source_dir =~ s/\.libs$//; - } - - if (-z $da_filename) - { - $da_renamed = 1; - } - else - { - $da_renamed = 0; - } - - # Construct base_dir for current file - if ($base_directory) - { - $base_dir = $base_directory; - } - else - { - $base_dir = $source_dir; - } - - # Check for writable $base_dir (gcov will try to write files there) - stat($base_dir); - if (!-w _) - { - die("ERROR: cannot write to directory $base_dir!\n"); - } - - # Construct name of graph file - $bb_basename = $da_basename.$graph_file_extension; - $bb_filename = "$da_dir/$bb_basename"; - - # Find out the real location of graph file in case we're just looking at - # a link - while (readlink($bb_filename)) - { - my $last_dir = dirname($bb_filename); - - $bb_filename = readlink($bb_filename); - $bb_filename = solve_relative_path($last_dir, $bb_filename); - } - - # Ignore empty graph file (e.g. source file with no statement) - if (-z $bb_filename) - { - warn("WARNING: empty $bb_filename (skipped)\n"); - return; - } - - # Read contents of graph file into hash. We need it later to find out - # the absolute path to each .gcov file created as well as for - # information about functions and their source code positions. - if ($gcov_version < $GCOV_VERSION_3_4_0) - { - if (is_compat($COMPAT_MODE_HAMMER)) - { - ($instr, $graph) = read_bbg($bb_filename); - } - else - { - ($instr, $graph) = read_bb($bb_filename); - } - } - else - { - ($instr, $graph) = read_gcno($bb_filename); - } - - # Try to find base directory automatically if requested by user - if ($rc_auto_base) { - $base_dir = find_base_from_graph($base_dir, $instr, $graph); - } - - ($instr, $graph) = adjust_graph_filenames($base_dir, $instr, $graph); - - # Set $object_dir to real location of object files. This may differ - # from $da_dir if the graph file is just a link to the "real" object - # file location. - $object_dir = dirname($bb_filename); - - # Is the data file in a different directory? (this happens e.g. with - # the gcov-kernel patch) - if ($object_dir ne $da_dir) - { - # Need to create link to data file in $object_dir - system("ln", "-s", $da_filename, - "$object_dir/$da_basename$data_file_extension") - and die ("ERROR: cannot create link $object_dir/". - "$da_basename$data_file_extension!\n"); - push(@tmp_links, - "$object_dir/$da_basename$data_file_extension"); - # Need to create link to graph file if basename of link - # and file are different (CONFIG_MODVERSION compat) - if ((basename($bb_filename) ne $bb_basename) && - (! -e "$object_dir/$bb_basename")) { - symlink($bb_filename, "$object_dir/$bb_basename") or - warn("WARNING: cannot create link ". - "$object_dir/$bb_basename\n"); - push(@tmp_links, "$object_dir/$bb_basename"); - } - } - - # Change to directory containing data files and apply GCOV - debug("chdir($base_dir)\n"); - chdir($base_dir); - - if ($da_renamed) - { - # Need to rename empty data file to workaround - # gcov <= 3.2.x bug (Abort) - system_no_output(3, "mv", "$da_filename", "$da_filename.ori") - and die ("ERROR: cannot rename $da_filename\n"); - } - - # Execute gcov command and suppress standard output - $gcov_error = system_no_output(1, $gcov_tool, $da_filename, - "-o", $object_dir, @gcov_options); - - if ($da_renamed) - { - system_no_output(3, "mv", "$da_filename.ori", "$da_filename") - and die ("ERROR: cannot rename $da_filename.ori"); - } - - # Clean up temporary links - foreach (@tmp_links) { - unlink($_); - } - - if ($gcov_error) - { - if ($ignore[$ERROR_GCOV]) - { - warn("WARNING: GCOV failed for $da_filename!\n"); - return; - } - die("ERROR: GCOV failed for $da_filename!\n"); - } - - # Collect data from resulting .gcov files and create .info file - @gcov_list = get_filenames('.', '\.gcov$'); - - # Check for files - if (!@gcov_list) - { - warn("WARNING: gcov did not create any files for ". - "$da_filename!\n"); - } - - # Check whether we're writing to a single file - if ($output_filename) - { - if ($output_filename eq "-") - { - *INFO_HANDLE = *STDOUT; - } - else - { - # Append to output file - open(INFO_HANDLE, ">>", $output_filename) - or die("ERROR: cannot write to ". - "$output_filename!\n"); - } - } - else - { - # Open .info file for output - open(INFO_HANDLE, ">", "$da_filename.info") - or die("ERROR: cannot create $da_filename.info!\n"); - } - - # Write test name - printf(INFO_HANDLE "TN:%s\n", $test_name); - - # Traverse the list of generated .gcov files and combine them into a - # single .info file - foreach $gcov_file (sort(@gcov_list)) - { - my $i; - my $num; - - # Skip gcov file for gcc built-in code - next if ($gcov_file eq ".gcov"); - - ($source, $object) = read_gcov_header($gcov_file); - - if (!defined($source)) { - # Derive source file name from gcov file name if - # header format could not be parsed - $source = $gcov_file; - $source =~ s/\.gcov$//; - } - - $source = solve_relative_path($base_dir, $source); - - if (defined($adjust_src_pattern)) { - # Apply transformation as specified by user - $source =~ s/$adjust_src_pattern/$adjust_src_replace/g; - } - - # gcov will happily create output even if there's no source code - # available - this interferes with checksum creation so we need - # to pull the emergency brake here. - if (! -r $source && $checksum) - { - if ($ignore[$ERROR_SOURCE]) - { - warn("WARNING: could not read source file ". - "$source\n"); - next; - } - die("ERROR: could not read source file $source\n"); - } - - @matches = match_filename($source, keys(%{$instr})); - - # Skip files that are not mentioned in the graph file - if (!@matches) - { - warn("WARNING: cannot find an entry for ".$gcov_file. - " in $graph_file_extension file, skipping ". - "file!\n"); - unlink($gcov_file); - next; - } - - # Read in contents of gcov file - @result = read_gcov_file($gcov_file); - if (!defined($result[0])) { - warn("WARNING: skipping unreadable file ". - $gcov_file."\n"); - unlink($gcov_file); - next; - } - @gcov_content = @{$result[0]}; - $gcov_branches = $result[1]; - @gcov_functions = @{$result[2]}; - - # Skip empty files - if (!@gcov_content) - { - warn("WARNING: skipping empty file ".$gcov_file."\n"); - unlink($gcov_file); - next; - } - - if (scalar(@matches) == 1) - { - # Just one match - $source_filename = $matches[0]; - } - else - { - # Try to solve the ambiguity - $source_filename = solve_ambiguous_match($gcov_file, - \@matches, \@gcov_content); - } - - # Skip external files if requested - if (!$opt_external) { - if (is_external($source_filename)) { - info(" ignoring data for external file ". - "$source_filename\n"); - unlink($gcov_file); - next; - } - } - - # Write absolute path of source file - printf(INFO_HANDLE "SF:%s\n", $source_filename); - - # If requested, derive function coverage data from - # line coverage data of the first line of a function - if ($opt_derive_func_data) { - @gcov_functions = - derive_data(\@gcov_content, \@gcov_functions, - $graph->{$source_filename}); - } - - # Write function-related information - if (defined($graph->{$source_filename})) - { - my $fn_data = $graph->{$source_filename}; - my $fn; - - foreach $fn (sort - {$fn_data->{$a}->[0] <=> $fn_data->{$b}->[0]} - keys(%{$fn_data})) { - my $ln_data = $fn_data->{$fn}; - my $line = $ln_data->[0]; - - # Skip empty function - if ($fn eq "") { - next; - } - # Remove excluded functions - if (!$no_markers) { - my $gfn; - my $found = 0; - - foreach $gfn (@gcov_functions) { - if ($gfn eq $fn) { - $found = 1; - last; - } - } - if (!$found) { - next; - } - } - - # Normalize function name - $fn = filter_fn_name($fn); - - print(INFO_HANDLE "FN:$line,$fn\n"); - } - } - - #-- - #-- FNDA: , - #-- FNF: overall count of functions - #-- FNH: overall count of functions with non-zero call count - #-- - $funcs_found = 0; - $funcs_hit = 0; - while (@gcov_functions) - { - my $count = shift(@gcov_functions); - my $fn = shift(@gcov_functions); - - $fn = filter_fn_name($fn); - printf(INFO_HANDLE "FNDA:$count,$fn\n"); - $funcs_found++; - $funcs_hit++ if ($count > 0); - } - if ($funcs_found > 0) { - printf(INFO_HANDLE "FNF:%s\n", $funcs_found); - printf(INFO_HANDLE "FNH:%s\n", $funcs_hit); - } - - # Write coverage information for each instrumented branch: - # - # BRDA:,,, - # - # where 'taken' is the number of times the branch was taken - # or '-' if the block to which the branch belongs was never - # executed - $br_found = 0; - $br_hit = 0; - $num = br_gvec_len($gcov_branches); - for ($i = 0; $i < $num; $i++) { - my ($line, $block, $branch, $taken) = - br_gvec_get($gcov_branches, $i); - - $block = $BR_VEC_MAX if ($block < 0); - print(INFO_HANDLE "BRDA:$line,$block,$branch,$taken\n"); - $br_found++; - $br_hit++ if ($taken ne '-' && $taken > 0); - } - if ($br_found > 0) { - printf(INFO_HANDLE "BRF:%s\n", $br_found); - printf(INFO_HANDLE "BRH:%s\n", $br_hit); - } - - # Reset line counters - $line_number = 0; - $lines_found = 0; - $lines_hit = 0; - - # Write coverage information for each instrumented line - # Note: @gcov_content contains a list of (flag, count, source) - # tuple for each source code line - while (@gcov_content) - { - $line_number++; - - # Check for instrumented line - if ($gcov_content[0]) - { - $lines_found++; - printf(INFO_HANDLE "DA:".$line_number.",". - $gcov_content[1].($checksum ? - ",". md5_base64($gcov_content[2]) : ""). - "\n"); - - # Increase $lines_hit in case of an execution - # count>0 - if ($gcov_content[1] > 0) { $lines_hit++; } - } - - # Remove already processed data from array - splice(@gcov_content,0,3); - } - - # Write line statistics and section separator - printf(INFO_HANDLE "LF:%s\n", $lines_found); - printf(INFO_HANDLE "LH:%s\n", $lines_hit); - print(INFO_HANDLE "end_of_record\n"); - - # Remove .gcov file after processing - unlink($gcov_file); - } - - if (!($output_filename && ($output_filename eq "-"))) - { - close(INFO_HANDLE); - } - - # Change back to initial directory - chdir($cwd); -} - - -# -# solve_relative_path(path, dir) -# -# Solve relative path components of DIR which, if not absolute, resides in PATH. -# - -sub solve_relative_path($$) -{ - my $path = $_[0]; - my $dir = $_[1]; - my $volume; - my $directories; - my $filename; - my @dirs; # holds path elements - my $result; - - # Convert from Windows path to msys path - if( $^O eq "msys" ) - { - # search for a windows drive letter at the beginning - ($volume, $directories, $filename) = File::Spec::Win32->splitpath( $dir ); - if( $volume ne '' ) - { - my $uppercase_volume; - # transform c/d\../e/f\g to Windows style c\d\..\e\f\g - $dir = File::Spec::Win32->canonpath( $dir ); - # use Win32 module to retrieve path components - # $uppercase_volume is not used any further - ( $uppercase_volume, $directories, $filename ) = File::Spec::Win32->splitpath( $dir ); - @dirs = File::Spec::Win32->splitdir( $directories ); - - # prepend volume, since in msys C: is always mounted to /c - $volume =~ s|^([a-zA-Z]+):|/\L$1\E|; - unshift( @dirs, $volume ); - - # transform to Unix style '/' path - $directories = File::Spec->catdir( @dirs ); - $dir = File::Spec->catpath( '', $directories, $filename ); - } else { - # eliminate '\' path separators - $dir = File::Spec->canonpath( $dir ); - } - } - - $result = $dir; - # Prepend path if not absolute - if ($dir =~ /^[^\/]/) - { - $result = "$path/$result"; - } - - # Remove // - $result =~ s/\/\//\//g; - - # Remove . - $result =~ s/\/\.\//\//g; - $result =~ s/\/\.$/\//g; - - # Remove trailing / - $result =~ s/\/$//g; - - # Solve .. - while ($result =~ s/\/[^\/]+\/\.\.\//\//) - { - } - - # Remove preceding .. - $result =~ s/^\/\.\.\//\//g; - - return $result; -} - - -# -# match_filename(gcov_filename, list) -# -# Return a list of those entries of LIST which match the relative filename -# GCOV_FILENAME. -# - -sub match_filename($@) -{ - my ($filename, @list) = @_; - my ($vol, $dir, $file) = splitpath($filename); - my @comp = splitdir($dir); - my $comps = scalar(@comp); - my $entry; - my @result; - -entry: - foreach $entry (@list) { - my ($evol, $edir, $efile) = splitpath($entry); - my @ecomp; - my $ecomps; - my $i; - - # Filename component must match - if ($efile ne $file) { - next; - } - # Check directory components last to first for match - @ecomp = splitdir($edir); - $ecomps = scalar(@ecomp); - if ($ecomps < $comps) { - next; - } - for ($i = 0; $i < $comps; $i++) { - if ($comp[$comps - $i - 1] ne - $ecomp[$ecomps - $i - 1]) { - next entry; - } - } - push(@result, $entry), - } - - return @result; -} - -# -# solve_ambiguous_match(rel_filename, matches_ref, gcov_content_ref) -# -# Try to solve ambiguous matches of mapping (gcov file) -> (source code) file -# by comparing source code provided in the GCOV file with that of the files -# in MATCHES. REL_FILENAME identifies the relative filename of the gcov -# file. -# -# Return the one real match or die if there is none. -# - -sub solve_ambiguous_match($$$) -{ - my $rel_name = $_[0]; - my $matches = $_[1]; - my $content = $_[2]; - my $filename; - my $index; - my $no_match; - local *SOURCE; - - # Check the list of matches - foreach $filename (@$matches) - { - - # Compare file contents - open(SOURCE, "<", $filename) - or die("ERROR: cannot read $filename!\n"); - - $no_match = 0; - for ($index = 2; ; $index += 3) - { - chomp; - - # Also remove CR from line-end - s/\015$//; - - if ($_ ne @$content[$index]) - { - $no_match = 1; - last; - } - } - - close(SOURCE); - - if (!$no_match) - { - info("Solved source file ambiguity for $rel_name\n"); - return $filename; - } - } - - die("ERROR: could not match gcov data for $rel_name!\n"); -} - - -# -# split_filename(filename) -# -# Return (path, filename, extension) for a given FILENAME. -# - -sub split_filename($) -{ - my @path_components = split('/', $_[0]); - my @file_components = split('\.', pop(@path_components)); - my $extension = pop(@file_components); - - return (join("/",@path_components), join(".",@file_components), - $extension); -} - - -# -# read_gcov_header(gcov_filename) -# -# Parse file GCOV_FILENAME and return a list containing the following -# information: -# -# (source, object) -# -# where: -# -# source: complete relative path of the source code file (gcc >= 3.3 only) -# object: name of associated graph file -# -# Die on error. -# - -sub read_gcov_header($) -{ - my $source; - my $object; - local *INPUT; - - if (!open(INPUT, "<", $_[0])) - { - if ($ignore_errors[$ERROR_GCOV]) - { - warn("WARNING: cannot read $_[0]!\n"); - return (undef,undef); - } - die("ERROR: cannot read $_[0]!\n"); - } - - while () - { - chomp($_); - - # Also remove CR from line-end - s/\015$//; - - if (/^\s+-:\s+0:Source:(.*)$/) - { - # Source: header entry - $source = $1; - } - elsif (/^\s+-:\s+0:Object:(.*)$/) - { - # Object: header entry - $object = $1; - } - else - { - last; - } - } - - close(INPUT); - - return ($source, $object); -} - - -# -# br_gvec_len(vector) -# -# Return the number of entries in the branch coverage vector. -# - -sub br_gvec_len($) -{ - my ($vec) = @_; - - return 0 if (!defined($vec)); - return (length($vec) * 8 / $BR_VEC_WIDTH) / $BR_VEC_ENTRIES; -} - - -# -# br_gvec_get(vector, number) -# -# Return an entry from the branch coverage vector. -# - -sub br_gvec_get($$) -{ - my ($vec, $num) = @_; - my $line; - my $block; - my $branch; - my $taken; - my $offset = $num * $BR_VEC_ENTRIES; - - # Retrieve data from vector - $line = vec($vec, $offset + $BR_LINE, $BR_VEC_WIDTH); - $block = vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH); - $block = -1 if ($block == $BR_VEC_MAX); - $branch = vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH); - $taken = vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH); - - # Decode taken value from an integer - if ($taken == 0) { - $taken = "-"; - } else { - $taken--; - } - - return ($line, $block, $branch, $taken); -} - - -# -# br_gvec_push(vector, line, block, branch, taken) -# -# Add an entry to the branch coverage vector. -# - -sub br_gvec_push($$$$$) -{ - my ($vec, $line, $block, $branch, $taken) = @_; - my $offset; - - $vec = "" if (!defined($vec)); - $offset = br_gvec_len($vec) * $BR_VEC_ENTRIES; - $block = $BR_VEC_MAX if $block < 0; - - # Encode taken value into an integer - if ($taken eq "-") { - $taken = 0; - } else { - $taken++; - } - - # Add to vector - vec($vec, $offset + $BR_LINE, $BR_VEC_WIDTH) = $line; - vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH) = $block; - vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH) = $branch; - vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH) = $taken; - - return $vec; -} - - -# -# read_gcov_file(gcov_filename) -# -# Parse file GCOV_FILENAME (.gcov file format) and return the list: -# (reference to gcov_content, reference to gcov_branch, reference to gcov_func) -# -# gcov_content is a list of 3 elements -# (flag, count, source) for each source code line: -# -# $result[($line_number-1)*3+0] = instrumentation flag for line $line_number -# $result[($line_number-1)*3+1] = execution count for line $line_number -# $result[($line_number-1)*3+2] = source code text for line $line_number -# -# gcov_branch is a vector of 4 4-byte long elements for each branch: -# line number, block number, branch number, count + 1 or 0 -# -# gcov_func is a list of 2 elements -# (number of calls, function name) for each function -# -# Die on error. -# - -sub read_gcov_file($) -{ - my $filename = $_[0]; - my @result = (); - my $branches = ""; - my @functions = (); - my $number; - my $exclude_flag = 0; - my $exclude_line = 0; - my $exclude_br_flag = 0; - my $exclude_branch = 0; - my $last_block = $UNNAMED_BLOCK; - my $last_line = 0; - local *INPUT; - - if (!open(INPUT, "<", $filename)) { - if ($ignore_errors[$ERROR_GCOV]) - { - warn("WARNING: cannot read $filename!\n"); - return (undef, undef, undef); - } - die("ERROR: cannot read $filename!\n"); - } - - if ($gcov_version < $GCOV_VERSION_3_3_0) - { - # Expect gcov format as used in gcc < 3.3 - while () - { - chomp($_); - - # Also remove CR from line-end - s/\015$//; - - if (/^branch\s+(\d+)\s+taken\s+=\s+(\d+)/) { - next if (!$br_coverage); - next if ($exclude_line); - next if ($exclude_branch); - $branches = br_gvec_push($branches, $last_line, - $last_block, $1, $2); - } elsif (/^branch\s+(\d+)\s+never\s+executed/) { - next if (!$br_coverage); - next if ($exclude_line); - next if ($exclude_branch); - $branches = br_gvec_push($branches, $last_line, - $last_block, $1, '-'); - } - elsif (/^call/ || /^function/) - { - # Function call return data - } - else - { - $last_line++; - # Check for exclusion markers - if (!$no_markers) { - if (/$EXCL_STOP/) { - $exclude_flag = 0; - } elsif (/$EXCL_START/) { - $exclude_flag = 1; - } - if (/$EXCL_LINE/ || $exclude_flag) { - $exclude_line = 1; - } else { - $exclude_line = 0; - } - } - # Check for exclusion markers (branch exclude) - if (!$no_markers) { - if (/$EXCL_BR_STOP/) { - $exclude_br_flag = 0; - } elsif (/$EXCL_BR_START/) { - $exclude_br_flag = 1; - } - if (/$EXCL_BR_LINE/ || $exclude_br_flag) { - $exclude_branch = 1; - } else { - $exclude_branch = 0; - } - } - # Source code execution data - if (/^\t\t(.*)$/) - { - # Uninstrumented line - push(@result, 0); - push(@result, 0); - push(@result, $1); - next; - } - $number = (split(" ",substr($_, 0, 16)))[0]; - - # Check for zero count which is indicated - # by ###### - if ($number eq "######") { $number = 0; } - - if ($exclude_line) { - # Register uninstrumented line instead - push(@result, 0); - push(@result, 0); - } else { - push(@result, 1); - push(@result, $number); - } - push(@result, substr($_, 16)); - } - } - } - else - { - # Expect gcov format as used in gcc >= 3.3 - while () - { - chomp($_); - - # Also remove CR from line-end - s/\015$//; - - if (/^\s*(\d+|\$+):\s*(\d+)-block\s+(\d+)\s*$/) { - # Block information - used to group related - # branches - $last_line = $2; - $last_block = $3; - } elsif (/^branch\s+(\d+)\s+taken\s+(\d+)/) { - next if (!$br_coverage); - next if ($exclude_line); - next if ($exclude_branch); - $branches = br_gvec_push($branches, $last_line, - $last_block, $1, $2); - } elsif (/^branch\s+(\d+)\s+never\s+executed/) { - next if (!$br_coverage); - next if ($exclude_line); - next if ($exclude_branch); - $branches = br_gvec_push($branches, $last_line, - $last_block, $1, '-'); - } - elsif (/^function\s+(.+)\s+called\s+(\d+)\s+/) - { - next if (!$func_coverage); - if ($exclude_line) { - next; - } - push(@functions, $2, $1); - } - elsif (/^call/) - { - # Function call return data - } - elsif (/^\s*([^:]+):\s*([^:]+):(.*)$/) - { - my ($count, $line, $code) = ($1, $2, $3); - - $last_line = $line; - $last_block = $UNNAMED_BLOCK; - # Check for exclusion markers - if (!$no_markers) { - if (/$EXCL_STOP/) { - $exclude_flag = 0; - } elsif (/$EXCL_START/) { - $exclude_flag = 1; - } - if (/$EXCL_LINE/ || $exclude_flag) { - $exclude_line = 1; - } else { - $exclude_line = 0; - } - } - # Check for exclusion markers (branch exclude) - if (!$no_markers) { - if (/$EXCL_BR_STOP/) { - $exclude_br_flag = 0; - } elsif (/$EXCL_BR_START/) { - $exclude_br_flag = 1; - } - if (/$EXCL_BR_LINE/ || $exclude_br_flag) { - $exclude_branch = 1; - } else { - $exclude_branch = 0; - } - } - - # :: - if ($line eq "0") - { - # Extra data - } - elsif ($count eq "-") - { - # Uninstrumented line - push(@result, 0); - push(@result, 0); - push(@result, $code); - } - else - { - if ($exclude_line) { - push(@result, 0); - push(@result, 0); - } else { - # Check for zero count - if ($count =~ /^[#=]/) { - $count = 0; - } - push(@result, 1); - push(@result, $count); - } - push(@result, $code); - } - } - } - } - - close(INPUT); - if ($exclude_flag || $exclude_br_flag) { - warn("WARNING: unterminated exclusion section in $filename\n"); - } - return(\@result, $branches, \@functions); -} - - -# -# Get the GCOV tool version. Return an integer number which represents the -# GCOV version. Version numbers can be compared using standard integer -# operations. -# - -sub get_gcov_version() -{ - local *HANDLE; - my $version_string; - my $result; - - open(GCOV_PIPE, "-|", "$gcov_tool --version") - or die("ERROR: cannot retrieve gcov version!\n"); - $version_string = ; - # LLVM gcov keeps version information on the second line. - # For example, gcov --version yields: - # LLVM (http://llvm.org/): - # LLVM version 3.4svn - $version_string = if ($version_string =~ /LLVM/); - close(GCOV_PIPE); - - # Remove version information in parenthesis to cope with the following: - # - gcov (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3) - # - gcov (crosstool-NG 1.18.0) 4.7.2 - $version_string =~ s/\([^\)]*\)//g; - - $result = 0; - if ($version_string =~ /(\d+)\.(\d+)(\.(\d+))?/) - { - if (defined($4)) - { - info("Found gcov version: $1.$2.$4\n"); - $result = $1 << 16 | $2 << 8 | $4; - } - else - { - info("Found gcov version: $1.$2\n"); - $result = $1 << 16 | $2 << 8; - } - } - if ($version_string =~ /LLVM/) - { - # Map LLVM versions to the version of GCC gcov which - # they emulate - if ($result >= 0x030400) - { - info("Found LLVM gcov version 3.4, which emulates gcov version 4.2\n"); - $result = 0x040200; - } - else - { - warn("This version of LLVM's gcov is unknown. Assuming it emulates GCC gcov version 4.2.\n"); - $result = 0x040200; - } - } - return ($result, $version_string); -} - - -# -# info(printf_parameter) -# -# Use printf to write PRINTF_PARAMETER to stdout only when the $quiet flag -# is not set. -# - -sub info(@) -{ - if (!$quiet) - { - # Print info string - if (defined($output_filename) && ($output_filename eq "-")) - { - # Don't interfere with the .info output to STDOUT - printf(STDERR @_); - } - else - { - printf(@_); - } - } -} - - -# -# int_handler() -# -# Called when the script was interrupted by an INT signal (e.g. CTRl-C) -# - -sub int_handler() -{ - if ($cwd) { chdir($cwd); } - info("Aborted.\n"); - exit(1); -} - - -# -# system_no_output(mode, parameters) -# -# Call an external program using PARAMETERS while suppressing depending on -# the value of MODE: -# -# MODE & 1: suppress STDOUT -# MODE & 2: suppress STDERR -# -# Return 0 on success, non-zero otherwise. -# - -sub system_no_output($@) -{ - my $mode = shift; - my $result; - local *OLD_STDERR; - local *OLD_STDOUT; - - # Save old stdout and stderr handles - ($mode & 1) && open(OLD_STDOUT, ">>&", "STDOUT"); - ($mode & 2) && open(OLD_STDERR, ">>&", "STDERR"); - - # Redirect to /dev/null - ($mode & 1) && open(STDOUT, ">", "/dev/null"); - ($mode & 2) && open(STDERR, ">", "/dev/null"); - - debug("system(".join(' ', @_).")\n"); - system(@_); - $result = $?; - - # Close redirected handles - ($mode & 1) && close(STDOUT); - ($mode & 2) && close(STDERR); - - # Restore old handles - ($mode & 1) && open(STDOUT, ">>&", "OLD_STDOUT"); - ($mode & 2) && open(STDERR, ">>&", "OLD_STDERR"); - - return $result; -} - - -# -# read_config(filename) -# -# Read configuration file FILENAME and return a reference to a hash containing -# all valid key=value pairs found. -# - -sub read_config($) -{ - my $filename = $_[0]; - my %result; - my $key; - my $value; - local *HANDLE; - - if (!open(HANDLE, "<", $filename)) - { - warn("WARNING: cannot read configuration file $filename\n"); - return undef; - } - while () - { - chomp; - # Skip comments - s/#.*//; - # Remove leading blanks - s/^\s+//; - # Remove trailing blanks - s/\s+$//; - next unless length; - ($key, $value) = split(/\s*=\s*/, $_, 2); - if (defined($key) && defined($value)) - { - $result{$key} = $value; - } - else - { - warn("WARNING: malformed statement in line $. ". - "of configuration file $filename\n"); - } - } - close(HANDLE); - return \%result; -} - - -# -# apply_config(REF) -# -# REF is a reference to a hash containing the following mapping: -# -# key_string => var_ref -# -# where KEY_STRING is a keyword and VAR_REF is a reference to an associated -# variable. If the global configuration hashes CONFIG or OPT_RC contain a value -# for keyword KEY_STRING, VAR_REF will be assigned the value for that keyword. -# - -sub apply_config($) -{ - my $ref = $_[0]; - - foreach (keys(%{$ref})) - { - if (defined($opt_rc{$_})) { - ${$ref->{$_}} = $opt_rc{$_}; - } elsif (defined($config->{$_})) { - ${$ref->{$_}} = $config->{$_}; - } - } -} - - -# -# get_exclusion_data(filename) -# -# Scan specified source code file for exclusion markers and return -# linenumber -> 1 -# for all lines which should be excluded. -# - -sub get_exclusion_data($) -{ - my ($filename) = @_; - my %list; - my $flag = 0; - local *HANDLE; - - if (!open(HANDLE, "<", $filename)) { - warn("WARNING: could not open $filename\n"); - return undef; - } - while () { - if (/$EXCL_STOP/) { - $flag = 0; - } elsif (/$EXCL_START/) { - $flag = 1; - } - if (/$EXCL_LINE/ || $flag) { - $list{$.} = 1; - } - } - close(HANDLE); - - if ($flag) { - warn("WARNING: unterminated exclusion section in $filename\n"); - } - - return \%list; -} - - -# -# apply_exclusion_data(instr, graph) -# -# Remove lines from instr and graph data structures which are marked -# for exclusion in the source code file. -# -# Return adjusted (instr, graph). -# -# graph : file name -> function data -# function data : function name -> line data -# line data : [ line1, line2, ... ] -# -# instr : filename -> line data -# line data : [ line1, line2, ... ] -# - -sub apply_exclusion_data($$) -{ - my ($instr, $graph) = @_; - my $filename; - my %excl_data; - my $excl_read_failed = 0; - - # Collect exclusion marker data - foreach $filename (sort_uniq_lex(keys(%{$graph}), keys(%{$instr}))) { - my $excl = get_exclusion_data($filename); - - # Skip and note if file could not be read - if (!defined($excl)) { - $excl_read_failed = 1; - next; - } - - # Add to collection if there are markers - $excl_data{$filename} = $excl if (keys(%{$excl}) > 0); - } - - # Warn if not all source files could be read - if ($excl_read_failed) { - warn("WARNING: some exclusion markers may be ignored\n"); - } - - # Skip if no markers were found - return ($instr, $graph) if (keys(%excl_data) == 0); - - # Apply exclusion marker data to graph - foreach $filename (keys(%excl_data)) { - my $function_data = $graph->{$filename}; - my $excl = $excl_data{$filename}; - my $function; - - next if (!defined($function_data)); - - foreach $function (keys(%{$function_data})) { - my $line_data = $function_data->{$function}; - my $line; - my @new_data; - - # To be consistent with exclusion parser in non-initial - # case we need to remove a function if the first line - # was excluded - if ($excl->{$line_data->[0]}) { - delete($function_data->{$function}); - next; - } - # Copy only lines which are not excluded - foreach $line (@{$line_data}) { - push(@new_data, $line) if (!$excl->{$line}); - } - - # Store modified list - if (scalar(@new_data) > 0) { - $function_data->{$function} = \@new_data; - } else { - # All of this function was excluded - delete($function_data->{$function}); - } - } - - # Check if all functions of this file were excluded - if (keys(%{$function_data}) == 0) { - delete($graph->{$filename}); - } - } - - # Apply exclusion marker data to instr - foreach $filename (keys(%excl_data)) { - my $line_data = $instr->{$filename}; - my $excl = $excl_data{$filename}; - my $line; - my @new_data; - - next if (!defined($line_data)); - - # Copy only lines which are not excluded - foreach $line (@{$line_data}) { - push(@new_data, $line) if (!$excl->{$line}); - } - - # Store modified list - $instr->{$filename} = \@new_data; - } - - return ($instr, $graph); -} - - -sub process_graphfile($$) -{ - my ($file, $dir) = @_; - my $graph_filename = $file; - my $graph_dir; - my $graph_basename; - my $source_dir; - my $base_dir; - my $graph; - my $instr; - my $filename; - local *INFO_HANDLE; - - info("Processing %s\n", abs2rel($file, $dir)); - - # Get path to data file in absolute and normalized form (begins with /, - # contains no more ../ or ./) - $graph_filename = solve_relative_path($cwd, $graph_filename); - - # Get directory and basename of data file - ($graph_dir, $graph_basename) = split_filename($graph_filename); - - $source_dir = $graph_dir; - if (is_compat($COMPAT_MODE_LIBTOOL)) { - # Avoid files from .libs dirs - $source_dir =~ s/\.libs$//; - } - - # Construct base_dir for current file - if ($base_directory) - { - $base_dir = $base_directory; - } - else - { - $base_dir = $source_dir; - } - - if ($gcov_version < $GCOV_VERSION_3_4_0) - { - if (is_compat($COMPAT_MODE_HAMMER)) - { - ($instr, $graph) = read_bbg($graph_filename); - } - else - { - ($instr, $graph) = read_bb($graph_filename); - } - } - else - { - ($instr, $graph) = read_gcno($graph_filename); - } - - # Try to find base directory automatically if requested by user - if ($rc_auto_base) { - $base_dir = find_base_from_graph($base_dir, $instr, $graph); - } - - ($instr, $graph) = adjust_graph_filenames($base_dir, $instr, $graph); - - if (!$no_markers) { - # Apply exclusion marker data to graph file data - ($instr, $graph) = apply_exclusion_data($instr, $graph); - } - - # Check whether we're writing to a single file - if ($output_filename) - { - if ($output_filename eq "-") - { - *INFO_HANDLE = *STDOUT; - } - else - { - # Append to output file - open(INFO_HANDLE, ">>", $output_filename) - or die("ERROR: cannot write to ". - "$output_filename!\n"); - } - } - else - { - # Open .info file for output - open(INFO_HANDLE, ">", "$graph_filename.info") - or die("ERROR: cannot create $graph_filename.info!\n"); - } - - # Write test name - printf(INFO_HANDLE "TN:%s\n", $test_name); - foreach $filename (sort(keys(%{$instr}))) - { - my $funcdata = $graph->{$filename}; - my $line; - my $linedata; - - # Skip external files if requested - if (!$opt_external) { - if (is_external($filename)) { - info(" ignoring data for external file ". - "$filename\n"); - next; - } - } - - print(INFO_HANDLE "SF:$filename\n"); - - if (defined($funcdata) && $func_coverage) { - my @functions = sort {$funcdata->{$a}->[0] <=> - $funcdata->{$b}->[0]} - keys(%{$funcdata}); - my $func; - - # Gather list of instrumented lines and functions - foreach $func (@functions) { - $linedata = $funcdata->{$func}; - - # Print function name and starting line - print(INFO_HANDLE "FN:".$linedata->[0]. - ",".filter_fn_name($func)."\n"); - } - # Print zero function coverage data - foreach $func (@functions) { - print(INFO_HANDLE "FNDA:0,". - filter_fn_name($func)."\n"); - } - # Print function summary - print(INFO_HANDLE "FNF:".scalar(@functions)."\n"); - print(INFO_HANDLE "FNH:0\n"); - } - # Print zero line coverage data - foreach $line (@{$instr->{$filename}}) { - print(INFO_HANDLE "DA:$line,0\n"); - } - # Print line summary - print(INFO_HANDLE "LF:".scalar(@{$instr->{$filename}})."\n"); - print(INFO_HANDLE "LH:0\n"); - - print(INFO_HANDLE "end_of_record\n"); - } - if (!($output_filename && ($output_filename eq "-"))) - { - close(INFO_HANDLE); - } -} - -sub filter_fn_name($) -{ - my ($fn) = @_; - - # Remove characters used internally as function name delimiters - $fn =~ s/[,=]/_/g; - - return $fn; -} - -sub warn_handler($) -{ - my ($msg) = @_; - - warn("$tool_name: $msg"); -} - -sub die_handler($) -{ - my ($msg) = @_; - - die("$tool_name: $msg"); -} - - -# -# graph_error(filename, message) -# -# Print message about error in graph file. If ignore_graph_error is set, return. -# Otherwise abort. -# - -sub graph_error($$) -{ - my ($filename, $msg) = @_; - - if ($ignore[$ERROR_GRAPH]) { - warn("WARNING: $filename: $msg - skipping\n"); - return; - } - die("ERROR: $filename: $msg\n"); -} - -# -# graph_expect(description) -# -# If debug is set to a non-zero value, print the specified description of what -# is expected to be read next from the graph file. -# - -sub graph_expect($) -{ - my ($msg) = @_; - - if (!$debug || !defined($msg)) { - return; - } - - print(STDERR "DEBUG: expecting $msg\n"); -} - -# -# graph_read(handle, bytes[, description, peek]) -# -# Read and return the specified number of bytes from handle. Return undef -# if the number of bytes could not be read. If PEEK is non-zero, reset -# file position after read. -# - -sub graph_read(*$;$$) -{ - my ($handle, $length, $desc, $peek) = @_; - my $data; - my $result; - my $pos; - - graph_expect($desc); - if ($peek) { - $pos = tell($handle); - if ($pos == -1) { - warn("Could not get current file position: $!\n"); - return undef; - } - } - $result = read($handle, $data, $length); - if ($debug) { - my $op = $peek ? "peek" : "read"; - my $ascii = ""; - my $hex = ""; - my $i; - - print(STDERR "DEBUG: $op($length)=$result: "); - for ($i = 0; $i < length($data); $i++) { - my $c = substr($data, $i, 1);; - my $n = ord($c); - - $hex .= sprintf("%02x ", $n); - if ($n >= 32 && $n <= 127) { - $ascii .= $c; - } else { - $ascii .= "."; - } - } - print(STDERR "$hex |$ascii|"); - print(STDERR "\n"); - } - if ($peek) { - if (!seek($handle, $pos, 0)) { - warn("Could not set file position: $!\n"); - return undef; - } - } - if ($result != $length) { - return undef; - } - return $data; -} - -# -# graph_skip(handle, bytes[, description]) -# -# Read and discard the specified number of bytes from handle. Return non-zero -# if bytes could be read, zero otherwise. -# - -sub graph_skip(*$;$) -{ - my ($handle, $length, $desc) = @_; - - if (defined(graph_read($handle, $length, $desc))) { - return 1; - } - return 0; -} - -# -# sort_uniq(list) -# -# Return list in numerically ascending order and without duplicate entries. -# - -sub sort_uniq(@) -{ - my (@list) = @_; - my %hash; - - foreach (@list) { - $hash{$_} = 1; - } - return sort { $a <=> $b } keys(%hash); -} - -# -# sort_uniq_lex(list) -# -# Return list in lexically ascending order and without duplicate entries. -# - -sub sort_uniq_lex(@) -{ - my (@list) = @_; - my %hash; - - foreach (@list) { - $hash{$_} = 1; - } - return sort keys(%hash); -} - -# -# parent_dir(dir) -# -# Return parent directory for DIR. DIR must not contain relative path -# components. -# - -sub parent_dir($) -{ - my ($dir) = @_; - my ($v, $d, $f) = splitpath($dir, 1); - my @dirs = splitdir($d); - - pop(@dirs); - - return catpath($v, catdir(@dirs), $f); -} - -# -# find_base_from_graph(base_dir, instr, graph) -# -# Try to determine the base directory of the graph file specified by INSTR -# and GRAPH. The base directory is the base for all relative filenames in -# the graph file. It is defined by the current working directory at time -# of compiling the source file. -# -# This function implements a heuristic which relies on the following -# assumptions: -# - all files used for compilation are still present at their location -# - the base directory is either BASE_DIR or one of its parent directories -# - files by the same name are not present in multiple parent directories -# - -sub find_base_from_graph($$$) -{ - my ($base_dir, $instr, $graph) = @_; - my $old_base; - my $best_miss; - my $best_base; - my %rel_files; - - # Determine list of relative paths - foreach my $filename (keys(%{$instr}), keys(%{$graph})) { - next if (file_name_is_absolute($filename)); - - $rel_files{$filename} = 1; - } - - # Early exit if there are no relative paths - return $base_dir if (!%rel_files); - - do { - my $miss = 0; - - foreach my $filename (keys(%rel_files)) { - if (!-e solve_relative_path($base_dir, $filename)) { - $miss++; - } - } - - debug("base_dir=$base_dir miss=$miss\n"); - - # Exit if we find an exact match with no misses - return $base_dir if ($miss == 0); - - # No exact match, aim for the one with the least source file - # misses - if (!defined($best_base) || $miss < $best_miss) { - $best_base = $base_dir; - $best_miss = $miss; - } - - # Repeat until there's no more parent directory - $old_base = $base_dir; - $base_dir = parent_dir($base_dir); - } while ($old_base ne $base_dir); - - return $best_base; -} - -# -# adjust_graph_filenames(base_dir, instr, graph) -# -# Make relative paths in INSTR and GRAPH absolute and apply -# geninfo_adjust_src_path setting to graph file data. -# - -sub adjust_graph_filenames($$$) -{ - my ($base_dir, $instr, $graph) = @_; - - foreach my $filename (keys(%{$instr})) { - my $old_filename = $filename; - - # Convert to absolute canonical form - $filename = solve_relative_path($base_dir, $filename); - - # Apply adjustment - if (defined($adjust_src_pattern)) { - $filename =~ s/$adjust_src_pattern/$adjust_src_replace/g; - } - - if ($filename ne $old_filename) { - $instr->{$filename} = delete($instr->{$old_filename}); - } - } - - foreach my $filename (keys(%{$graph})) { - my $old_filename = $filename; - - # Make absolute - # Convert to absolute canonical form - $filename = solve_relative_path($base_dir, $filename); - - # Apply adjustment - if (defined($adjust_src_pattern)) { - $filename =~ s/$adjust_src_pattern/$adjust_src_replace/g; - } - - if ($filename ne $old_filename) { - $graph->{$filename} = delete($graph->{$old_filename}); - } - } - - return ($instr, $graph); -} - -# -# graph_cleanup(graph) -# -# Remove entries for functions with no lines. Remove duplicate line numbers. -# Sort list of line numbers numerically ascending. -# - -sub graph_cleanup($) -{ - my ($graph) = @_; - my $filename; - - foreach $filename (keys(%{$graph})) { - my $per_file = $graph->{$filename}; - my $function; - - foreach $function (keys(%{$per_file})) { - my $lines = $per_file->{$function}; - - if (scalar(@$lines) == 0) { - # Remove empty function - delete($per_file->{$function}); - next; - } - # Normalize list - $per_file->{$function} = [ sort_uniq(@$lines) ]; - } - if (scalar(keys(%{$per_file})) == 0) { - # Remove empty file - delete($graph->{$filename}); - } - } -} - -# -# graph_find_base(bb) -# -# Try to identify the filename which is the base source file for the -# specified bb data. -# - -sub graph_find_base($) -{ - my ($bb) = @_; - my %file_count; - my $basefile; - my $file; - my $func; - my $filedata; - my $count; - my $num; - - # Identify base name for this bb data. - foreach $func (keys(%{$bb})) { - $filedata = $bb->{$func}; - - foreach $file (keys(%{$filedata})) { - $count = $file_count{$file}; - - # Count file occurrence - $file_count{$file} = defined($count) ? $count + 1 : 1; - } - } - $count = 0; - $num = 0; - foreach $file (keys(%file_count)) { - if ($file_count{$file} > $count) { - # The file that contains code for the most functions - # is likely the base file - $count = $file_count{$file}; - $num = 1; - $basefile = $file; - } elsif ($file_count{$file} == $count) { - # If more than one file could be the basefile, we - # don't have a basefile - $basefile = undef; - } - } - - return $basefile; -} - -# -# graph_from_bb(bb, fileorder, bb_filename) -# -# Convert data from bb to the graph format and list of instrumented lines. -# Returns (instr, graph). -# -# bb : function name -> file data -# : undef -> file order -# file data : filename -> line data -# line data : [ line1, line2, ... ] -# -# file order : function name -> [ filename1, filename2, ... ] -# -# graph : file name -> function data -# function data : function name -> line data -# line data : [ line1, line2, ... ] -# -# instr : filename -> line data -# line data : [ line1, line2, ... ] -# - -sub graph_from_bb($$$) -{ - my ($bb, $fileorder, $bb_filename) = @_; - my $graph = {}; - my $instr = {}; - my $basefile; - my $file; - my $func; - my $filedata; - my $linedata; - my $order; - - $basefile = graph_find_base($bb); - # Create graph structure - foreach $func (keys(%{$bb})) { - $filedata = $bb->{$func}; - $order = $fileorder->{$func}; - - # Account for lines in functions - if (defined($basefile) && defined($filedata->{$basefile})) { - # If the basefile contributes to this function, - # account this function to the basefile. - $graph->{$basefile}->{$func} = $filedata->{$basefile}; - } else { - # If the basefile does not contribute to this function, - # account this function to the first file contributing - # lines. - $graph->{$order->[0]}->{$func} = - $filedata->{$order->[0]}; - } - - foreach $file (keys(%{$filedata})) { - # Account for instrumented lines - $linedata = $filedata->{$file}; - push(@{$instr->{$file}}, @$linedata); - } - } - # Clean up array of instrumented lines - foreach $file (keys(%{$instr})) { - $instr->{$file} = [ sort_uniq(@{$instr->{$file}}) ]; - } - - return ($instr, $graph); -} - -# -# graph_add_order(fileorder, function, filename) -# -# Add an entry for filename to the fileorder data set for function. -# - -sub graph_add_order($$$) -{ - my ($fileorder, $function, $filename) = @_; - my $item; - my $list; - - $list = $fileorder->{$function}; - foreach $item (@$list) { - if ($item eq $filename) { - return; - } - } - push(@$list, $filename); - $fileorder->{$function} = $list; -} - -# -# read_bb_word(handle[, description]) -# -# Read and return a word in .bb format from handle. -# - -sub read_bb_word(*;$) -{ - my ($handle, $desc) = @_; - - return graph_read($handle, 4, $desc); -} - -# -# read_bb_value(handle[, description]) -# -# Read a word in .bb format from handle and return the word and its integer -# value. -# - -sub read_bb_value(*;$) -{ - my ($handle, $desc) = @_; - my $word; - - $word = read_bb_word($handle, $desc); - return undef if (!defined($word)); - - return ($word, unpack("V", $word)); -} - -# -# read_bb_string(handle, delimiter) -# -# Read and return a string in .bb format from handle up to the specified -# delimiter value. -# - -sub read_bb_string(*$) -{ - my ($handle, $delimiter) = @_; - my $word; - my $value; - my $string = ""; - - graph_expect("string"); - do { - ($word, $value) = read_bb_value($handle, "string or delimiter"); - return undef if (!defined($value)); - if ($value != $delimiter) { - $string .= $word; - } - } while ($value != $delimiter); - $string =~ s/\0//g; - - return $string; -} - -# -# read_bb(filename) -# -# Read the contents of the specified .bb file and return (instr, graph), where: -# -# instr : filename -> line data -# line data : [ line1, line2, ... ] -# -# graph : filename -> file_data -# file_data : function name -> line_data -# line_data : [ line1, line2, ... ] -# -# See the gcov info pages of gcc 2.95 for a description of the .bb file format. -# - -sub read_bb($) -{ - my ($bb_filename) = @_; - my $minus_one = 0x80000001; - my $minus_two = 0x80000002; - my $value; - my $filename; - my $function; - my $bb = {}; - my $fileorder = {}; - my $instr; - my $graph; - local *HANDLE; - - open(HANDLE, "<", $bb_filename) or goto open_error; - binmode(HANDLE); - while (!eof(HANDLE)) { - $value = read_bb_value(*HANDLE, "data word"); - goto incomplete if (!defined($value)); - if ($value == $minus_one) { - # Source file name - graph_expect("filename"); - $filename = read_bb_string(*HANDLE, $minus_one); - goto incomplete if (!defined($filename)); - } elsif ($value == $minus_two) { - # Function name - graph_expect("function name"); - $function = read_bb_string(*HANDLE, $minus_two); - goto incomplete if (!defined($function)); - } elsif ($value > 0) { - # Line number - if (!defined($filename) || !defined($function)) { - warn("WARNING: unassigned line number ". - "$value\n"); - next; - } - push(@{$bb->{$function}->{$filename}}, $value); - graph_add_order($fileorder, $function, $filename); - } - } - close(HANDLE); - ($instr, $graph) = graph_from_bb($bb, $fileorder, $bb_filename); - graph_cleanup($graph); - - return ($instr, $graph); - -open_error: - graph_error($bb_filename, "could not open file"); - return undef; -incomplete: - graph_error($bb_filename, "reached unexpected end of file"); - return undef; -} - -# -# read_bbg_word(handle[, description]) -# -# Read and return a word in .bbg format. -# - -sub read_bbg_word(*;$) -{ - my ($handle, $desc) = @_; - - return graph_read($handle, 4, $desc); -} - -# -# read_bbg_value(handle[, description]) -# -# Read a word in .bbg format from handle and return its integer value. -# - -sub read_bbg_value(*;$) -{ - my ($handle, $desc) = @_; - my $word; - - $word = read_bbg_word($handle, $desc); - return undef if (!defined($word)); - - return unpack("N", $word); -} - -# -# read_bbg_string(handle) -# -# Read and return a string in .bbg format. -# - -sub read_bbg_string(*) -{ - my ($handle, $desc) = @_; - my $length; - my $string; - - graph_expect("string"); - # Read string length - $length = read_bbg_value($handle, "string length"); - return undef if (!defined($length)); - if ($length == 0) { - return ""; - } - # Read string - $string = graph_read($handle, $length, "string"); - return undef if (!defined($string)); - # Skip padding - graph_skip($handle, 4 - $length % 4, "string padding") or return undef; - - return $string; -} - -# -# read_bbg_lines_record(handle, bbg_filename, bb, fileorder, filename, -# function) -# -# Read a bbg format lines record from handle and add the relevant data to -# bb and fileorder. Return filename on success, undef on error. -# - -sub read_bbg_lines_record(*$$$$$) -{ - my ($handle, $bbg_filename, $bb, $fileorder, $filename, $function) = @_; - my $string; - my $lineno; - - graph_expect("lines record"); - # Skip basic block index - graph_skip($handle, 4, "basic block index") or return undef; - while (1) { - # Read line number - $lineno = read_bbg_value($handle, "line number"); - return undef if (!defined($lineno)); - if ($lineno == 0) { - # Got a marker for a new filename - graph_expect("filename"); - $string = read_bbg_string($handle); - return undef if (!defined($string)); - # Check for end of record - if ($string eq "") { - return $filename; - } - $filename = $string; - if (!exists($bb->{$function}->{$filename})) { - $bb->{$function}->{$filename} = []; - } - next; - } - # Got an actual line number - if (!defined($filename)) { - warn("WARNING: unassigned line number in ". - "$bbg_filename\n"); - next; - } - push(@{$bb->{$function}->{$filename}}, $lineno); - graph_add_order($fileorder, $function, $filename); - } -} - -# -# read_bbg(filename) -# -# Read the contents of the specified .bbg file and return the following mapping: -# graph: filename -> file_data -# file_data: function name -> line_data -# line_data: [ line1, line2, ... ] -# -# See the gcov-io.h file in the SLES 9 gcc 3.3.3 source code for a description -# of the .bbg format. -# - -sub read_bbg($) -{ - my ($bbg_filename) = @_; - my $file_magic = 0x67626267; - my $tag_function = 0x01000000; - my $tag_lines = 0x01450000; - my $word; - my $tag; - my $length; - my $function; - my $filename; - my $bb = {}; - my $fileorder = {}; - my $instr; - my $graph; - local *HANDLE; - - open(HANDLE, "<", $bbg_filename) or goto open_error; - binmode(HANDLE); - # Read magic - $word = read_bbg_value(*HANDLE, "file magic"); - goto incomplete if (!defined($word)); - # Check magic - if ($word != $file_magic) { - goto magic_error; - } - # Skip version - graph_skip(*HANDLE, 4, "version") or goto incomplete; - while (!eof(HANDLE)) { - # Read record tag - $tag = read_bbg_value(*HANDLE, "record tag"); - goto incomplete if (!defined($tag)); - # Read record length - $length = read_bbg_value(*HANDLE, "record length"); - goto incomplete if (!defined($tag)); - if ($tag == $tag_function) { - graph_expect("function record"); - # Read function name - graph_expect("function name"); - $function = read_bbg_string(*HANDLE); - goto incomplete if (!defined($function)); - $filename = undef; - # Skip function checksum - graph_skip(*HANDLE, 4, "function checksum") - or goto incomplete; - } elsif ($tag == $tag_lines) { - # Read lines record - $filename = read_bbg_lines_record(HANDLE, $bbg_filename, - $bb, $fileorder, $filename, - $function); - goto incomplete if (!defined($filename)); - } else { - # Skip record contents - graph_skip(*HANDLE, $length, "unhandled record") - or goto incomplete; - } - } - close(HANDLE); - ($instr, $graph) = graph_from_bb($bb, $fileorder, $bbg_filename); - graph_cleanup($graph); - - return ($instr, $graph); - -open_error: - graph_error($bbg_filename, "could not open file"); - return undef; -incomplete: - graph_error($bbg_filename, "reached unexpected end of file"); - return undef; -magic_error: - graph_error($bbg_filename, "found unrecognized bbg file magic"); - return undef; -} - -# -# read_gcno_word(handle[, description, peek]) -# -# Read and return a word in .gcno format. -# - -sub read_gcno_word(*;$$) -{ - my ($handle, $desc, $peek) = @_; - - return graph_read($handle, 4, $desc, $peek); -} - -# -# read_gcno_value(handle, big_endian[, description, peek]) -# -# Read a word in .gcno format from handle and return its integer value -# according to the specified endianness. If PEEK is non-zero, reset file -# position after read. -# - -sub read_gcno_value(*$;$$) -{ - my ($handle, $big_endian, $desc, $peek) = @_; - my $word; - my $pos; - - $word = read_gcno_word($handle, $desc, $peek); - return undef if (!defined($word)); - if ($big_endian) { - return unpack("N", $word); - } else { - return unpack("V", $word); - } -} - -# -# read_gcno_string(handle, big_endian) -# -# Read and return a string in .gcno format. -# - -sub read_gcno_string(*$) -{ - my ($handle, $big_endian) = @_; - my $length; - my $string; - - graph_expect("string"); - # Read string length - $length = read_gcno_value($handle, $big_endian, "string length"); - return undef if (!defined($length)); - if ($length == 0) { - return ""; - } - $length *= 4; - # Read string - $string = graph_read($handle, $length, "string and padding"); - return undef if (!defined($string)); - $string =~ s/\0//g; - - return $string; -} - -# -# read_gcno_lines_record(handle, gcno_filename, bb, fileorder, filename, -# function, big_endian) -# -# Read a gcno format lines record from handle and add the relevant data to -# bb and fileorder. Return filename on success, undef on error. -# - -sub read_gcno_lines_record(*$$$$$$) -{ - my ($handle, $gcno_filename, $bb, $fileorder, $filename, $function, - $big_endian) = @_; - my $string; - my $lineno; - - graph_expect("lines record"); - # Skip basic block index - graph_skip($handle, 4, "basic block index") or return undef; - while (1) { - # Read line number - $lineno = read_gcno_value($handle, $big_endian, "line number"); - return undef if (!defined($lineno)); - if ($lineno == 0) { - # Got a marker for a new filename - graph_expect("filename"); - $string = read_gcno_string($handle, $big_endian); - return undef if (!defined($string)); - # Check for end of record - if ($string eq "") { - return $filename; - } - $filename = $string; - if (!exists($bb->{$function}->{$filename})) { - $bb->{$function}->{$filename} = []; - } - next; - } - # Got an actual line number - if (!defined($filename)) { - warn("WARNING: unassigned line number in ". - "$gcno_filename\n"); - next; - } - # Add to list - push(@{$bb->{$function}->{$filename}}, $lineno); - graph_add_order($fileorder, $function, $filename); - } -} - -# -# determine_gcno_split_crc(handle, big_endian, rec_length) -# -# Determine if HANDLE refers to a .gcno file with a split checksum function -# record format. Return non-zero in case of split checksum format, zero -# otherwise, undef in case of read error. -# - -sub determine_gcno_split_crc($$$) -{ - my ($handle, $big_endian, $rec_length) = @_; - my $strlen; - my $overlong_string; - - return 1 if ($gcov_version >= $GCOV_VERSION_4_7_0); - return 1 if (is_compat($COMPAT_MODE_SPLIT_CRC)); - - # Heuristic: - # Decide format based on contents of next word in record: - # - pre-gcc 4.7 - # This is the function name length / 4 which should be - # less than the remaining record length - # - gcc 4.7 - # This is a checksum, likely with high-order bits set, - # resulting in a large number - $strlen = read_gcno_value($handle, $big_endian, undef, 1); - return undef if (!defined($strlen)); - $overlong_string = 1 if ($strlen * 4 >= $rec_length - 12); - - if ($overlong_string) { - if (is_compat_auto($COMPAT_MODE_SPLIT_CRC)) { - info("Auto-detected compatibility mode for split ". - "checksum .gcno file format\n"); - - return 1; - } else { - # Sanity check - warn("Found overlong string in function record: ". - "try '--compat split_crc'\n"); - } - } - - return 0; -} - -# -# read_gcno_function_record(handle, graph, big_endian, rec_length) -# -# Read a gcno format function record from handle and add the relevant data -# to graph. Return (filename, function) on success, undef on error. -# - -sub read_gcno_function_record(*$$$$) -{ - my ($handle, $bb, $fileorder, $big_endian, $rec_length) = @_; - my $filename; - my $function; - my $lineno; - my $lines; - - graph_expect("function record"); - # Skip ident and checksum - graph_skip($handle, 8, "function ident and checksum") or return undef; - # Determine if this is a function record with split checksums - if (!defined($gcno_split_crc)) { - $gcno_split_crc = determine_gcno_split_crc($handle, $big_endian, - $rec_length); - return undef if (!defined($gcno_split_crc)); - } - # Skip cfg checksum word in case of split checksums - graph_skip($handle, 4, "function cfg checksum") if ($gcno_split_crc); - # Read function name - graph_expect("function name"); - $function = read_gcno_string($handle, $big_endian); - return undef if (!defined($function)); - # Read filename - graph_expect("filename"); - $filename = read_gcno_string($handle, $big_endian); - return undef if (!defined($filename)); - # Read first line number - $lineno = read_gcno_value($handle, $big_endian, "initial line number"); - return undef if (!defined($lineno)); - # Add to list - push(@{$bb->{$function}->{$filename}}, $lineno); - graph_add_order($fileorder, $function, $filename); - - return ($filename, $function); -} - -# -# read_gcno(filename) -# -# Read the contents of the specified .gcno file and return the following -# mapping: -# graph: filename -> file_data -# file_data: function name -> line_data -# line_data: [ line1, line2, ... ] -# -# See the gcov-io.h file in the gcc 3.3 source code for a description of -# the .gcno format. -# - -sub read_gcno($) -{ - my ($gcno_filename) = @_; - my $file_magic = 0x67636e6f; - my $tag_function = 0x01000000; - my $tag_lines = 0x01450000; - my $big_endian; - my $word; - my $tag; - my $length; - my $filename; - my $function; - my $bb = {}; - my $fileorder = {}; - my $instr; - my $graph; - my $filelength; - local *HANDLE; - - open(HANDLE, "<", $gcno_filename) or goto open_error; - $filelength = (stat(HANDLE))[7]; - binmode(HANDLE); - # Read magic - $word = read_gcno_word(*HANDLE, "file magic"); - goto incomplete if (!defined($word)); - # Determine file endianness - if (unpack("N", $word) == $file_magic) { - $big_endian = 1; - } elsif (unpack("V", $word) == $file_magic) { - $big_endian = 0; - } else { - goto magic_error; - } - # Skip version and stamp - graph_skip(*HANDLE, 8, "version and stamp") or goto incomplete; - while (!eof(HANDLE)) { - my $next_pos; - my $curr_pos; - - # Read record tag - $tag = read_gcno_value(*HANDLE, $big_endian, "record tag"); - goto incomplete if (!defined($tag)); - # Read record length - $length = read_gcno_value(*HANDLE, $big_endian, - "record length"); - goto incomplete if (!defined($length)); - # Convert length to bytes - $length *= 4; - # Calculate start of next record - $next_pos = tell(HANDLE); - goto tell_error if ($next_pos == -1); - $next_pos += $length; - # Catch garbage at the end of a gcno file - if ($next_pos > $filelength) { - debug("Overlong record: file_length=$filelength ". - "rec_length=$length\n"); - warn("WARNING: $gcno_filename: Overlong record at end ". - "of file!\n"); - last; - } - # Process record - if ($tag == $tag_function) { - ($filename, $function) = read_gcno_function_record( - *HANDLE, $bb, $fileorder, $big_endian, - $length); - goto incomplete if (!defined($function)); - } elsif ($tag == $tag_lines) { - # Read lines record - $filename = read_gcno_lines_record(*HANDLE, - $gcno_filename, $bb, $fileorder, - $filename, $function, - $big_endian); - goto incomplete if (!defined($filename)); - } else { - # Skip record contents - graph_skip(*HANDLE, $length, "unhandled record") - or goto incomplete; - } - # Ensure that we are at the start of the next record - $curr_pos = tell(HANDLE); - goto tell_error if ($curr_pos == -1); - next if ($curr_pos == $next_pos); - goto record_error if ($curr_pos > $next_pos); - graph_skip(*HANDLE, $next_pos - $curr_pos, - "unhandled record content") - or goto incomplete; - } - close(HANDLE); - ($instr, $graph) = graph_from_bb($bb, $fileorder, $gcno_filename); - graph_cleanup($graph); - - return ($instr, $graph); - -open_error: - graph_error($gcno_filename, "could not open file"); - return undef; -incomplete: - graph_error($gcno_filename, "reached unexpected end of file"); - return undef; -magic_error: - graph_error($gcno_filename, "found unrecognized gcno file magic"); - return undef; -tell_error: - graph_error($gcno_filename, "could not determine file position"); - return undef; -record_error: - graph_error($gcno_filename, "found unrecognized record format"); - return undef; -} - -sub debug($) -{ - my ($msg) = @_; - - return if (!$debug); - print(STDERR "DEBUG: $msg"); -} - -# -# get_gcov_capabilities -# -# Determine the list of available gcov options. -# - -sub get_gcov_capabilities() -{ - my $help = `$gcov_tool --help`; - my %capabilities; - my %short_option_translations = ( - 'a' => 'all-blocks', - 'b' => 'branch-probabilities', - 'c' => 'branch-counts', - 'f' => 'function-summaries', - 'h' => 'help', - 'l' => 'long-file-names', - 'n' => 'no-output', - 'o' => 'object-directory', - 'p' => 'preserve-paths', - 'u' => 'unconditional-branches', - 'v' => 'version', - ); - - foreach (split(/\n/, $help)) { - my $capability; - if (/--(\S+)/) { - $capability = $1; - } else { - # If the line provides a short option, translate it. - next if (!/^\s*-(\S)\s/); - $capability = $short_option_translations{$1}; - next if not defined($capability); - } - next if ($capability eq 'help'); - next if ($capability eq 'version'); - next if ($capability eq 'object-directory'); - - $capabilities{$capability} = 1; - debug("gcov has capability '$capability'\n"); - } - - return \%capabilities; -} - -# -# parse_ignore_errors(@ignore_errors) -# -# Parse user input about which errors to ignore. -# - -sub parse_ignore_errors(@) -{ - my (@ignore_errors) = @_; - my @items; - my $item; - - return if (!@ignore_errors); - - foreach $item (@ignore_errors) { - $item =~ s/\s//g; - if ($item =~ /,/) { - # Split and add comma-separated parameters - push(@items, split(/,/, $item)); - } else { - # Add single parameter - push(@items, $item); - } - } - foreach $item (@items) { - my $item_id = $ERROR_ID{lc($item)}; - - if (!defined($item_id)) { - die("ERROR: unknown argument for --ignore-errors: ". - "$item\n"); - } - $ignore[$item_id] = 1; - } -} - -# -# is_external(filename) -# -# Determine if a file is located outside of the specified data directories. -# - -sub is_external($) -{ - my ($filename) = @_; - my $dir; - - foreach $dir (@internal_dirs) { - return 0 if ($filename =~ /^\Q$dir\/\E/); - } - return 1; -} - -# -# compat_name(mode) -# -# Return the name of compatibility mode MODE. -# - -sub compat_name($) -{ - my ($mode) = @_; - my $name = $COMPAT_MODE_TO_NAME{$mode}; - - return $name if (defined($name)); - - return ""; -} - -# -# parse_compat_modes(opt) -# -# Determine compatibility mode settings. -# - -sub parse_compat_modes($) -{ - my ($opt) = @_; - my @opt_list; - my %specified; - - # Initialize with defaults - %compat_value = %COMPAT_MODE_DEFAULTS; - - # Add old style specifications - if (defined($opt_compat_libtool)) { - $compat_value{$COMPAT_MODE_LIBTOOL} = - $opt_compat_libtool ? $COMPAT_VALUE_ON - : $COMPAT_VALUE_OFF; - } - - # Parse settings - if (defined($opt)) { - @opt_list = split(/\s*,\s*/, $opt); - } - foreach my $directive (@opt_list) { - my ($mode, $value); - - # Either - # mode=off|on|auto or - # mode (implies on) - if ($directive !~ /^(\w+)=(\w+)$/ && - $directive !~ /^(\w+)$/) { - die("ERROR: Unknown compatibility mode specification: ". - "$directive!\n"); - } - # Determine mode - $mode = $COMPAT_NAME_TO_MODE{lc($1)}; - if (!defined($mode)) { - die("ERROR: Unknown compatibility mode '$1'!\n"); - } - $specified{$mode} = 1; - # Determine value - if (defined($2)) { - $value = $COMPAT_NAME_TO_VALUE{lc($2)}; - if (!defined($value)) { - die("ERROR: Unknown compatibility mode ". - "value '$2'!\n"); - } - } else { - $value = $COMPAT_VALUE_ON; - } - $compat_value{$mode} = $value; - } - # Perform auto-detection - foreach my $mode (sort(keys(%compat_value))) { - my $value = $compat_value{$mode}; - my $is_autodetect = ""; - my $name = compat_name($mode); - - if ($value == $COMPAT_VALUE_AUTO) { - my $autodetect = $COMPAT_MODE_AUTO{$mode}; - - if (!defined($autodetect)) { - die("ERROR: No auto-detection for ". - "mode '$name' available!\n"); - } - - if (ref($autodetect) eq "CODE") { - $value = &$autodetect(); - $compat_value{$mode} = $value; - $is_autodetect = " (auto-detected)"; - } - } - - if ($specified{$mode}) { - if ($value == $COMPAT_VALUE_ON) { - info("Enabling compatibility mode ". - "'$name'$is_autodetect\n"); - } elsif ($value == $COMPAT_VALUE_OFF) { - info("Disabling compatibility mode ". - "'$name'$is_autodetect\n"); - } else { - info("Using delayed auto-detection for ". - "compatibility mode ". - "'$name'\n"); - } - } - } -} - -sub compat_hammer_autodetect() -{ - if ($gcov_version_string =~ /suse/i && $gcov_version == 0x30303 || - $gcov_version_string =~ /mandrake/i && $gcov_version == 0x30302) - { - info("Auto-detected compatibility mode for GCC 3.3 (hammer)\n"); - return $COMPAT_VALUE_ON; - } - return $COMPAT_VALUE_OFF; -} - -# -# is_compat(mode) -# -# Return non-zero if compatibility mode MODE is enabled. -# - -sub is_compat($) -{ - my ($mode) = @_; - - return 1 if ($compat_value{$mode} == $COMPAT_VALUE_ON); - return 0; -} - -# -# is_compat_auto(mode) -# -# Return non-zero if compatibility mode MODE is set to auto-detect. -# - -sub is_compat_auto($) -{ - my ($mode) = @_; - - return 1 if ($compat_value{$mode} == $COMPAT_VALUE_AUTO); - return 0; -} diff --git a/utils/lcov-1.11/bin/genpng b/utils/lcov-1.11/bin/genpng deleted file mode 100755 index 42cbde81..00000000 --- a/utils/lcov-1.11/bin/genpng +++ /dev/null @@ -1,389 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (c) International Business Machines Corp., 2002 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# genpng -# -# This script creates an overview PNG image of a source code file by -# representing each source code character by a single pixel. -# -# Note that the Perl module GD.pm is required for this script to work. -# It may be obtained from http://www.cpan.org -# -# History: -# 2002-08-26: created by Peter Oberparleiter -# - -use strict; -use File::Basename; -use Getopt::Long; - - -# Constants -our $lcov_version = 'LCOV version 1.11'; -our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; -our $tool_name = basename($0); - - -# Prototypes -sub gen_png($$$@); -sub check_and_load_module($); -sub genpng_print_usage(*); -sub genpng_process_file($$$$); -sub genpng_warn_handler($); -sub genpng_die_handler($); - - -# -# Code entry point -# - -# Prettify version string -$lcov_version =~ s/\$\s*Revision\s*:?\s*(\S+)\s*\$/$1/; - -# Check whether required module GD.pm is installed -if (check_and_load_module("GD")) -{ - # Note: cannot use die() to print this message because inserting this - # code into another script via do() would not fail as required! - print(STDERR < \$tab_size, - "width=i" => \$width, - "output-filename=s" => \$out_filename, - "help" => \$help, - "version" => \$version)) - { - print(STDERR "Use $tool_name --help to get usage ". - "information\n"); - exit(1); - } - - $filename = $ARGV[0]; - - # Check for help flag - if ($help) - { - genpng_print_usage(*STDOUT); - exit(0); - } - - # Check for version flag - if ($version) - { - print("$tool_name: $lcov_version\n"); - exit(0); - } - - # Check options - if (!$filename) - { - die("No filename specified\n"); - } - - # Check for output filename - if (!$out_filename) - { - $out_filename = "$filename.png"; - } - - genpng_process_file($filename, $out_filename, $width, $tab_size); - exit(0); -} - - -# -# genpng_print_usage(handle) -# -# Write out command line usage information to given filehandle. -# - -sub genpng_print_usage(*) -{ - local *HANDLE = $_[0]; - - print(HANDLE <) - { - if (/^\t\t(.*)$/) - { - # Uninstrumented line - push(@source, ":$1"); - } - elsif (/^ ###### (.*)$/) - { - # Line with zero execution count - push(@source, "0:$1"); - } - elsif (/^( *)(\d*) (.*)$/) - { - # Line with positive execution count - push(@source, "$2:$3"); - } - } - } - else - { - # Plain text file - while () { push(@source, ":$_"); } - } - close(HANDLE); - - gen_png($out_filename, $width, $tab_size, @source); -} - - -# -# gen_png(filename, width, tab_size, source) -# -# Write an overview PNG file to FILENAME. Source code is defined by SOURCE -# which is a list of lines : per source code line. -# The output image will be made up of one pixel per character of source, -# coloring will be done according to execution counts. WIDTH defines the -# image width. TAB_SIZE specifies the number of spaces to use as replacement -# string for tabulator signs in source code text. -# -# Die on error. -# - -sub gen_png($$$@) -{ - my $filename = shift(@_); # Filename for PNG file - my $overview_width = shift(@_); # Imagewidth for image - my $tab_size = shift(@_); # Replacement string for tab signs - my @source = @_; # Source code as passed via argument 2 - my $height; # Height as define by source size - my $overview; # Source code overview image data - my $col_plain_back; # Color for overview background - my $col_plain_text; # Color for uninstrumented text - my $col_cov_back; # Color for background of covered lines - my $col_cov_text; # Color for text of covered lines - my $col_nocov_back; # Color for background of lines which - # were not covered (count == 0) - my $col_nocov_text; # Color for test of lines which were not - # covered (count == 0) - my $col_hi_back; # Color for background of highlighted lines - my $col_hi_text; # Color for text of highlighted lines - my $line; # Current line during iteration - my $row = 0; # Current row number during iteration - my $column; # Current column number during iteration - my $color_text; # Current text color during iteration - my $color_back; # Current background color during iteration - my $last_count; # Count of last processed line - my $count; # Count of current line - my $source; # Source code of current line - my $replacement; # Replacement string for tabulator chars - local *PNG_HANDLE; # Handle for output PNG file - - # Handle empty source files - if (!@source) { - @source = ( "" ); - } - $height = scalar(@source); - # Create image - $overview = new GD::Image($overview_width, $height) - or die("ERROR: cannot allocate overview image!\n"); - - # Define colors - $col_plain_back = $overview->colorAllocate(0xff, 0xff, 0xff); - $col_plain_text = $overview->colorAllocate(0xaa, 0xaa, 0xaa); - $col_cov_back = $overview->colorAllocate(0xaa, 0xa7, 0xef); - $col_cov_text = $overview->colorAllocate(0x5d, 0x5d, 0xea); - $col_nocov_back = $overview->colorAllocate(0xff, 0x00, 0x00); - $col_nocov_text = $overview->colorAllocate(0xaa, 0x00, 0x00); - $col_hi_back = $overview->colorAllocate(0x00, 0xff, 0x00); - $col_hi_text = $overview->colorAllocate(0x00, 0xaa, 0x00); - - # Visualize each line - foreach $line (@source) - { - # Replace tabs with spaces to keep consistent with source - # code view - while ($line =~ /^([^\t]*)(\t)/) - { - $replacement = " "x($tab_size - ((length($1) - 1) % - $tab_size)); - $line =~ s/^([^\t]*)(\t)/$1$replacement/; - } - - # Skip lines which do not follow the : - # specification, otherwise $1 = count, $2 = source code - if (!($line =~ /(\*?)(\d*):(.*)$/)) { next; } - $count = $2; - $source = $3; - - # Decide which color pair to use - - # If this line was not instrumented but the one before was, - # take the color of that line to widen color areas in - # resulting image - if (($count eq "") && defined($last_count) && - ($last_count ne "")) - { - $count = $last_count; - } - - if ($count eq "") - { - # Line was not instrumented - $color_text = $col_plain_text; - $color_back = $col_plain_back; - } - elsif ($count == 0) - { - # Line was instrumented but not executed - $color_text = $col_nocov_text; - $color_back = $col_nocov_back; - } - elsif ($1 eq "*") - { - # Line was highlighted - $color_text = $col_hi_text; - $color_back = $col_hi_back; - } - else - { - # Line was instrumented and executed - $color_text = $col_cov_text; - $color_back = $col_cov_back; - } - - # Write one pixel for each source character - $column = 0; - foreach (split("", $source)) - { - # Check for width - if ($column >= $overview_width) { last; } - - if ($_ eq " ") - { - # Space - $overview->setPixel($column++, $row, - $color_back); - } - else - { - # Text - $overview->setPixel($column++, $row, - $color_text); - } - } - - # Fill rest of line - while ($column < $overview_width) - { - $overview->setPixel($column++, $row, $color_back); - } - - $last_count = $2; - - $row++; - } - - # Write PNG file - open (PNG_HANDLE, ">", $filename) - or die("ERROR: cannot write png file $filename!\n"); - binmode(*PNG_HANDLE); - print(PNG_HANDLE $overview->png()); - close(PNG_HANDLE); -} - -sub genpng_warn_handler($) -{ - my ($msg) = @_; - - warn("$tool_name: $msg"); -} - -sub genpng_die_handler($) -{ - my ($msg) = @_; - - die("$tool_name: $msg"); -} diff --git a/utils/lcov-1.11/bin/install.sh b/utils/lcov-1.11/bin/install.sh deleted file mode 100755 index 27140f91..00000000 --- a/utils/lcov-1.11/bin/install.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash -# -# install.sh [--uninstall] sourcefile targetfile [install options] -# - - -# Check for uninstall option -if test "x$1" == "x--uninstall" ; then - UNINSTALL=true - SOURCE=$2 - TARGET=$3 - shift 3 -else - UNINSTALL=false - SOURCE=$1 - TARGET=$2 - shift 2 -fi - -# Check usage -if test -z "$SOURCE" || test -z "$TARGET" ; then - echo Usage: install.sh [--uninstall] source target [install options] >&2 - exit 1 -fi - - -# -# do_install(SOURCE_FILE, TARGET_FILE) -# - -do_install() -{ - local SOURCE=$1 - local TARGET=$2 - local PARAMS=$3 - - install -p -D $PARAMS $SOURCE $TARGET -} - - -# -# do_uninstall(SOURCE_FILE, TARGET_FILE) -# - -do_uninstall() -{ - local SOURCE=$1 - local TARGET=$2 - - # Does target exist? - if test -r $TARGET ; then - # Is target of the same version as this package? - if diff $SOURCE $TARGET >/dev/null; then - rm -f $TARGET - else - echo WARNING: Skipping uninstall for $TARGET - versions differ! >&2 - fi - else - echo WARNING: Skipping uninstall for $TARGET - not installed! >&2 - fi -} - - -# Call sub routine -if $UNINSTALL ; then - do_uninstall $SOURCE $TARGET -else - do_install $SOURCE $TARGET "$*" -fi - -exit 0 diff --git a/utils/lcov-1.11/bin/lcov b/utils/lcov-1.11/bin/lcov deleted file mode 100755 index f4005320..00000000 --- a/utils/lcov-1.11/bin/lcov +++ /dev/null @@ -1,4325 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (c) International Business Machines Corp., 2002,2012 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# lcov -# -# This is a wrapper script which provides a single interface for accessing -# LCOV coverage data. -# -# -# History: -# 2002-08-29 created by Peter Oberparleiter -# IBM Lab Boeblingen -# 2002-09-05 / Peter Oberparleiter: implemented --kernel-directory + -# multiple directories -# 2002-10-16 / Peter Oberparleiter: implemented --add-tracefile option -# 2002-10-17 / Peter Oberparleiter: implemented --extract option -# 2002-11-04 / Peter Oberparleiter: implemented --list option -# 2003-03-07 / Paul Larson: Changed to make it work with the latest gcov -# kernel patch. This will break it with older gcov-kernel -# patches unless you change the value of $gcovmod in this script -# 2003-04-07 / Peter Oberparleiter: fixed bug which resulted in an error -# when trying to combine .info files containing data without -# a test name -# 2003-04-10 / Peter Oberparleiter: extended Paul's change so that LCOV -# works both with the new and the old gcov-kernel patch -# 2003-04-10 / Peter Oberparleiter: added $gcov_dir constant in anticipation -# of a possible move of the gcov kernel directory to another -# file system in a future version of the gcov-kernel patch -# 2003-04-15 / Paul Larson: make info write to STDERR, not STDOUT -# 2003-04-15 / Paul Larson: added --remove option -# 2003-04-30 / Peter Oberparleiter: renamed --reset to --zerocounters -# to remove naming ambiguity with --remove -# 2003-04-30 / Peter Oberparleiter: adjusted help text to include --remove -# 2003-06-27 / Peter Oberparleiter: implemented --diff -# 2003-07-03 / Peter Oberparleiter: added line checksum support, added -# --no-checksum -# 2003-12-11 / Laurent Deniel: added --follow option -# 2004-03-29 / Peter Oberparleiter: modified --diff option to better cope with -# ambiguous patch file entries, modified --capture option to use -# modprobe before insmod (needed for 2.6) -# 2004-03-30 / Peter Oberparleiter: added --path option -# 2004-08-09 / Peter Oberparleiter: added configuration file support -# 2008-08-13 / Peter Oberparleiter: added function coverage support -# - -use strict; -use File::Basename; -use File::Path; -use File::Find; -use File::Temp qw /tempdir/; -use File::Spec::Functions qw /abs2rel canonpath catdir catfile catpath - file_name_is_absolute rootdir splitdir splitpath/; -use Getopt::Long; -use Cwd qw /abs_path getcwd/; - - -# Global constants -our $lcov_version = 'LCOV version 1.11'; -our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; -our $tool_name = basename($0); - -# Directory containing gcov kernel files -our $gcov_dir; - -# Where to create temporary directories -our $tmp_dir; - -# Internal constants -our $GKV_PROC = 0; # gcov-kernel data in /proc via external patch -our $GKV_SYS = 1; # gcov-kernel data in /sys via vanilla 2.6.31+ -our @GKV_NAME = ( "external", "upstream" ); -our $pkg_gkv_file = ".gcov_kernel_version"; -our $pkg_build_file = ".build_directory"; - -our $BR_BLOCK = 0; -our $BR_BRANCH = 1; -our $BR_TAKEN = 2; -our $BR_VEC_ENTRIES = 3; -our $BR_VEC_WIDTH = 32; -our $BR_VEC_MAX = vec(pack('b*', 1 x $BR_VEC_WIDTH), 0, $BR_VEC_WIDTH); - -# Branch data combination types -our $BR_SUB = 0; -our $BR_ADD = 1; - -# Prototypes -sub print_usage(*); -sub check_options(); -sub userspace_reset(); -sub userspace_capture(); -sub kernel_reset(); -sub kernel_capture(); -sub kernel_capture_initial(); -sub package_capture(); -sub add_traces(); -sub read_info_file($); -sub get_info_entry($); -sub set_info_entry($$$$$$$$$;$$$$$$); -sub add_counts($$); -sub merge_checksums($$$); -sub combine_info_entries($$$); -sub combine_info_files($$); -sub write_info_file(*$); -sub extract(); -sub remove(); -sub list(); -sub get_common_filename($$); -sub read_diff($); -sub diff(); -sub system_no_output($@); -sub read_config($); -sub apply_config($); -sub info(@); -sub create_temp_dir(); -sub transform_pattern($); -sub warn_handler($); -sub die_handler($); -sub abort_handler($); -sub temp_cleanup(); -sub setup_gkv(); -sub get_overall_line($$$$); -sub print_overall_rate($$$$$$$$$); -sub lcov_geninfo(@); -sub create_package($$$;$); -sub get_func_found_and_hit($); -sub br_ivec_get($$); -sub summary(); -sub rate($$;$$$); - -# Global variables & initialization -our @directory; # Specifies where to get coverage data from -our @kernel_directory; # If set, captures only from specified kernel subdirs -our @add_tracefile; # If set, reads in and combines all files in list -our $list; # If set, list contents of tracefile -our $extract; # If set, extracts parts of tracefile -our $remove; # If set, removes parts of tracefile -our $diff; # If set, modifies tracefile according to diff -our $reset; # If set, reset all coverage data to zero -our $capture; # If set, capture data -our $output_filename; # Name for file to write coverage data to -our $test_name = ""; # Test case name -our $quiet = ""; # If set, suppress information messages -our $help; # Help option flag -our $version; # Version option flag -our $convert_filenames; # If set, convert filenames when applying diff -our $strip; # If set, strip leading directories when applying diff -our $temp_dir_name; # Name of temporary directory -our $cwd = `pwd`; # Current working directory -our $to_file; # If set, indicates that output is written to a file -our $follow; # If set, indicates that find shall follow links -our $diff_path = ""; # Path removed from tracefile when applying diff -our $base_directory; # Base directory (cwd of gcc during compilation) -our $checksum; # If set, calculate a checksum for each line -our $no_checksum; # If set, don't calculate a checksum for each line -our $compat_libtool; # If set, indicates that libtool mode is to be enabled -our $no_compat_libtool; # If set, indicates that libtool mode is to be disabled -our $gcov_tool; -our @opt_ignore_errors; -our $initial; -our $no_recursion = 0; -our $to_package; -our $from_package; -our $maxdepth; -our $no_markers; -our $config; # Configuration file contents -chomp($cwd); -our $tool_dir = dirname($0); # Directory where genhtml tool is installed -our @temp_dirs; -our $gcov_gkv; # gcov kernel support version found on machine -our $opt_derive_func_data; -our $opt_debug; -our $opt_list_full_path; -our $opt_no_list_full_path; -our $opt_list_width = 80; -our $opt_list_truncate_max = 20; -our $opt_external; -our $opt_no_external; -our $opt_config_file; -our %opt_rc; -our @opt_summary; -our $opt_compat; -our $ln_overall_found; -our $ln_overall_hit; -our $fn_overall_found; -our $fn_overall_hit; -our $br_overall_found; -our $br_overall_hit; -our $func_coverage = 1; -our $br_coverage = 0; - - -# -# Code entry point -# - -$SIG{__WARN__} = \&warn_handler; -$SIG{__DIE__} = \&die_handler; -$SIG{'INT'} = \&abort_handler; -$SIG{'QUIT'} = \&abort_handler; - -# Prettify version string -$lcov_version =~ s/\$\s*Revision\s*:?\s*(\S+)\s*\$/$1/; - -# Add current working directory if $tool_dir is not already an absolute path -if (! ($tool_dir =~ /^\/(.*)$/)) -{ - $tool_dir = "$cwd/$tool_dir"; -} - -# Check command line for a configuration file name -Getopt::Long::Configure("pass_through", "no_auto_abbrev"); -GetOptions("config-file=s" => \$opt_config_file, - "rc=s%" => \%opt_rc); -Getopt::Long::Configure("default"); - -# Remove spaces around rc options -while (my ($key, $value) = each(%opt_rc)) { - delete($opt_rc{$key}); - - $key =~ s/^\s+|\s+$//g; - $value =~ s/^\s+|\s+$//g; - - $opt_rc{$key} = $value; -} - -# Read configuration file if available -if (defined($opt_config_file)) { - $config = read_config($opt_config_file); -} elsif (defined($ENV{"HOME"}) && (-r $ENV{"HOME"}."/.lcovrc")) -{ - $config = read_config($ENV{"HOME"}."/.lcovrc"); -} -elsif (-r "/etc/lcovrc") -{ - $config = read_config("/etc/lcovrc"); -} - -if ($config || %opt_rc) -{ - # Copy configuration file and --rc values to variables - apply_config({ - "lcov_gcov_dir" => \$gcov_dir, - "lcov_tmp_dir" => \$tmp_dir, - "lcov_list_full_path" => \$opt_list_full_path, - "lcov_list_width" => \$opt_list_width, - "lcov_list_truncate_max"=> \$opt_list_truncate_max, - "lcov_branch_coverage" => \$br_coverage, - "lcov_function_coverage"=> \$func_coverage, - }); -} - -# Parse command line options -if (!GetOptions("directory|d|di=s" => \@directory, - "add-tracefile|a=s" => \@add_tracefile, - "list|l=s" => \$list, - "kernel-directory|k=s" => \@kernel_directory, - "extract|e=s" => \$extract, - "remove|r=s" => \$remove, - "diff=s" => \$diff, - "convert-filenames" => \$convert_filenames, - "strip=i" => \$strip, - "capture|c" => \$capture, - "output-file|o=s" => \$output_filename, - "test-name|t=s" => \$test_name, - "zerocounters|z" => \$reset, - "quiet|q" => \$quiet, - "help|h|?" => \$help, - "version|v" => \$version, - "follow|f" => \$follow, - "path=s" => \$diff_path, - "base-directory|b=s" => \$base_directory, - "checksum" => \$checksum, - "no-checksum" => \$no_checksum, - "compat-libtool" => \$compat_libtool, - "no-compat-libtool" => \$no_compat_libtool, - "gcov-tool=s" => \$gcov_tool, - "ignore-errors=s" => \@opt_ignore_errors, - "initial|i" => \$initial, - "no-recursion" => \$no_recursion, - "to-package=s" => \$to_package, - "from-package=s" => \$from_package, - "no-markers" => \$no_markers, - "derive-func-data" => \$opt_derive_func_data, - "debug" => \$opt_debug, - "list-full-path" => \$opt_list_full_path, - "no-list-full-path" => \$opt_no_list_full_path, - "external" => \$opt_external, - "no-external" => \$opt_no_external, - "summary=s" => \@opt_summary, - "compat=s" => \$opt_compat, - "config-file=s" => \$opt_config_file, - "rc=s%" => \%opt_rc, - )) -{ - print(STDERR "Use $tool_name --help to get usage information\n"); - exit(1); -} -else -{ - # Merge options - if (defined($no_checksum)) - { - $checksum = ($no_checksum ? 0 : 1); - $no_checksum = undef; - } - - if (defined($no_compat_libtool)) - { - $compat_libtool = ($no_compat_libtool ? 0 : 1); - $no_compat_libtool = undef; - } - - if (defined($opt_no_list_full_path)) - { - $opt_list_full_path = ($opt_no_list_full_path ? 0 : 1); - $opt_no_list_full_path = undef; - } - - if (defined($opt_no_external)) { - $opt_external = 0; - $opt_no_external = undef; - } -} - -# Check for help option -if ($help) -{ - print_usage(*STDOUT); - exit(0); -} - -# Check for version option -if ($version) -{ - print("$tool_name: $lcov_version\n"); - exit(0); -} - -# Check list width option -if ($opt_list_width <= 40) { - die("ERROR: lcov_list_width parameter out of range (needs to be ". - "larger than 40)\n"); -} - -# Normalize --path text -$diff_path =~ s/\/$//; - -if ($follow) -{ - $follow = "-follow"; -} -else -{ - $follow = ""; -} - -if ($no_recursion) -{ - $maxdepth = "-maxdepth 1"; -} -else -{ - $maxdepth = ""; -} - -# Check for valid options -check_options(); - -# Only --extract, --remove and --diff allow unnamed parameters -if (@ARGV && !($extract || $remove || $diff || @opt_summary)) -{ - die("Extra parameter found: '".join(" ", @ARGV)."'\n". - "Use $tool_name --help to get usage information\n"); -} - -# Check for output filename -$to_file = ($output_filename && ($output_filename ne "-")); - -if ($capture) -{ - if (!$to_file) - { - # Option that tells geninfo to write to stdout - $output_filename = "-"; - } -} - -# Determine kernel directory for gcov data -if (!$from_package && !@directory && ($capture || $reset)) { - ($gcov_gkv, $gcov_dir) = setup_gkv(); -} - -# Check for requested functionality -if ($reset) -{ - # Differentiate between user space and kernel reset - if (@directory) - { - userspace_reset(); - } - else - { - kernel_reset(); - } -} -elsif ($capture) -{ - # Capture source can be user space, kernel or package - if ($from_package) { - package_capture(); - } elsif (@directory) { - userspace_capture(); - } else { - if ($initial) { - if (defined($to_package)) { - die("ERROR: --initial cannot be used together ". - "with --to-package\n"); - } - kernel_capture_initial(); - } else { - kernel_capture(); - } - } -} -elsif (@add_tracefile) -{ - ($ln_overall_found, $ln_overall_hit, - $fn_overall_found, $fn_overall_hit, - $br_overall_found, $br_overall_hit) = add_traces(); -} -elsif ($remove) -{ - ($ln_overall_found, $ln_overall_hit, - $fn_overall_found, $fn_overall_hit, - $br_overall_found, $br_overall_hit) = remove(); -} -elsif ($extract) -{ - ($ln_overall_found, $ln_overall_hit, - $fn_overall_found, $fn_overall_hit, - $br_overall_found, $br_overall_hit) = extract(); -} -elsif ($list) -{ - list(); -} -elsif ($diff) -{ - if (scalar(@ARGV) != 1) - { - die("ERROR: option --diff requires one additional argument!\n". - "Use $tool_name --help to get usage information\n"); - } - ($ln_overall_found, $ln_overall_hit, - $fn_overall_found, $fn_overall_hit, - $br_overall_found, $br_overall_hit) = diff(); -} -elsif (@opt_summary) -{ - ($ln_overall_found, $ln_overall_hit, - $fn_overall_found, $fn_overall_hit, - $br_overall_found, $br_overall_hit) = summary(); -} - -temp_cleanup(); - -if (defined($ln_overall_found)) { - print_overall_rate(1, $ln_overall_found, $ln_overall_hit, - 1, $fn_overall_found, $fn_overall_hit, - 1, $br_overall_found, $br_overall_hit); -} else { - info("Done.\n") if (!$list && !$capture); -} -exit(0); - -# -# print_usage(handle) -# -# Print usage information. -# - -sub print_usage(*) -{ - local *HANDLE = $_[0]; - - print(HANDLE < 1) - { - die("ERROR: only one of -z, -c, -a, -e, -r, -l, ". - "--diff or --summary allowed!\n". - "Use $tool_name --help to get usage information\n"); - } -} - - -# -# userspace_reset() -# -# Reset coverage data found in DIRECTORY by deleting all contained .da files. -# -# Die on error. -# - -sub userspace_reset() -{ - my $current_dir; - my @file_list; - - foreach $current_dir (@directory) - { - info("Deleting all .da files in $current_dir". - ($no_recursion?"\n":" and subdirectories\n")); - @file_list = `find "$current_dir" $maxdepth $follow -name \\*\\.da -o -name \\*\\.gcda -type f 2>/dev/null`; - chomp(@file_list); - foreach (@file_list) - { - unlink($_) or die("ERROR: cannot remove file $_!\n"); - } - } -} - - -# -# userspace_capture() -# -# Capture coverage data found in DIRECTORY and write it to a package (if -# TO_PACKAGE specified) or to OUTPUT_FILENAME or STDOUT. -# -# Die on error. -# - -sub userspace_capture() -{ - my $dir; - my $build; - - if (!defined($to_package)) { - lcov_geninfo(@directory); - return; - } - if (scalar(@directory) != 1) { - die("ERROR: -d may be specified only once with --to-package\n"); - } - $dir = $directory[0]; - if (defined($base_directory)) { - $build = $base_directory; - } else { - $build = $dir; - } - create_package($to_package, $dir, $build); -} - - -# -# kernel_reset() -# -# Reset kernel coverage. -# -# Die on error. -# - -sub kernel_reset() -{ - local *HANDLE; - my $reset_file; - - info("Resetting kernel execution counters\n"); - if (-e "$gcov_dir/vmlinux") { - $reset_file = "$gcov_dir/vmlinux"; - } elsif (-e "$gcov_dir/reset") { - $reset_file = "$gcov_dir/reset"; - } else { - die("ERROR: no reset control found in $gcov_dir\n"); - } - open(HANDLE, ">", $reset_file) or - die("ERROR: cannot write to $reset_file!\n"); - print(HANDLE "0"); - close(HANDLE); -} - - -# -# lcov_copy_single(from, to) -# -# Copy single regular file FROM to TO without checking its size. This is -# required to work with special files generated by the kernel -# seq_file-interface. -# -# -sub lcov_copy_single($$) -{ - my ($from, $to) = @_; - my $content; - local $/; - local *HANDLE; - - open(HANDLE, "<", $from) or die("ERROR: cannot read $from: $!\n"); - $content = ; - close(HANDLE); - open(HANDLE, ">", $to) or die("ERROR: cannot write $from: $!\n"); - if (defined($content)) { - print(HANDLE $content); - } - close(HANDLE); -} - -# -# lcov_find(dir, function, data[, extension, ...)]) -# -# Search DIR for files and directories whose name matches PATTERN and run -# FUNCTION for each match. If not pattern is specified, match all names. -# -# FUNCTION has the following prototype: -# function(dir, relative_name, data) -# -# Where: -# dir: the base directory for this search -# relative_name: the name relative to the base directory of this entry -# data: the DATA variable passed to lcov_find -# -sub lcov_find($$$;@) -{ - my ($dir, $fn, $data, @pattern) = @_; - my $result; - my $_fn = sub { - my $filename = $File::Find::name; - - if (defined($result)) { - return; - } - $filename = abs2rel($filename, $dir); - foreach (@pattern) { - if ($filename =~ /$_/) { - goto ok; - } - } - return; - ok: - $result = &$fn($dir, $filename, $data); - }; - if (scalar(@pattern) == 0) { - @pattern = ".*"; - } - find( { wanted => $_fn, no_chdir => 1 }, $dir); - - return $result; -} - -# -# lcov_copy_fn(from, rel, to) -# -# Copy directories, files and links from/rel to to/rel. -# - -sub lcov_copy_fn($$$) -{ - my ($from, $rel, $to) = @_; - my $absfrom = canonpath(catfile($from, $rel)); - my $absto = canonpath(catfile($to, $rel)); - - if (-d) { - if (! -d $absto) { - mkpath($absto) or - die("ERROR: cannot create directory $absto\n"); - chmod(0700, $absto); - } - } elsif (-l) { - # Copy symbolic link - my $link = readlink($absfrom); - - if (!defined($link)) { - die("ERROR: cannot read link $absfrom: $!\n"); - } - symlink($link, $absto) or - die("ERROR: cannot create link $absto: $!\n"); - } else { - lcov_copy_single($absfrom, $absto); - chmod(0600, $absto); - } - return undef; -} - -# -# lcov_copy(from, to, subdirs) -# -# Copy all specified SUBDIRS and files from directory FROM to directory TO. For -# regular files, copy file contents without checking its size. This is required -# to work with seq_file-generated files. -# - -sub lcov_copy($$;@) -{ - my ($from, $to, @subdirs) = @_; - my @pattern; - - foreach (@subdirs) { - push(@pattern, "^$_"); - } - lcov_find($from, \&lcov_copy_fn, $to, @pattern); -} - -# -# lcov_geninfo(directory) -# -# Call geninfo for the specified directory and with the parameters specified -# at the command line. -# - -sub lcov_geninfo(@) -{ - my (@dir) = @_; - my @param; - - # Capture data - info("Capturing coverage data from ".join(" ", @dir)."\n"); - @param = ("$tool_dir/geninfo", @dir); - if ($output_filename) - { - @param = (@param, "--output-filename", $output_filename); - } - if ($test_name) - { - @param = (@param, "--test-name", $test_name); - } - if ($follow) - { - @param = (@param, "--follow"); - } - if ($quiet) - { - @param = (@param, "--quiet"); - } - if (defined($checksum)) - { - if ($checksum) - { - @param = (@param, "--checksum"); - } - else - { - @param = (@param, "--no-checksum"); - } - } - if ($base_directory) - { - @param = (@param, "--base-directory", $base_directory); - } - if ($no_compat_libtool) - { - @param = (@param, "--no-compat-libtool"); - } - elsif ($compat_libtool) - { - @param = (@param, "--compat-libtool"); - } - if ($gcov_tool) - { - @param = (@param, "--gcov-tool", $gcov_tool); - } - foreach (@opt_ignore_errors) { - @param = (@param, "--ignore-errors", $_); - } - if ($no_recursion) { - @param = (@param, "--no-recursion"); - } - if ($initial) - { - @param = (@param, "--initial"); - } - if ($no_markers) - { - @param = (@param, "--no-markers"); - } - if ($opt_derive_func_data) - { - @param = (@param, "--derive-func-data"); - } - if ($opt_debug) - { - @param = (@param, "--debug"); - } - if (defined($opt_external) && $opt_external) - { - @param = (@param, "--external"); - } - if (defined($opt_external) && !$opt_external) - { - @param = (@param, "--no-external"); - } - if (defined($opt_compat)) { - @param = (@param, "--compat", $opt_compat); - } - if (%opt_rc) { - foreach my $key (keys(%opt_rc)) { - @param = (@param, "--rc", "$key=".$opt_rc{$key}); - } - } - if (defined($opt_config_file)) { - @param = (@param, "--config-file", $opt_config_file); - } - - system(@param) and exit($? >> 8); -} - -# -# read_file(filename) -# -# Return the contents of the file defined by filename. -# - -sub read_file($) -{ - my ($filename) = @_; - my $content; - local $\; - local *HANDLE; - - open(HANDLE, "<", $filename) || return undef; - $content = ; - close(HANDLE); - - return $content; -} - -# -# get_package(package_file) -# -# Unpack unprocessed coverage data files from package_file to a temporary -# directory and return directory name, build directory and gcov kernel version -# as found in package. -# - -sub get_package($) -{ - my ($file) = @_; - my $dir = create_temp_dir(); - my $gkv; - my $build; - my $cwd = getcwd(); - my $count; - local *HANDLE; - - info("Reading package $file:\n"); - info(" data directory .......: $dir\n"); - $file = abs_path($file); - chdir($dir); - open(HANDLE, "-|", "tar xvfz '$file' 2>/dev/null") - or die("ERROR: could not process package $file\n"); - while () { - if (/\.da$/ || /\.gcda$/) { - $count++; - } - } - close(HANDLE); - $build = read_file("$dir/$pkg_build_file"); - if (defined($build)) { - info(" build directory ......: $build\n"); - } - $gkv = read_file("$dir/$pkg_gkv_file"); - if (defined($gkv)) { - $gkv = int($gkv); - if ($gkv != $GKV_PROC && $gkv != $GKV_SYS) { - die("ERROR: unsupported gcov kernel version found ". - "($gkv)\n"); - } - info(" content type .........: kernel data\n"); - info(" gcov kernel version ..: %s\n", $GKV_NAME[$gkv]); - } else { - info(" content type .........: application data\n"); - } - info(" data files ...........: $count\n"); - chdir($cwd); - - return ($dir, $build, $gkv); -} - -# -# write_file(filename, $content) -# -# Create a file named filename and write the specified content to it. -# - -sub write_file($$) -{ - my ($filename, $content) = @_; - local *HANDLE; - - open(HANDLE, ">", $filename) || return 0; - print(HANDLE $content); - close(HANDLE) || return 0; - - return 1; -} - -# count_package_data(filename) -# -# Count the number of coverage data files in the specified package file. -# - -sub count_package_data($) -{ - my ($filename) = @_; - local *HANDLE; - my $count = 0; - - open(HANDLE, "-|", "tar tfz '$filename'") or return undef; - while () { - if (/\.da$/ || /\.gcda$/) { - $count++; - } - } - close(HANDLE); - return $count; -} - -# -# create_package(package_file, source_directory, build_directory[, -# kernel_gcov_version]) -# -# Store unprocessed coverage data files from source_directory to package_file. -# - -sub create_package($$$;$) -{ - my ($file, $dir, $build, $gkv) = @_; - my $cwd = getcwd(); - - # Print information about the package - info("Creating package $file:\n"); - info(" data directory .......: $dir\n"); - - # Handle build directory - if (defined($build)) { - info(" build directory ......: $build\n"); - write_file("$dir/$pkg_build_file", $build) - or die("ERROR: could not write to ". - "$dir/$pkg_build_file\n"); - } - - # Handle gcov kernel version data - if (defined($gkv)) { - info(" content type .........: kernel data\n"); - info(" gcov kernel version ..: %s\n", $GKV_NAME[$gkv]); - write_file("$dir/$pkg_gkv_file", $gkv) - or die("ERROR: could not write to ". - "$dir/$pkg_gkv_file\n"); - } else { - info(" content type .........: application data\n"); - } - - # Create package - $file = abs_path($file); - chdir($dir); - system("tar cfz $file .") - and die("ERROR: could not create package $file\n"); - - # Remove temporary files - unlink("$dir/$pkg_build_file"); - unlink("$dir/$pkg_gkv_file"); - - # Show number of data files - if (!$quiet) { - my $count = count_package_data($file); - - if (defined($count)) { - info(" data files ...........: $count\n"); - } - } - chdir($cwd); -} - -sub find_link_fn($$$) -{ - my ($from, $rel, $filename) = @_; - my $absfile = catfile($from, $rel, $filename); - - if (-l $absfile) { - return $absfile; - } - return undef; -} - -# -# get_base(dir) -# -# Return (BASE, OBJ), where -# - BASE: is the path to the kernel base directory relative to dir -# - OBJ: is the absolute path to the kernel build directory -# - -sub get_base($) -{ - my ($dir) = @_; - my $marker = "kernel/gcov/base.gcno"; - my $markerfile; - my $sys; - my $obj; - my $link; - - $markerfile = lcov_find($dir, \&find_link_fn, $marker); - if (!defined($markerfile)) { - return (undef, undef); - } - - # sys base is parent of parent of markerfile. - $sys = abs2rel(dirname(dirname(dirname($markerfile))), $dir); - - # obj base is parent of parent of markerfile link target. - $link = readlink($markerfile); - if (!defined($link)) { - die("ERROR: could not read $markerfile\n"); - } - $obj = dirname(dirname(dirname($link))); - - return ($sys, $obj); -} - -# -# apply_base_dir(data_dir, base_dir, build_dir, @directories) -# -# Make entries in @directories relative to data_dir. -# - -sub apply_base_dir($$$@) -{ - my ($data, $base, $build, @dirs) = @_; - my $dir; - my @result; - - foreach $dir (@dirs) { - # Is directory path relative to data directory? - if (-d catdir($data, $dir)) { - push(@result, $dir); - next; - } - # Relative to the auto-detected base-directory? - if (defined($base)) { - if (-d catdir($data, $base, $dir)) { - push(@result, catdir($base, $dir)); - next; - } - } - # Relative to the specified base-directory? - if (defined($base_directory)) { - if (file_name_is_absolute($base_directory)) { - $base = abs2rel($base_directory, rootdir()); - } else { - $base = $base_directory; - } - if (-d catdir($data, $base, $dir)) { - push(@result, catdir($base, $dir)); - next; - } - } - # Relative to the build directory? - if (defined($build)) { - if (file_name_is_absolute($build)) { - $base = abs2rel($build, rootdir()); - } else { - $base = $build; - } - if (-d catdir($data, $base, $dir)) { - push(@result, catdir($base, $dir)); - next; - } - } - die("ERROR: subdirectory $dir not found\n". - "Please use -b to specify the correct directory\n"); - } - return @result; -} - -# -# copy_gcov_dir(dir, [@subdirectories]) -# -# Create a temporary directory and copy all or, if specified, only some -# subdirectories from dir to that directory. Return the name of the temporary -# directory. -# - -sub copy_gcov_dir($;@) -{ - my ($data, @dirs) = @_; - my $tempdir = create_temp_dir(); - - info("Copying data to temporary directory $tempdir\n"); - lcov_copy($data, $tempdir, @dirs); - - return $tempdir; -} - -# -# kernel_capture_initial -# -# Capture initial kernel coverage data, i.e. create a coverage data file from -# static graph files which contains zero coverage data for all instrumented -# lines. -# - -sub kernel_capture_initial() -{ - my $build; - my $source; - my @params; - - if (defined($base_directory)) { - $build = $base_directory; - $source = "specified"; - } else { - (undef, $build) = get_base($gcov_dir); - if (!defined($build)) { - die("ERROR: could not auto-detect build directory.\n". - "Please use -b to specify the build directory\n"); - } - $source = "auto-detected"; - } - info("Using $build as kernel build directory ($source)\n"); - # Build directory needs to be passed to geninfo - $base_directory = $build; - if (@kernel_directory) { - foreach my $dir (@kernel_directory) { - push(@params, "$build/$dir"); - } - } else { - push(@params, $build); - } - lcov_geninfo(@params); -} - -# -# kernel_capture_from_dir(directory, gcov_kernel_version, build) -# -# Perform the actual kernel coverage capturing from the specified directory -# assuming that the data was copied from the specified gcov kernel version. -# - -sub kernel_capture_from_dir($$$) -{ - my ($dir, $gkv, $build) = @_; - - # Create package or coverage file - if (defined($to_package)) { - create_package($to_package, $dir, $build, $gkv); - } else { - # Build directory needs to be passed to geninfo - $base_directory = $build; - lcov_geninfo($dir); - } -} - -# -# adjust_kernel_dir(dir, build) -# -# Adjust directories specified with -k so that they point to the directory -# relative to DIR. Return the build directory if specified or the auto- -# detected build-directory. -# - -sub adjust_kernel_dir($$) -{ - my ($dir, $build) = @_; - my ($sys_base, $build_auto) = get_base($dir); - - if (!defined($build)) { - $build = $build_auto; - } - if (!defined($build)) { - die("ERROR: could not auto-detect build directory.\n". - "Please use -b to specify the build directory\n"); - } - # Make @kernel_directory relative to sysfs base - if (@kernel_directory) { - @kernel_directory = apply_base_dir($dir, $sys_base, $build, - @kernel_directory); - } - return $build; -} - -sub kernel_capture() -{ - my $data_dir; - my $build = $base_directory; - - if ($gcov_gkv == $GKV_SYS) { - $build = adjust_kernel_dir($gcov_dir, $build); - } - $data_dir = copy_gcov_dir($gcov_dir, @kernel_directory); - kernel_capture_from_dir($data_dir, $gcov_gkv, $build); -} - -# -# package_capture() -# -# Capture coverage data from a package of unprocessed coverage data files -# as generated by lcov --to-package. -# - -sub package_capture() -{ - my $dir; - my $build; - my $gkv; - - ($dir, $build, $gkv) = get_package($from_package); - - # Check for build directory - if (defined($base_directory)) { - if (defined($build)) { - info("Using build directory specified by -b.\n"); - } - $build = $base_directory; - } - - # Do the actual capture - if (defined($gkv)) { - if ($gkv == $GKV_SYS) { - $build = adjust_kernel_dir($dir, $build); - } - if (@kernel_directory) { - $dir = copy_gcov_dir($dir, @kernel_directory); - } - kernel_capture_from_dir($dir, $gkv, $build); - } else { - # Build directory needs to be passed to geninfo - $base_directory = $build; - lcov_geninfo($dir); - } -} - - -# -# info(printf_parameter) -# -# Use printf to write PRINTF_PARAMETER to stdout only when the $quiet flag -# is not set. -# - -sub info(@) -{ - if (!$quiet) - { - # Print info string - if ($to_file) - { - printf(@_) - } - else - { - # Don't interfere with the .info output to STDOUT - printf(STDERR @_); - } - } -} - - -# -# create_temp_dir() -# -# Create a temporary directory and return its path. -# -# Die on error. -# - -sub create_temp_dir() -{ - my $dir; - - if (defined($tmp_dir)) { - $dir = tempdir(DIR => $tmp_dir, CLEANUP => 1); - } else { - $dir = tempdir(CLEANUP => 1); - } - if (!defined($dir)) { - die("ERROR: cannot create temporary directory\n"); - } - push(@temp_dirs, $dir); - - return $dir; -} - - -# -# br_taken_to_num(taken) -# -# Convert a branch taken value .info format to number format. -# - -sub br_taken_to_num($) -{ - my ($taken) = @_; - - return 0 if ($taken eq '-'); - return $taken + 1; -} - - -# -# br_num_to_taken(taken) -# -# Convert a branch taken value in number format to .info format. -# - -sub br_num_to_taken($) -{ - my ($taken) = @_; - - return '-' if ($taken == 0); - return $taken - 1; -} - - -# -# br_taken_add(taken1, taken2) -# -# Return the result of taken1 + taken2 for 'branch taken' values. -# - -sub br_taken_add($$) -{ - my ($t1, $t2) = @_; - - return $t1 if (!defined($t2)); - return $t2 if (!defined($t1)); - return $t1 if ($t2 eq '-'); - return $t2 if ($t1 eq '-'); - return $t1 + $t2; -} - - -# -# br_taken_sub(taken1, taken2) -# -# Return the result of taken1 - taken2 for 'branch taken' values. Return 0 -# if the result would become negative. -# - -sub br_taken_sub($$) -{ - my ($t1, $t2) = @_; - - return $t1 if (!defined($t2)); - return undef if (!defined($t1)); - return $t1 if ($t1 eq '-'); - return $t1 if ($t2 eq '-'); - return 0 if $t2 > $t1; - return $t1 - $t2; -} - - -# -# -# br_ivec_len(vector) -# -# Return the number of entries in the branch coverage vector. -# - -sub br_ivec_len($) -{ - my ($vec) = @_; - - return 0 if (!defined($vec)); - return (length($vec) * 8 / $BR_VEC_WIDTH) / $BR_VEC_ENTRIES; -} - - -# -# br_ivec_push(vector, block, branch, taken) -# -# Add an entry to the branch coverage vector. If an entry with the same -# branch ID already exists, add the corresponding taken values. -# - -sub br_ivec_push($$$$) -{ - my ($vec, $block, $branch, $taken) = @_; - my $offset; - my $num = br_ivec_len($vec); - my $i; - - $vec = "" if (!defined($vec)); - $block = $BR_VEC_MAX if $block < 0; - - # Check if branch already exists in vector - for ($i = 0; $i < $num; $i++) { - my ($v_block, $v_branch, $v_taken) = br_ivec_get($vec, $i); - $v_block = $BR_VEC_MAX if $v_block < 0; - - next if ($v_block != $block || $v_branch != $branch); - - # Add taken counts - $taken = br_taken_add($taken, $v_taken); - last; - } - - $offset = $i * $BR_VEC_ENTRIES; - $taken = br_taken_to_num($taken); - - # Add to vector - vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH) = $block; - vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH) = $branch; - vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH) = $taken; - - return $vec; -} - - -# -# br_ivec_get(vector, number) -# -# Return an entry from the branch coverage vector. -# - -sub br_ivec_get($$) -{ - my ($vec, $num) = @_; - my $block; - my $branch; - my $taken; - my $offset = $num * $BR_VEC_ENTRIES; - - # Retrieve data from vector - $block = vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH); - $block = -1 if ($block == $BR_VEC_MAX); - $branch = vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH); - $taken = vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH); - - # Decode taken value from an integer - $taken = br_num_to_taken($taken); - - return ($block, $branch, $taken); -} - - -# -# get_br_found_and_hit(brcount) -# -# Return (br_found, br_hit) for brcount -# - -sub get_br_found_and_hit($) -{ - my ($brcount) = @_; - my $line; - my $br_found = 0; - my $br_hit = 0; - - foreach $line (keys(%{$brcount})) { - my $brdata = $brcount->{$line}; - my $i; - my $num = br_ivec_len($brdata); - - for ($i = 0; $i < $num; $i++) { - my $taken; - - (undef, undef, $taken) = br_ivec_get($brdata, $i); - - $br_found++; - $br_hit++ if ($taken ne "-" && $taken > 0); - } - } - - return ($br_found, $br_hit); -} - - -# -# read_info_file(info_filename) -# -# Read in the contents of the .info file specified by INFO_FILENAME. Data will -# be returned as a reference to a hash containing the following mappings: -# -# %result: for each filename found in file -> \%data -# -# %data: "test" -> \%testdata -# "sum" -> \%sumcount -# "func" -> \%funcdata -# "found" -> $lines_found (number of instrumented lines found in file) -# "hit" -> $lines_hit (number of executed lines in file) -# "f_found" -> $fn_found (number of instrumented functions found in file) -# "f_hit" -> $fn_hit (number of executed functions in file) -# "b_found" -> $br_found (number of instrumented branches found in file) -# "b_hit" -> $br_hit (number of executed branches in file) -# "check" -> \%checkdata -# "testfnc" -> \%testfncdata -# "sumfnc" -> \%sumfnccount -# "testbr" -> \%testbrdata -# "sumbr" -> \%sumbrcount -# -# %testdata : name of test affecting this file -> \%testcount -# %testfncdata: name of test affecting this file -> \%testfnccount -# %testbrdata: name of test affecting this file -> \%testbrcount -# -# %testcount : line number -> execution count for a single test -# %testfnccount: function name -> execution count for a single test -# %testbrcount : line number -> branch coverage data for a single test -# %sumcount : line number -> execution count for all tests -# %sumfnccount : function name -> execution count for all tests -# %sumbrcount : line number -> branch coverage data for all tests -# %funcdata : function name -> line number -# %checkdata : line number -> checksum of source code line -# $brdata : vector of items: block, branch, taken -# -# Note that .info file sections referring to the same file and test name -# will automatically be combined by adding all execution counts. -# -# Note that if INFO_FILENAME ends with ".gz", it is assumed that the file -# is compressed using GZIP. If available, GUNZIP will be used to decompress -# this file. -# -# Die on error. -# - -sub read_info_file($) -{ - my $tracefile = $_[0]; # Name of tracefile - my %result; # Resulting hash: file -> data - my $data; # Data handle for current entry - my $testdata; # " " - my $testcount; # " " - my $sumcount; # " " - my $funcdata; # " " - my $checkdata; # " " - my $testfncdata; - my $testfnccount; - my $sumfnccount; - my $testbrdata; - my $testbrcount; - my $sumbrcount; - my $line; # Current line read from .info file - my $testname; # Current test name - my $filename; # Current filename - my $hitcount; # Count for lines hit - my $count; # Execution count of current line - my $negative; # If set, warn about negative counts - my $changed_testname; # If set, warn about changed testname - my $line_checksum; # Checksum of current line - local *INFO_HANDLE; # Filehandle for .info file - - info("Reading tracefile $tracefile\n"); - - # Check if file exists and is readable - stat($_[0]); - if (!(-r _)) - { - die("ERROR: cannot read file $_[0]!\n"); - } - - # Check if this is really a plain file - if (!(-f _)) - { - die("ERROR: not a plain file: $_[0]!\n"); - } - - # Check for .gz extension - if ($_[0] =~ /\.gz$/) - { - # Check for availability of GZIP tool - system_no_output(1, "gunzip" ,"-h") - and die("ERROR: gunzip command not available!\n"); - - # Check integrity of compressed file - system_no_output(1, "gunzip", "-t", $_[0]) - and die("ERROR: integrity check failed for ". - "compressed file $_[0]!\n"); - - # Open compressed file - open(INFO_HANDLE, "-|", "gunzip -c '$_[0]'") - or die("ERROR: cannot start gunzip to decompress ". - "file $_[0]!\n"); - } - else - { - # Open decompressed file - open(INFO_HANDLE, "<", $_[0]) - or die("ERROR: cannot read file $_[0]!\n"); - } - - $testname = ""; - while () - { - chomp($_); - $line = $_; - - # Switch statement - foreach ($line) - { - /^TN:([^,]*)(,diff)?/ && do - { - # Test name information found - $testname = defined($1) ? $1 : ""; - if ($testname =~ s/\W/_/g) - { - $changed_testname = 1; - } - $testname .= $2 if (defined($2)); - last; - }; - - /^[SK]F:(.*)/ && do - { - # Filename information found - # Retrieve data for new entry - $filename = $1; - - $data = $result{$filename}; - ($testdata, $sumcount, $funcdata, $checkdata, - $testfncdata, $sumfnccount, $testbrdata, - $sumbrcount) = - get_info_entry($data); - - if (defined($testname)) - { - $testcount = $testdata->{$testname}; - $testfnccount = $testfncdata->{$testname}; - $testbrcount = $testbrdata->{$testname}; - } - else - { - $testcount = {}; - $testfnccount = {}; - $testbrcount = {}; - } - last; - }; - - /^DA:(\d+),(-?\d+)(,[^,\s]+)?/ && do - { - # Fix negative counts - $count = $2 < 0 ? 0 : $2; - if ($2 < 0) - { - $negative = 1; - } - # Execution count found, add to structure - # Add summary counts - $sumcount->{$1} += $count; - - # Add test-specific counts - if (defined($testname)) - { - $testcount->{$1} += $count; - } - - # Store line checksum if available - if (defined($3)) - { - $line_checksum = substr($3, 1); - - # Does it match a previous definition - if (defined($checkdata->{$1}) && - ($checkdata->{$1} ne - $line_checksum)) - { - die("ERROR: checksum mismatch ". - "at $filename:$1\n"); - } - - $checkdata->{$1} = $line_checksum; - } - last; - }; - - /^FN:(\d+),([^,]+)/ && do - { - last if (!$func_coverage); - - # Function data found, add to structure - $funcdata->{$2} = $1; - - # Also initialize function call data - if (!defined($sumfnccount->{$2})) { - $sumfnccount->{$2} = 0; - } - if (defined($testname)) - { - if (!defined($testfnccount->{$2})) { - $testfnccount->{$2} = 0; - } - } - last; - }; - - /^FNDA:(\d+),([^,]+)/ && do - { - last if (!$func_coverage); - - # Function call count found, add to structure - # Add summary counts - $sumfnccount->{$2} += $1; - - # Add test-specific counts - if (defined($testname)) - { - $testfnccount->{$2} += $1; - } - last; - }; - - /^BRDA:(\d+),(\d+),(\d+),(\d+|-)/ && do { - # Branch coverage data found - my ($line, $block, $branch, $taken) = - ($1, $2, $3, $4); - - last if (!$br_coverage); - $sumbrcount->{$line} = - br_ivec_push($sumbrcount->{$line}, - $block, $branch, $taken); - - # Add test-specific counts - if (defined($testname)) { - $testbrcount->{$line} = - br_ivec_push( - $testbrcount->{$line}, - $block, $branch, - $taken); - } - last; - }; - - /^end_of_record/ && do - { - # Found end of section marker - if ($filename) - { - # Store current section data - if (defined($testname)) - { - $testdata->{$testname} = - $testcount; - $testfncdata->{$testname} = - $testfnccount; - $testbrdata->{$testname} = - $testbrcount; - } - - set_info_entry($data, $testdata, - $sumcount, $funcdata, - $checkdata, $testfncdata, - $sumfnccount, - $testbrdata, - $sumbrcount); - $result{$filename} = $data; - last; - } - }; - - # default - last; - } - } - close(INFO_HANDLE); - - # Calculate hit and found values for lines and functions of each file - foreach $filename (keys(%result)) - { - $data = $result{$filename}; - - ($testdata, $sumcount, undef, undef, $testfncdata, - $sumfnccount, $testbrdata, $sumbrcount) = - get_info_entry($data); - - # Filter out empty files - if (scalar(keys(%{$sumcount})) == 0) - { - delete($result{$filename}); - next; - } - # Filter out empty test cases - foreach $testname (keys(%{$testdata})) - { - if (!defined($testdata->{$testname}) || - scalar(keys(%{$testdata->{$testname}})) == 0) - { - delete($testdata->{$testname}); - delete($testfncdata->{$testname}); - } - } - - $data->{"found"} = scalar(keys(%{$sumcount})); - $hitcount = 0; - - foreach (keys(%{$sumcount})) - { - if ($sumcount->{$_} > 0) { $hitcount++; } - } - - $data->{"hit"} = $hitcount; - - # Get found/hit values for function call data - $data->{"f_found"} = scalar(keys(%{$sumfnccount})); - $hitcount = 0; - - foreach (keys(%{$sumfnccount})) { - if ($sumfnccount->{$_} > 0) { - $hitcount++; - } - } - $data->{"f_hit"} = $hitcount; - - # Get found/hit values for branch data - { - my ($br_found, $br_hit) = get_br_found_and_hit($sumbrcount); - - $data->{"b_found"} = $br_found; - $data->{"b_hit"} = $br_hit; - } - } - - if (scalar(keys(%result)) == 0) - { - die("ERROR: no valid records found in tracefile $tracefile\n"); - } - if ($negative) - { - warn("WARNING: negative counts found in tracefile ". - "$tracefile\n"); - } - if ($changed_testname) - { - warn("WARNING: invalid characters removed from testname in ". - "tracefile $tracefile\n"); - } - - return(\%result); -} - - -# -# get_info_entry(hash_ref) -# -# Retrieve data from an entry of the structure generated by read_info_file(). -# Return a list of references to hashes: -# (test data hash ref, sum count hash ref, funcdata hash ref, checkdata hash -# ref, testfncdata hash ref, sumfnccount hash ref, testbrdata hash ref, -# sumbrcount hash ref, lines found, lines hit, functions found, -# functions hit, branches found, branches hit) -# - -sub get_info_entry($) -{ - my $testdata_ref = $_[0]->{"test"}; - my $sumcount_ref = $_[0]->{"sum"}; - my $funcdata_ref = $_[0]->{"func"}; - my $checkdata_ref = $_[0]->{"check"}; - my $testfncdata = $_[0]->{"testfnc"}; - my $sumfnccount = $_[0]->{"sumfnc"}; - my $testbrdata = $_[0]->{"testbr"}; - my $sumbrcount = $_[0]->{"sumbr"}; - my $lines_found = $_[0]->{"found"}; - my $lines_hit = $_[0]->{"hit"}; - my $f_found = $_[0]->{"f_found"}; - my $f_hit = $_[0]->{"f_hit"}; - my $br_found = $_[0]->{"b_found"}; - my $br_hit = $_[0]->{"b_hit"}; - - return ($testdata_ref, $sumcount_ref, $funcdata_ref, $checkdata_ref, - $testfncdata, $sumfnccount, $testbrdata, $sumbrcount, - $lines_found, $lines_hit, $f_found, $f_hit, - $br_found, $br_hit); -} - - -# -# set_info_entry(hash_ref, testdata_ref, sumcount_ref, funcdata_ref, -# checkdata_ref, testfncdata_ref, sumfcncount_ref, -# testbrdata_ref, sumbrcount_ref[,lines_found, -# lines_hit, f_found, f_hit, $b_found, $b_hit]) -# -# Update the hash referenced by HASH_REF with the provided data references. -# - -sub set_info_entry($$$$$$$$$;$$$$$$) -{ - my $data_ref = $_[0]; - - $data_ref->{"test"} = $_[1]; - $data_ref->{"sum"} = $_[2]; - $data_ref->{"func"} = $_[3]; - $data_ref->{"check"} = $_[4]; - $data_ref->{"testfnc"} = $_[5]; - $data_ref->{"sumfnc"} = $_[6]; - $data_ref->{"testbr"} = $_[7]; - $data_ref->{"sumbr"} = $_[8]; - - if (defined($_[9])) { $data_ref->{"found"} = $_[9]; } - if (defined($_[10])) { $data_ref->{"hit"} = $_[10]; } - if (defined($_[11])) { $data_ref->{"f_found"} = $_[11]; } - if (defined($_[12])) { $data_ref->{"f_hit"} = $_[12]; } - if (defined($_[13])) { $data_ref->{"b_found"} = $_[13]; } - if (defined($_[14])) { $data_ref->{"b_hit"} = $_[14]; } -} - - -# -# add_counts(data1_ref, data2_ref) -# -# DATA1_REF and DATA2_REF are references to hashes containing a mapping -# -# line number -> execution count -# -# Return a list (RESULT_REF, LINES_FOUND, LINES_HIT) where RESULT_REF -# is a reference to a hash containing the combined mapping in which -# execution counts are added. -# - -sub add_counts($$) -{ - my $data1_ref = $_[0]; # Hash 1 - my $data2_ref = $_[1]; # Hash 2 - my %result; # Resulting hash - my $line; # Current line iteration scalar - my $data1_count; # Count of line in hash1 - my $data2_count; # Count of line in hash2 - my $found = 0; # Total number of lines found - my $hit = 0; # Number of lines with a count > 0 - - foreach $line (keys(%$data1_ref)) - { - $data1_count = $data1_ref->{$line}; - $data2_count = $data2_ref->{$line}; - - # Add counts if present in both hashes - if (defined($data2_count)) { $data1_count += $data2_count; } - - # Store sum in %result - $result{$line} = $data1_count; - - $found++; - if ($data1_count > 0) { $hit++; } - } - - # Add lines unique to data2_ref - foreach $line (keys(%$data2_ref)) - { - # Skip lines already in data1_ref - if (defined($data1_ref->{$line})) { next; } - - # Copy count from data2_ref - $result{$line} = $data2_ref->{$line}; - - $found++; - if ($result{$line} > 0) { $hit++; } - } - - return (\%result, $found, $hit); -} - - -# -# merge_checksums(ref1, ref2, filename) -# -# REF1 and REF2 are references to hashes containing a mapping -# -# line number -> checksum -# -# Merge checksum lists defined in REF1 and REF2 and return reference to -# resulting hash. Die if a checksum for a line is defined in both hashes -# but does not match. -# - -sub merge_checksums($$$) -{ - my $ref1 = $_[0]; - my $ref2 = $_[1]; - my $filename = $_[2]; - my %result; - my $line; - - foreach $line (keys(%{$ref1})) - { - if (defined($ref2->{$line}) && - ($ref1->{$line} ne $ref2->{$line})) - { - die("ERROR: checksum mismatch at $filename:$line\n"); - } - $result{$line} = $ref1->{$line}; - } - - foreach $line (keys(%{$ref2})) - { - $result{$line} = $ref2->{$line}; - } - - return \%result; -} - - -# -# merge_func_data(funcdata1, funcdata2, filename) -# - -sub merge_func_data($$$) -{ - my ($funcdata1, $funcdata2, $filename) = @_; - my %result; - my $func; - - if (defined($funcdata1)) { - %result = %{$funcdata1}; - } - - foreach $func (keys(%{$funcdata2})) { - my $line1 = $result{$func}; - my $line2 = $funcdata2->{$func}; - - if (defined($line1) && ($line1 != $line2)) { - warn("WARNING: function data mismatch at ". - "$filename:$line2\n"); - next; - } - $result{$func} = $line2; - } - - return \%result; -} - - -# -# add_fnccount(fnccount1, fnccount2) -# -# Add function call count data. Return list (fnccount_added, f_found, f_hit) -# - -sub add_fnccount($$) -{ - my ($fnccount1, $fnccount2) = @_; - my %result; - my $f_found; - my $f_hit; - my $function; - - if (defined($fnccount1)) { - %result = %{$fnccount1}; - } - foreach $function (keys(%{$fnccount2})) { - $result{$function} += $fnccount2->{$function}; - } - $f_found = scalar(keys(%result)); - $f_hit = 0; - foreach $function (keys(%result)) { - if ($result{$function} > 0) { - $f_hit++; - } - } - - return (\%result, $f_found, $f_hit); -} - -# -# add_testfncdata(testfncdata1, testfncdata2) -# -# Add function call count data for several tests. Return reference to -# added_testfncdata. -# - -sub add_testfncdata($$) -{ - my ($testfncdata1, $testfncdata2) = @_; - my %result; - my $testname; - - foreach $testname (keys(%{$testfncdata1})) { - if (defined($testfncdata2->{$testname})) { - my $fnccount; - - # Function call count data for this testname exists - # in both data sets: merge - ($fnccount) = add_fnccount( - $testfncdata1->{$testname}, - $testfncdata2->{$testname}); - $result{$testname} = $fnccount; - next; - } - # Function call count data for this testname is unique to - # data set 1: copy - $result{$testname} = $testfncdata1->{$testname}; - } - - # Add count data for testnames unique to data set 2 - foreach $testname (keys(%{$testfncdata2})) { - if (!defined($result{$testname})) { - $result{$testname} = $testfncdata2->{$testname}; - } - } - return \%result; -} - - -# -# brcount_to_db(brcount) -# -# Convert brcount data to the following format: -# -# db: line number -> block hash -# block hash: block number -> branch hash -# branch hash: branch number -> taken value -# - -sub brcount_to_db($) -{ - my ($brcount) = @_; - my $line; - my $db; - - # Add branches from first count to database - foreach $line (keys(%{$brcount})) { - my $brdata = $brcount->{$line}; - my $i; - my $num = br_ivec_len($brdata); - - for ($i = 0; $i < $num; $i++) { - my ($block, $branch, $taken) = br_ivec_get($brdata, $i); - - $db->{$line}->{$block}->{$branch} = $taken; - } - } - - return $db; -} - - -# -# db_to_brcount(db) -# -# Convert branch coverage data back to brcount format. -# - -sub db_to_brcount($) -{ - my ($db) = @_; - my $line; - my $brcount = {}; - my $br_found = 0; - my $br_hit = 0; - - # Convert database back to brcount format - foreach $line (sort({$a <=> $b} keys(%{$db}))) { - my $ldata = $db->{$line}; - my $brdata; - my $block; - - foreach $block (sort({$a <=> $b} keys(%{$ldata}))) { - my $bdata = $ldata->{$block}; - my $branch; - - foreach $branch (sort({$a <=> $b} keys(%{$bdata}))) { - my $taken = $bdata->{$branch}; - - $br_found++; - $br_hit++ if ($taken ne "-" && $taken > 0); - $brdata = br_ivec_push($brdata, $block, - $branch, $taken); - } - } - $brcount->{$line} = $brdata; - } - - return ($brcount, $br_found, $br_hit); -} - - -# combine_brcount(brcount1, brcount2, type) -# -# If add is BR_ADD, add branch coverage data and return list (brcount_added, -# br_found, br_hit). If add is BR_SUB, subtract the taken values of brcount2 -# from brcount1 and return (brcount_sub, br_found, br_hit). -# - -sub combine_brcount($$$) -{ - my ($brcount1, $brcount2, $type) = @_; - my $line; - my $block; - my $branch; - my $taken; - my $db; - my $br_found = 0; - my $br_hit = 0; - my $result; - - # Convert branches from first count to database - $db = brcount_to_db($brcount1); - # Combine values from database and second count - foreach $line (keys(%{$brcount2})) { - my $brdata = $brcount2->{$line}; - my $num = br_ivec_len($brdata); - my $i; - - for ($i = 0; $i < $num; $i++) { - ($block, $branch, $taken) = br_ivec_get($brdata, $i); - my $new_taken = $db->{$line}->{$block}->{$branch}; - - if ($type == $BR_ADD) { - $new_taken = br_taken_add($new_taken, $taken); - } elsif ($type == $BR_SUB) { - $new_taken = br_taken_sub($new_taken, $taken); - } - $db->{$line}->{$block}->{$branch} = $new_taken - if (defined($new_taken)); - } - } - # Convert database back to brcount format - ($result, $br_found, $br_hit) = db_to_brcount($db); - - return ($result, $br_found, $br_hit); -} - - -# -# add_testbrdata(testbrdata1, testbrdata2) -# -# Add branch coverage data for several tests. Return reference to -# added_testbrdata. -# - -sub add_testbrdata($$) -{ - my ($testbrdata1, $testbrdata2) = @_; - my %result; - my $testname; - - foreach $testname (keys(%{$testbrdata1})) { - if (defined($testbrdata2->{$testname})) { - my $brcount; - - # Branch coverage data for this testname exists - # in both data sets: add - ($brcount) = combine_brcount( - $testbrdata1->{$testname}, - $testbrdata2->{$testname}, $BR_ADD); - $result{$testname} = $brcount; - next; - } - # Branch coverage data for this testname is unique to - # data set 1: copy - $result{$testname} = $testbrdata1->{$testname}; - } - - # Add count data for testnames unique to data set 2 - foreach $testname (keys(%{$testbrdata2})) { - if (!defined($result{$testname})) { - $result{$testname} = $testbrdata2->{$testname}; - } - } - return \%result; -} - - -# -# combine_info_entries(entry_ref1, entry_ref2, filename) -# -# Combine .info data entry hashes referenced by ENTRY_REF1 and ENTRY_REF2. -# Return reference to resulting hash. -# - -sub combine_info_entries($$$) -{ - my $entry1 = $_[0]; # Reference to hash containing first entry - my $testdata1; - my $sumcount1; - my $funcdata1; - my $checkdata1; - my $testfncdata1; - my $sumfnccount1; - my $testbrdata1; - my $sumbrcount1; - - my $entry2 = $_[1]; # Reference to hash containing second entry - my $testdata2; - my $sumcount2; - my $funcdata2; - my $checkdata2; - my $testfncdata2; - my $sumfnccount2; - my $testbrdata2; - my $sumbrcount2; - - my %result; # Hash containing combined entry - my %result_testdata; - my $result_sumcount = {}; - my $result_funcdata; - my $result_testfncdata; - my $result_sumfnccount; - my $result_testbrdata; - my $result_sumbrcount; - my $lines_found; - my $lines_hit; - my $f_found; - my $f_hit; - my $br_found; - my $br_hit; - - my $testname; - my $filename = $_[2]; - - # Retrieve data - ($testdata1, $sumcount1, $funcdata1, $checkdata1, $testfncdata1, - $sumfnccount1, $testbrdata1, $sumbrcount1) = get_info_entry($entry1); - ($testdata2, $sumcount2, $funcdata2, $checkdata2, $testfncdata2, - $sumfnccount2, $testbrdata2, $sumbrcount2) = get_info_entry($entry2); - - # Merge checksums - $checkdata1 = merge_checksums($checkdata1, $checkdata2, $filename); - - # Combine funcdata - $result_funcdata = merge_func_data($funcdata1, $funcdata2, $filename); - - # Combine function call count data - $result_testfncdata = add_testfncdata($testfncdata1, $testfncdata2); - ($result_sumfnccount, $f_found, $f_hit) = - add_fnccount($sumfnccount1, $sumfnccount2); - - # Combine branch coverage data - $result_testbrdata = add_testbrdata($testbrdata1, $testbrdata2); - ($result_sumbrcount, $br_found, $br_hit) = - combine_brcount($sumbrcount1, $sumbrcount2, $BR_ADD); - - # Combine testdata - foreach $testname (keys(%{$testdata1})) - { - if (defined($testdata2->{$testname})) - { - # testname is present in both entries, requires - # combination - ($result_testdata{$testname}) = - add_counts($testdata1->{$testname}, - $testdata2->{$testname}); - } - else - { - # testname only present in entry1, add to result - $result_testdata{$testname} = $testdata1->{$testname}; - } - - # update sum count hash - ($result_sumcount, $lines_found, $lines_hit) = - add_counts($result_sumcount, - $result_testdata{$testname}); - } - - foreach $testname (keys(%{$testdata2})) - { - # Skip testnames already covered by previous iteration - if (defined($testdata1->{$testname})) { next; } - - # testname only present in entry2, add to result hash - $result_testdata{$testname} = $testdata2->{$testname}; - - # update sum count hash - ($result_sumcount, $lines_found, $lines_hit) = - add_counts($result_sumcount, - $result_testdata{$testname}); - } - - # Calculate resulting sumcount - - # Store result - set_info_entry(\%result, \%result_testdata, $result_sumcount, - $result_funcdata, $checkdata1, $result_testfncdata, - $result_sumfnccount, $result_testbrdata, - $result_sumbrcount, $lines_found, $lines_hit, - $f_found, $f_hit, $br_found, $br_hit); - - return(\%result); -} - - -# -# combine_info_files(info_ref1, info_ref2) -# -# Combine .info data in hashes referenced by INFO_REF1 and INFO_REF2. Return -# reference to resulting hash. -# - -sub combine_info_files($$) -{ - my %hash1 = %{$_[0]}; - my %hash2 = %{$_[1]}; - my $filename; - - foreach $filename (keys(%hash2)) - { - if ($hash1{$filename}) - { - # Entry already exists in hash1, combine them - $hash1{$filename} = - combine_info_entries($hash1{$filename}, - $hash2{$filename}, - $filename); - } - else - { - # Entry is unique in both hashes, simply add to - # resulting hash - $hash1{$filename} = $hash2{$filename}; - } - } - - return(\%hash1); -} - - -# -# add_traces() -# - -sub add_traces() -{ - my $total_trace; - my $current_trace; - my $tracefile; - my @result; - local *INFO_HANDLE; - - info("Combining tracefiles.\n"); - - foreach $tracefile (@add_tracefile) - { - $current_trace = read_info_file($tracefile); - if ($total_trace) - { - $total_trace = combine_info_files($total_trace, - $current_trace); - } - else - { - $total_trace = $current_trace; - } - } - - # Write combined data - if ($to_file) - { - info("Writing data to $output_filename\n"); - open(INFO_HANDLE, ">", $output_filename) - or die("ERROR: cannot write to $output_filename!\n"); - @result = write_info_file(*INFO_HANDLE, $total_trace); - close(*INFO_HANDLE); - } - else - { - @result = write_info_file(*STDOUT, $total_trace); - } - - return @result; -} - - -# -# write_info_file(filehandle, data) -# - -sub write_info_file(*$) -{ - local *INFO_HANDLE = $_[0]; - my %data = %{$_[1]}; - my $source_file; - my $entry; - my $testdata; - my $sumcount; - my $funcdata; - my $checkdata; - my $testfncdata; - my $sumfnccount; - my $testbrdata; - my $sumbrcount; - my $testname; - my $line; - my $func; - my $testcount; - my $testfnccount; - my $testbrcount; - my $found; - my $hit; - my $f_found; - my $f_hit; - my $br_found; - my $br_hit; - my $ln_total_found = 0; - my $ln_total_hit = 0; - my $fn_total_found = 0; - my $fn_total_hit = 0; - my $br_total_found = 0; - my $br_total_hit = 0; - - foreach $source_file (sort(keys(%data))) - { - $entry = $data{$source_file}; - ($testdata, $sumcount, $funcdata, $checkdata, $testfncdata, - $sumfnccount, $testbrdata, $sumbrcount, $found, $hit, - $f_found, $f_hit, $br_found, $br_hit) = - get_info_entry($entry); - - # Add to totals - $ln_total_found += $found; - $ln_total_hit += $hit; - $fn_total_found += $f_found; - $fn_total_hit += $f_hit; - $br_total_found += $br_found; - $br_total_hit += $br_hit; - - foreach $testname (sort(keys(%{$testdata}))) - { - $testcount = $testdata->{$testname}; - $testfnccount = $testfncdata->{$testname}; - $testbrcount = $testbrdata->{$testname}; - $found = 0; - $hit = 0; - - print(INFO_HANDLE "TN:$testname\n"); - print(INFO_HANDLE "SF:$source_file\n"); - - # Write function related data - foreach $func ( - sort({$funcdata->{$a} <=> $funcdata->{$b}} - keys(%{$funcdata}))) - { - print(INFO_HANDLE "FN:".$funcdata->{$func}. - ",$func\n"); - } - foreach $func (keys(%{$testfnccount})) { - print(INFO_HANDLE "FNDA:". - $testfnccount->{$func}. - ",$func\n"); - } - ($f_found, $f_hit) = - get_func_found_and_hit($testfnccount); - print(INFO_HANDLE "FNF:$f_found\n"); - print(INFO_HANDLE "FNH:$f_hit\n"); - - # Write branch related data - $br_found = 0; - $br_hit = 0; - foreach $line (sort({$a <=> $b} - keys(%{$testbrcount}))) { - my $brdata = $testbrcount->{$line}; - my $num = br_ivec_len($brdata); - my $i; - - for ($i = 0; $i < $num; $i++) { - my ($block, $branch, $taken) = - br_ivec_get($brdata, $i); - - $block = $BR_VEC_MAX if ($block < 0); - print(INFO_HANDLE "BRDA:$line,$block,". - "$branch,$taken\n"); - $br_found++; - $br_hit++ if ($taken ne '-' && - $taken > 0); - } - } - if ($br_found > 0) { - print(INFO_HANDLE "BRF:$br_found\n"); - print(INFO_HANDLE "BRH:$br_hit\n"); - } - - # Write line related data - foreach $line (sort({$a <=> $b} keys(%{$testcount}))) - { - print(INFO_HANDLE "DA:$line,". - $testcount->{$line}. - (defined($checkdata->{$line}) && - $checksum ? - ",".$checkdata->{$line} : "")."\n"); - $found++; - if ($testcount->{$line} > 0) - { - $hit++; - } - - } - print(INFO_HANDLE "LF:$found\n"); - print(INFO_HANDLE "LH:$hit\n"); - print(INFO_HANDLE "end_of_record\n"); - } - } - - return ($ln_total_found, $ln_total_hit, $fn_total_found, $fn_total_hit, - $br_total_found, $br_total_hit); -} - - -# -# transform_pattern(pattern) -# -# Transform shell wildcard expression to equivalent Perl regular expression. -# Return transformed pattern. -# - -sub transform_pattern($) -{ - my $pattern = $_[0]; - - # Escape special chars - - $pattern =~ s/\\/\\\\/g; - $pattern =~ s/\//\\\//g; - $pattern =~ s/\^/\\\^/g; - $pattern =~ s/\$/\\\$/g; - $pattern =~ s/\(/\\\(/g; - $pattern =~ s/\)/\\\)/g; - $pattern =~ s/\[/\\\[/g; - $pattern =~ s/\]/\\\]/g; - $pattern =~ s/\{/\\\{/g; - $pattern =~ s/\}/\\\}/g; - $pattern =~ s/\./\\\./g; - $pattern =~ s/\,/\\\,/g; - $pattern =~ s/\|/\\\|/g; - $pattern =~ s/\+/\\\+/g; - $pattern =~ s/\!/\\\!/g; - - # Transform ? => (.) and * => (.*) - - $pattern =~ s/\*/\(\.\*\)/g; - $pattern =~ s/\?/\(\.\)/g; - - return $pattern; -} - - -# -# extract() -# - -sub extract() -{ - my $data = read_info_file($extract); - my $filename; - my $keep; - my $pattern; - my @pattern_list; - my $extracted = 0; - my @result; - local *INFO_HANDLE; - - # Need perlreg expressions instead of shell pattern - @pattern_list = map({ transform_pattern($_); } @ARGV); - - # Filter out files which do not match any pattern - foreach $filename (sort(keys(%{$data}))) - { - $keep = 0; - - foreach $pattern (@pattern_list) - { - $keep ||= ($filename =~ (/^$pattern$/)); - } - - - if (!$keep) - { - delete($data->{$filename}); - } - else - { - info("Extracting $filename\n"), - $extracted++; - } - } - - # Write extracted data - if ($to_file) - { - info("Extracted $extracted files\n"); - info("Writing data to $output_filename\n"); - open(INFO_HANDLE, ">", $output_filename) - or die("ERROR: cannot write to $output_filename!\n"); - @result = write_info_file(*INFO_HANDLE, $data); - close(*INFO_HANDLE); - } - else - { - @result = write_info_file(*STDOUT, $data); - } - - return @result; -} - - -# -# remove() -# - -sub remove() -{ - my $data = read_info_file($remove); - my $filename; - my $match_found; - my $pattern; - my @pattern_list; - my $removed = 0; - my @result; - local *INFO_HANDLE; - - # Need perlreg expressions instead of shell pattern - @pattern_list = map({ transform_pattern($_); } @ARGV); - - # Filter out files that match the pattern - foreach $filename (sort(keys(%{$data}))) - { - $match_found = 0; - - foreach $pattern (@pattern_list) - { - $match_found ||= ($filename =~ (/$pattern$/)); - } - - - if ($match_found) - { - delete($data->{$filename}); - info("Removing $filename\n"), - $removed++; - } - } - - # Write data - if ($to_file) - { - info("Deleted $removed files\n"); - info("Writing data to $output_filename\n"); - open(INFO_HANDLE, ">", $output_filename) - or die("ERROR: cannot write to $output_filename!\n"); - @result = write_info_file(*INFO_HANDLE, $data); - close(*INFO_HANDLE); - } - else - { - @result = write_info_file(*STDOUT, $data); - } - - return @result; -} - - -# get_prefix(max_width, max_percentage_too_long, path_list) -# -# Return a path prefix that satisfies the following requirements: -# - is shared by more paths in path_list than any other prefix -# - the percentage of paths which would exceed the given max_width length -# after applying the prefix does not exceed max_percentage_too_long -# -# If multiple prefixes satisfy all requirements, the longest prefix is -# returned. Return an empty string if no prefix could be found. - -sub get_prefix($$@) -{ - my ($max_width, $max_long, @path_list) = @_; - my $path; - my $ENTRY_NUM = 0; - my $ENTRY_LONG = 1; - my %prefix; - - # Build prefix hash - foreach $path (@path_list) { - my ($v, $d, $f) = splitpath($path); - my @dirs = splitdir($d); - my $p_len = length($path); - my $i; - - # Remove trailing '/' - pop(@dirs) if ($dirs[scalar(@dirs) - 1] eq ''); - for ($i = 0; $i < scalar(@dirs); $i++) { - my $subpath = catpath($v, catdir(@dirs[0..$i]), ''); - my $entry = $prefix{$subpath}; - - $entry = [ 0, 0 ] if (!defined($entry)); - $entry->[$ENTRY_NUM]++; - if (($p_len - length($subpath) - 1) > $max_width) { - $entry->[$ENTRY_LONG]++; - } - $prefix{$subpath} = $entry; - } - } - # Find suitable prefix (sort descending by two keys: 1. number of - # entries covered by a prefix, 2. length of prefix) - foreach $path (sort {($prefix{$a}->[$ENTRY_NUM] == - $prefix{$b}->[$ENTRY_NUM]) ? - length($b) <=> length($a) : - $prefix{$b}->[$ENTRY_NUM] <=> - $prefix{$a}->[$ENTRY_NUM]} - keys(%prefix)) { - my ($num, $long) = @{$prefix{$path}}; - - # Check for additional requirement: number of filenames - # that would be too long may not exceed a certain percentage - if ($long <= $num * $max_long / 100) { - return $path; - } - } - - return ""; -} - - -# -# shorten_filename(filename, width) -# -# Truncate filename if it is longer than width characters. -# - -sub shorten_filename($$) -{ - my ($filename, $width) = @_; - my $l = length($filename); - my $s; - my $e; - - return $filename if ($l <= $width); - $e = int(($width - 3) / 2); - $s = $width - 3 - $e; - - return substr($filename, 0, $s).'...'.substr($filename, $l - $e); -} - - -sub shorten_number($$) -{ - my ($number, $width) = @_; - my $result = sprintf("%*d", $width, $number); - - return $result if (length($result) <= $width); - $number = $number / 1000; - return $result if (length($result) <= $width); - $result = sprintf("%*dk", $width - 1, $number); - return $result if (length($result) <= $width); - $number = $number / 1000; - $result = sprintf("%*dM", $width - 1, $number); - return $result if (length($result) <= $width); - return '#'; -} - -sub shorten_rate($$$) -{ - my ($hit, $found, $width) = @_; - my $result = rate($hit, $found, "%", 1, $width); - - return $result if (length($result) <= $width); - $result = rate($hit, $found, "%", 0, $width); - return $result if (length($result) <= $width); - return "#"; -} - -# -# list() -# - -sub list() -{ - my $data = read_info_file($list); - my $filename; - my $found; - my $hit; - my $entry; - my $fn_found; - my $fn_hit; - my $br_found; - my $br_hit; - my $total_found = 0; - my $total_hit = 0; - my $fn_total_found = 0; - my $fn_total_hit = 0; - my $br_total_found = 0; - my $br_total_hit = 0; - my $prefix; - my $strlen = length("Filename"); - my $format; - my $heading1; - my $heading2; - my @footer; - my $barlen; - my $rate; - my $fnrate; - my $brrate; - my $lastpath; - my $F_LN_NUM = 0; - my $F_LN_RATE = 1; - my $F_FN_NUM = 2; - my $F_FN_RATE = 3; - my $F_BR_NUM = 4; - my $F_BR_RATE = 5; - my @fwidth_narrow = (5, 5, 3, 5, 4, 5); - my @fwidth_wide = (6, 5, 5, 5, 6, 5); - my @fwidth = @fwidth_wide; - my $w; - my $max_width = $opt_list_width; - my $max_long = $opt_list_truncate_max; - my $fwidth_narrow_length; - my $fwidth_wide_length; - my $got_prefix = 0; - my $root_prefix = 0; - - # Calculate total width of narrow fields - $fwidth_narrow_length = 0; - foreach $w (@fwidth_narrow) { - $fwidth_narrow_length += $w + 1; - } - # Calculate total width of wide fields - $fwidth_wide_length = 0; - foreach $w (@fwidth_wide) { - $fwidth_wide_length += $w + 1; - } - # Get common file path prefix - $prefix = get_prefix($max_width - $fwidth_narrow_length, $max_long, - keys(%{$data})); - $root_prefix = 1 if ($prefix eq rootdir()); - $got_prefix = 1 if (length($prefix) > 0); - $prefix =~ s/\/$//; - # Get longest filename length - foreach $filename (keys(%{$data})) { - if (!$opt_list_full_path) { - if (!$got_prefix || !$root_prefix && - !($filename =~ s/^\Q$prefix\/\E//)) { - my ($v, $d, $f) = splitpath($filename); - - $filename = $f; - } - } - # Determine maximum length of entries - if (length($filename) > $strlen) { - $strlen = length($filename) - } - } - if (!$opt_list_full_path) { - my $blanks; - - $w = $fwidth_wide_length; - # Check if all columns fit into max_width characters - if ($strlen + $fwidth_wide_length > $max_width) { - # Use narrow fields - @fwidth = @fwidth_narrow; - $w = $fwidth_narrow_length; - if (($strlen + $fwidth_narrow_length) > $max_width) { - # Truncate filenames at max width - $strlen = $max_width - $fwidth_narrow_length; - } - } - # Add some blanks between filename and fields if possible - $blanks = int($strlen * 0.5); - $blanks = 4 if ($blanks < 4); - $blanks = 8 if ($blanks > 8); - if (($strlen + $w + $blanks) < $max_width) { - $strlen += $blanks; - } else { - $strlen = $max_width - $w; - } - } - # Filename - $w = $strlen; - $format = "%-${w}s|"; - $heading1 = sprintf("%*s|", $w, ""); - $heading2 = sprintf("%-*s|", $w, "Filename"); - $barlen = $w + 1; - # Line coverage rate - $w = $fwidth[$F_LN_RATE]; - $format .= "%${w}s "; - $heading1 .= sprintf("%-*s |", $w + $fwidth[$F_LN_NUM], - "Lines"); - $heading2 .= sprintf("%-*s ", $w, "Rate"); - $barlen += $w + 1; - # Number of lines - $w = $fwidth[$F_LN_NUM]; - $format .= "%${w}s|"; - $heading2 .= sprintf("%*s|", $w, "Num"); - $barlen += $w + 1; - # Function coverage rate - $w = $fwidth[$F_FN_RATE]; - $format .= "%${w}s "; - $heading1 .= sprintf("%-*s|", $w + $fwidth[$F_FN_NUM] + 1, - "Functions"); - $heading2 .= sprintf("%-*s ", $w, "Rate"); - $barlen += $w + 1; - # Number of functions - $w = $fwidth[$F_FN_NUM]; - $format .= "%${w}s|"; - $heading2 .= sprintf("%*s|", $w, "Num"); - $barlen += $w + 1; - # Branch coverage rate - $w = $fwidth[$F_BR_RATE]; - $format .= "%${w}s "; - $heading1 .= sprintf("%-*s", $w + $fwidth[$F_BR_NUM] + 1, - "Branches"); - $heading2 .= sprintf("%-*s ", $w, "Rate"); - $barlen += $w + 1; - # Number of branches - $w = $fwidth[$F_BR_NUM]; - $format .= "%${w}s"; - $heading2 .= sprintf("%*s", $w, "Num"); - $barlen += $w; - # Line end - $format .= "\n"; - $heading1 .= "\n"; - $heading2 .= "\n"; - - # Print heading - print($heading1); - print($heading2); - print(("="x$barlen)."\n"); - - # Print per file information - foreach $filename (sort(keys(%{$data}))) - { - my @file_data; - my $print_filename = $filename; - - $entry = $data->{$filename}; - if (!$opt_list_full_path) { - my $p; - - $print_filename = $filename; - if (!$got_prefix || !$root_prefix && - !($print_filename =~ s/^\Q$prefix\/\E//)) { - my ($v, $d, $f) = splitpath($filename); - - $p = catpath($v, $d, ""); - $p =~ s/\/$//; - $print_filename = $f; - } else { - $p = $prefix; - } - - if (!defined($lastpath) || $lastpath ne $p) { - print("\n") if (defined($lastpath)); - $lastpath = $p; - print("[$lastpath/]\n") if (!$root_prefix); - } - $print_filename = shorten_filename($print_filename, - $strlen); - } - - (undef, undef, undef, undef, undef, undef, undef, undef, - $found, $hit, $fn_found, $fn_hit, $br_found, $br_hit) = - get_info_entry($entry); - - # Assume zero count if there is no function data for this file - if (!defined($fn_found) || !defined($fn_hit)) { - $fn_found = 0; - $fn_hit = 0; - } - # Assume zero count if there is no branch data for this file - if (!defined($br_found) || !defined($br_hit)) { - $br_found = 0; - $br_hit = 0; - } - - # Add line coverage totals - $total_found += $found; - $total_hit += $hit; - # Add function coverage totals - $fn_total_found += $fn_found; - $fn_total_hit += $fn_hit; - # Add branch coverage totals - $br_total_found += $br_found; - $br_total_hit += $br_hit; - - # Determine line coverage rate for this file - $rate = shorten_rate($hit, $found, $fwidth[$F_LN_RATE]); - # Determine function coverage rate for this file - $fnrate = shorten_rate($fn_hit, $fn_found, $fwidth[$F_FN_RATE]); - # Determine branch coverage rate for this file - $brrate = shorten_rate($br_hit, $br_found, $fwidth[$F_BR_RATE]); - - # Assemble line parameters - push(@file_data, $print_filename); - push(@file_data, $rate); - push(@file_data, shorten_number($found, $fwidth[$F_LN_NUM])); - push(@file_data, $fnrate); - push(@file_data, shorten_number($fn_found, $fwidth[$F_FN_NUM])); - push(@file_data, $brrate); - push(@file_data, shorten_number($br_found, $fwidth[$F_BR_NUM])); - - # Print assembled line - printf($format, @file_data); - } - - # Determine total line coverage rate - $rate = shorten_rate($total_hit, $total_found, $fwidth[$F_LN_RATE]); - # Determine total function coverage rate - $fnrate = shorten_rate($fn_total_hit, $fn_total_found, - $fwidth[$F_FN_RATE]); - # Determine total branch coverage rate - $brrate = shorten_rate($br_total_hit, $br_total_found, - $fwidth[$F_BR_RATE]); - - # Print separator - print(("="x$barlen)."\n"); - - # Assemble line parameters - push(@footer, sprintf("%*s", $strlen, "Total:")); - push(@footer, $rate); - push(@footer, shorten_number($total_found, $fwidth[$F_LN_NUM])); - push(@footer, $fnrate); - push(@footer, shorten_number($fn_total_found, $fwidth[$F_FN_NUM])); - push(@footer, $brrate); - push(@footer, shorten_number($br_total_found, $fwidth[$F_BR_NUM])); - - # Print assembled line - printf($format, @footer); -} - - -# -# get_common_filename(filename1, filename2) -# -# Check for filename components which are common to FILENAME1 and FILENAME2. -# Upon success, return -# -# (common, path1, path2) -# -# or 'undef' in case there are no such parts. -# - -sub get_common_filename($$) -{ - my @list1 = split("/", $_[0]); - my @list2 = split("/", $_[1]); - my @result; - - # Work in reverse order, i.e. beginning with the filename itself - while (@list1 && @list2 && ($list1[$#list1] eq $list2[$#list2])) - { - unshift(@result, pop(@list1)); - pop(@list2); - } - - # Did we find any similarities? - if (scalar(@result) > 0) - { - return (join("/", @result), join("/", @list1), - join("/", @list2)); - } - else - { - return undef; - } -} - - -# -# strip_directories($path, $depth) -# -# Remove DEPTH leading directory levels from PATH. -# - -sub strip_directories($$) -{ - my $filename = $_[0]; - my $depth = $_[1]; - my $i; - - if (!defined($depth) || ($depth < 1)) - { - return $filename; - } - for ($i = 0; $i < $depth; $i++) - { - $filename =~ s/^[^\/]*\/+(.*)$/$1/; - } - return $filename; -} - - -# -# read_diff(filename) -# -# Read diff output from FILENAME to memory. The diff file has to follow the -# format generated by 'diff -u'. Returns a list of hash references: -# -# (mapping, path mapping) -# -# mapping: filename -> reference to line hash -# line hash: line number in new file -> corresponding line number in old file -# -# path mapping: filename -> old filename -# -# Die in case of error. -# - -sub read_diff($) -{ - my $diff_file = $_[0]; # Name of diff file - my %diff; # Resulting mapping filename -> line hash - my %paths; # Resulting mapping old path -> new path - my $mapping; # Reference to current line hash - my $line; # Contents of current line - my $num_old; # Current line number in old file - my $num_new; # Current line number in new file - my $file_old; # Name of old file in diff section - my $file_new; # Name of new file in diff section - my $filename; # Name of common filename of diff section - my $in_block = 0; # Non-zero while we are inside a diff block - local *HANDLE; # File handle for reading the diff file - - info("Reading diff $diff_file\n"); - - # Check if file exists and is readable - stat($diff_file); - if (!(-r _)) - { - die("ERROR: cannot read file $diff_file!\n"); - } - - # Check if this is really a plain file - if (!(-f _)) - { - die("ERROR: not a plain file: $diff_file!\n"); - } - - # Check for .gz extension - if ($diff_file =~ /\.gz$/) - { - # Check for availability of GZIP tool - system_no_output(1, "gunzip", "-h") - and die("ERROR: gunzip command not available!\n"); - - # Check integrity of compressed file - system_no_output(1, "gunzip", "-t", $diff_file) - and die("ERROR: integrity check failed for ". - "compressed file $diff_file!\n"); - - # Open compressed file - open(HANDLE, "-|", "gunzip -c '$diff_file'") - or die("ERROR: cannot start gunzip to decompress ". - "file $_[0]!\n"); - } - else - { - # Open decompressed file - open(HANDLE, "<", $diff_file) - or die("ERROR: cannot read file $_[0]!\n"); - } - - # Parse diff file line by line - while () - { - chomp($_); - $line = $_; - - foreach ($line) - { - # Filename of old file: - # --- - /^--- (\S+)/ && do - { - $file_old = strip_directories($1, $strip); - last; - }; - # Filename of new file: - # +++ - /^\+\+\+ (\S+)/ && do - { - # Add last file to resulting hash - if ($filename) - { - my %new_hash; - $diff{$filename} = $mapping; - $mapping = \%new_hash; - } - $file_new = strip_directories($1, $strip); - $filename = $file_old; - $paths{$filename} = $file_new; - $num_old = 1; - $num_new = 1; - last; - }; - # Start of diff block: - # @@ -old_start,old_num, +new_start,new_num @@ - /^\@\@\s+-(\d+),(\d+)\s+\+(\d+),(\d+)\s+\@\@$/ && do - { - $in_block = 1; - while ($num_old < $1) - { - $mapping->{$num_new} = $num_old; - $num_old++; - $num_new++; - } - last; - }; - # Unchanged line - # - /^ / && do - { - if ($in_block == 0) - { - last; - } - $mapping->{$num_new} = $num_old; - $num_old++; - $num_new++; - last; - }; - # Line as seen in old file - # - /^-/ && do - { - if ($in_block == 0) - { - last; - } - $num_old++; - last; - }; - # Line as seen in new file - # - /^\+/ && do - { - if ($in_block == 0) - { - last; - } - $num_new++; - last; - }; - # Empty line - /^$/ && do - { - if ($in_block == 0) - { - last; - } - $mapping->{$num_new} = $num_old; - $num_old++; - $num_new++; - last; - }; - } - } - - close(HANDLE); - - # Add final diff file section to resulting hash - if ($filename) - { - $diff{$filename} = $mapping; - } - - if (!%diff) - { - die("ERROR: no valid diff data found in $diff_file!\n". - "Make sure to use 'diff -u' when generating the diff ". - "file.\n"); - } - return (\%diff, \%paths); -} - - -# -# apply_diff($count_data, $line_hash) -# -# Transform count data using a mapping of lines: -# -# $count_data: reference to hash: line number -> data -# $line_hash: reference to hash: line number new -> line number old -# -# Return a reference to transformed count data. -# - -sub apply_diff($$) -{ - my $count_data = $_[0]; # Reference to data hash: line -> hash - my $line_hash = $_[1]; # Reference to line hash: new line -> old line - my %result; # Resulting hash - my $last_new = 0; # Last new line number found in line hash - my $last_old = 0; # Last old line number found in line hash - - # Iterate all new line numbers found in the diff - foreach (sort({$a <=> $b} keys(%{$line_hash}))) - { - $last_new = $_; - $last_old = $line_hash->{$last_new}; - - # Is there data associated with the corresponding old line? - if (defined($count_data->{$line_hash->{$_}})) - { - # Copy data to new hash with a new line number - $result{$_} = $count_data->{$line_hash->{$_}}; - } - } - # Transform all other lines which come after the last diff entry - foreach (sort({$a <=> $b} keys(%{$count_data}))) - { - if ($_ <= $last_old) - { - # Skip lines which were covered by line hash - next; - } - # Copy data to new hash with an offset - $result{$_ + ($last_new - $last_old)} = $count_data->{$_}; - } - - return \%result; -} - - -# -# apply_diff_to_brcount(brcount, linedata) -# -# Adjust line numbers of branch coverage data according to linedata. -# - -sub apply_diff_to_brcount($$) -{ - my ($brcount, $linedata) = @_; - my $db; - - # Convert brcount to db format - $db = brcount_to_db($brcount); - # Apply diff to db format - $db = apply_diff($db, $linedata); - # Convert db format back to brcount format - ($brcount) = db_to_brcount($db); - - return $brcount; -} - - -# -# get_hash_max(hash_ref) -# -# Return the highest integer key from hash. -# - -sub get_hash_max($) -{ - my ($hash) = @_; - my $max; - - foreach (keys(%{$hash})) { - if (!defined($max)) { - $max = $_; - } elsif ($hash->{$_} > $max) { - $max = $_; - } - } - return $max; -} - -sub get_hash_reverse($) -{ - my ($hash) = @_; - my %result; - - foreach (keys(%{$hash})) { - $result{$hash->{$_}} = $_; - } - - return \%result; -} - -# -# apply_diff_to_funcdata(funcdata, line_hash) -# - -sub apply_diff_to_funcdata($$) -{ - my ($funcdata, $linedata) = @_; - my $last_new = get_hash_max($linedata); - my $last_old = $linedata->{$last_new}; - my $func; - my %result; - my $line_diff = get_hash_reverse($linedata); - - foreach $func (keys(%{$funcdata})) { - my $line = $funcdata->{$func}; - - if (defined($line_diff->{$line})) { - $result{$func} = $line_diff->{$line}; - } elsif ($line > $last_old) { - $result{$func} = $line + $last_new - $last_old; - } - } - - return \%result; -} - - -# -# get_line_hash($filename, $diff_data, $path_data) -# -# Find line hash in DIFF_DATA which matches FILENAME. On success, return list -# line hash. or undef in case of no match. Die if more than one line hashes in -# DIFF_DATA match. -# - -sub get_line_hash($$$) -{ - my $filename = $_[0]; - my $diff_data = $_[1]; - my $path_data = $_[2]; - my $conversion; - my $old_path; - my $new_path; - my $diff_name; - my $common; - my $old_depth; - my $new_depth; - - # Remove trailing slash from diff path - $diff_path =~ s/\/$//; - foreach (keys(%{$diff_data})) - { - my $sep = ""; - - $sep = '/' if (!/^\//); - - # Try to match diff filename with filename - if ($filename =~ /^\Q$diff_path$sep$_\E$/) - { - if ($diff_name) - { - # Two files match, choose the more specific one - # (the one with more path components) - $old_depth = ($diff_name =~ tr/\///); - $new_depth = (tr/\///); - if ($old_depth == $new_depth) - { - die("ERROR: diff file contains ". - "ambiguous entries for ". - "$filename\n"); - } - elsif ($new_depth > $old_depth) - { - $diff_name = $_; - } - } - else - { - $diff_name = $_; - } - }; - } - if ($diff_name) - { - # Get converted path - if ($filename =~ /^(.*)$diff_name$/) - { - ($common, $old_path, $new_path) = - get_common_filename($filename, - $1.$path_data->{$diff_name}); - } - return ($diff_data->{$diff_name}, $old_path, $new_path); - } - else - { - return undef; - } -} - - -# -# convert_paths(trace_data, path_conversion_data) -# -# Rename all paths in TRACE_DATA which show up in PATH_CONVERSION_DATA. -# - -sub convert_paths($$) -{ - my $trace_data = $_[0]; - my $path_conversion_data = $_[1]; - my $filename; - my $new_path; - - if (scalar(keys(%{$path_conversion_data})) == 0) - { - info("No path conversion data available.\n"); - return; - } - - # Expand path conversion list - foreach $filename (keys(%{$path_conversion_data})) - { - $new_path = $path_conversion_data->{$filename}; - while (($filename =~ s/^(.*)\/[^\/]+$/$1/) && - ($new_path =~ s/^(.*)\/[^\/]+$/$1/) && - ($filename ne $new_path)) - { - $path_conversion_data->{$filename} = $new_path; - } - } - - # Adjust paths - FILENAME: foreach $filename (keys(%{$trace_data})) - { - # Find a path in our conversion table that matches, starting - # with the longest path - foreach (sort({length($b) <=> length($a)} - keys(%{$path_conversion_data}))) - { - # Is this path a prefix of our filename? - if (!($filename =~ /^$_(.*)$/)) - { - next; - } - $new_path = $path_conversion_data->{$_}.$1; - - # Make sure not to overwrite an existing entry under - # that path name - if ($trace_data->{$new_path}) - { - # Need to combine entries - $trace_data->{$new_path} = - combine_info_entries( - $trace_data->{$filename}, - $trace_data->{$new_path}, - $filename); - } - else - { - # Simply rename entry - $trace_data->{$new_path} = - $trace_data->{$filename}; - } - delete($trace_data->{$filename}); - next FILENAME; - } - info("No conversion available for filename $filename\n"); - } -} - -# -# sub adjust_fncdata(funcdata, testfncdata, sumfnccount) -# -# Remove function call count data from testfncdata and sumfnccount which -# is no longer present in funcdata. -# - -sub adjust_fncdata($$$) -{ - my ($funcdata, $testfncdata, $sumfnccount) = @_; - my $testname; - my $func; - my $f_found; - my $f_hit; - - # Remove count data in testfncdata for functions which are no longer - # in funcdata - foreach $testname (keys(%{$testfncdata})) { - my $fnccount = $testfncdata->{$testname}; - - foreach $func (keys(%{$fnccount})) { - if (!defined($funcdata->{$func})) { - delete($fnccount->{$func}); - } - } - } - # Remove count data in sumfnccount for functions which are no longer - # in funcdata - foreach $func (keys(%{$sumfnccount})) { - if (!defined($funcdata->{$func})) { - delete($sumfnccount->{$func}); - } - } -} - -# -# get_func_found_and_hit(sumfnccount) -# -# Return (f_found, f_hit) for sumfnccount -# - -sub get_func_found_and_hit($) -{ - my ($sumfnccount) = @_; - my $function; - my $f_found; - my $f_hit; - - $f_found = scalar(keys(%{$sumfnccount})); - $f_hit = 0; - foreach $function (keys(%{$sumfnccount})) { - if ($sumfnccount->{$function} > 0) { - $f_hit++; - } - } - return ($f_found, $f_hit); -} - -# -# diff() -# - -sub diff() -{ - my $trace_data = read_info_file($diff); - my $diff_data; - my $path_data; - my $old_path; - my $new_path; - my %path_conversion_data; - my $filename; - my $line_hash; - my $new_name; - my $entry; - my $testdata; - my $testname; - my $sumcount; - my $funcdata; - my $checkdata; - my $testfncdata; - my $sumfnccount; - my $testbrdata; - my $sumbrcount; - my $found; - my $hit; - my $f_found; - my $f_hit; - my $br_found; - my $br_hit; - my $converted = 0; - my $unchanged = 0; - my @result; - local *INFO_HANDLE; - - ($diff_data, $path_data) = read_diff($ARGV[0]); - - foreach $filename (sort(keys(%{$trace_data}))) - { - # Find a diff section corresponding to this file - ($line_hash, $old_path, $new_path) = - get_line_hash($filename, $diff_data, $path_data); - if (!$line_hash) - { - # There's no diff section for this file - $unchanged++; - next; - } - $converted++; - if ($old_path && $new_path && ($old_path ne $new_path)) - { - $path_conversion_data{$old_path} = $new_path; - } - # Check for deleted files - if (scalar(keys(%{$line_hash})) == 0) - { - info("Removing $filename\n"); - delete($trace_data->{$filename}); - next; - } - info("Converting $filename\n"); - $entry = $trace_data->{$filename}; - ($testdata, $sumcount, $funcdata, $checkdata, $testfncdata, - $sumfnccount, $testbrdata, $sumbrcount) = - get_info_entry($entry); - # Convert test data - foreach $testname (keys(%{$testdata})) - { - # Adjust line numbers of line coverage data - $testdata->{$testname} = - apply_diff($testdata->{$testname}, $line_hash); - # Adjust line numbers of branch coverage data - $testbrdata->{$testname} = - apply_diff_to_brcount($testbrdata->{$testname}, - $line_hash); - # Remove empty sets of test data - if (scalar(keys(%{$testdata->{$testname}})) == 0) - { - delete($testdata->{$testname}); - delete($testfncdata->{$testname}); - delete($testbrdata->{$testname}); - } - } - # Rename test data to indicate conversion - foreach $testname (keys(%{$testdata})) - { - # Skip testnames which already contain an extension - if ($testname =~ /,[^,]+$/) - { - next; - } - # Check for name conflict - if (defined($testdata->{$testname.",diff"})) - { - # Add counts - ($testdata->{$testname}) = add_counts( - $testdata->{$testname}, - $testdata->{$testname.",diff"}); - delete($testdata->{$testname.",diff"}); - # Add function call counts - ($testfncdata->{$testname}) = add_fnccount( - $testfncdata->{$testname}, - $testfncdata->{$testname.",diff"}); - delete($testfncdata->{$testname.",diff"}); - # Add branch counts - ($testbrdata->{$testname}) = combine_brcount( - $testbrdata->{$testname}, - $testbrdata->{$testname.",diff"}, - $BR_ADD); - delete($testbrdata->{$testname.",diff"}); - } - # Move test data to new testname - $testdata->{$testname.",diff"} = $testdata->{$testname}; - delete($testdata->{$testname}); - # Move function call count data to new testname - $testfncdata->{$testname.",diff"} = - $testfncdata->{$testname}; - delete($testfncdata->{$testname}); - # Move branch count data to new testname - $testbrdata->{$testname.",diff"} = - $testbrdata->{$testname}; - delete($testbrdata->{$testname}); - } - # Convert summary of test data - $sumcount = apply_diff($sumcount, $line_hash); - # Convert function data - $funcdata = apply_diff_to_funcdata($funcdata, $line_hash); - # Convert branch coverage data - $sumbrcount = apply_diff_to_brcount($sumbrcount, $line_hash); - # Update found/hit numbers - # Convert checksum data - $checkdata = apply_diff($checkdata, $line_hash); - # Convert function call count data - adjust_fncdata($funcdata, $testfncdata, $sumfnccount); - ($f_found, $f_hit) = get_func_found_and_hit($sumfnccount); - ($br_found, $br_hit) = get_br_found_and_hit($sumbrcount); - # Update found/hit numbers - $found = 0; - $hit = 0; - foreach (keys(%{$sumcount})) - { - $found++; - if ($sumcount->{$_} > 0) - { - $hit++; - } - } - if ($found > 0) - { - # Store converted entry - set_info_entry($entry, $testdata, $sumcount, $funcdata, - $checkdata, $testfncdata, $sumfnccount, - $testbrdata, $sumbrcount, $found, $hit, - $f_found, $f_hit, $br_found, $br_hit); - } - else - { - # Remove empty data set - delete($trace_data->{$filename}); - } - } - - # Convert filenames as well if requested - if ($convert_filenames) - { - convert_paths($trace_data, \%path_conversion_data); - } - - info("$converted entr".($converted != 1 ? "ies" : "y")." converted, ". - "$unchanged entr".($unchanged != 1 ? "ies" : "y")." left ". - "unchanged.\n"); - - # Write data - if ($to_file) - { - info("Writing data to $output_filename\n"); - open(INFO_HANDLE, ">", $output_filename) - or die("ERROR: cannot write to $output_filename!\n"); - @result = write_info_file(*INFO_HANDLE, $trace_data); - close(*INFO_HANDLE); - } - else - { - @result = write_info_file(*STDOUT, $trace_data); - } - - return @result; -} - -# -# summary() -# - -sub summary() -{ - my $filename; - my $current; - my $total; - my $ln_total_found; - my $ln_total_hit; - my $fn_total_found; - my $fn_total_hit; - my $br_total_found; - my $br_total_hit; - - # Read and combine trace files - foreach $filename (@opt_summary) { - $current = read_info_file($filename); - if (!defined($total)) { - $total = $current; - } else { - $total = combine_info_files($total, $current); - } - } - # Calculate coverage data - foreach $filename (keys(%{$total})) - { - my $entry = $total->{$filename}; - my $ln_found; - my $ln_hit; - my $fn_found; - my $fn_hit; - my $br_found; - my $br_hit; - - (undef, undef, undef, undef, undef, undef, undef, undef, - $ln_found, $ln_hit, $fn_found, $fn_hit, $br_found, - $br_hit) = get_info_entry($entry); - - # Add to totals - $ln_total_found += $ln_found; - $ln_total_hit += $ln_hit; - $fn_total_found += $fn_found; - $fn_total_hit += $fn_hit; - $br_total_found += $br_found; - $br_total_hit += $br_hit; - } - - - return ($ln_total_found, $ln_total_hit, $fn_total_found, $fn_total_hit, - $br_total_found, $br_total_hit); -} - -# -# system_no_output(mode, parameters) -# -# Call an external program using PARAMETERS while suppressing depending on -# the value of MODE: -# -# MODE & 1: suppress STDOUT -# MODE & 2: suppress STDERR -# -# Return 0 on success, non-zero otherwise. -# - -sub system_no_output($@) -{ - my $mode = shift; - my $result; - local *OLD_STDERR; - local *OLD_STDOUT; - - # Save old stdout and stderr handles - ($mode & 1) && open(OLD_STDOUT, ">>&", "STDOUT"); - ($mode & 2) && open(OLD_STDERR, ">>&", "STDERR"); - - # Redirect to /dev/null - ($mode & 1) && open(STDOUT, ">", "/dev/null"); - ($mode & 2) && open(STDERR, ">", "/dev/null"); - - system(@_); - $result = $?; - - # Close redirected handles - ($mode & 1) && close(STDOUT); - ($mode & 2) && close(STDERR); - - # Restore old handles - ($mode & 1) && open(STDOUT, ">>&", "OLD_STDOUT"); - ($mode & 2) && open(STDERR, ">>&", "OLD_STDERR"); - - return $result; -} - - -# -# read_config(filename) -# -# Read configuration file FILENAME and return a reference to a hash containing -# all valid key=value pairs found. -# - -sub read_config($) -{ - my $filename = $_[0]; - my %result; - my $key; - my $value; - local *HANDLE; - - if (!open(HANDLE, "<", $filename)) - { - warn("WARNING: cannot read configuration file $filename\n"); - return undef; - } - while () - { - chomp; - # Skip comments - s/#.*//; - # Remove leading blanks - s/^\s+//; - # Remove trailing blanks - s/\s+$//; - next unless length; - ($key, $value) = split(/\s*=\s*/, $_, 2); - if (defined($key) && defined($value)) - { - $result{$key} = $value; - } - else - { - warn("WARNING: malformed statement in line $. ". - "of configuration file $filename\n"); - } - } - close(HANDLE); - return \%result; -} - - -# -# apply_config(REF) -# -# REF is a reference to a hash containing the following mapping: -# -# key_string => var_ref -# -# where KEY_STRING is a keyword and VAR_REF is a reference to an associated -# variable. If the global configuration hashes CONFIG or OPT_RC contain a value -# for keyword KEY_STRING, VAR_REF will be assigned the value for that keyword. -# - -sub apply_config($) -{ - my $ref = $_[0]; - - foreach (keys(%{$ref})) - { - if (defined($opt_rc{$_})) { - ${$ref->{$_}} = $opt_rc{$_}; - } elsif (defined($config->{$_})) { - ${$ref->{$_}} = $config->{$_}; - } - } -} - -sub warn_handler($) -{ - my ($msg) = @_; - - temp_cleanup(); - warn("$tool_name: $msg"); -} - -sub die_handler($) -{ - my ($msg) = @_; - - temp_cleanup(); - die("$tool_name: $msg"); -} - -sub abort_handler($) -{ - temp_cleanup(); - exit(1); -} - -sub temp_cleanup() -{ - if (@temp_dirs) { - info("Removing temporary directories.\n"); - foreach (@temp_dirs) { - rmtree($_); - } - @temp_dirs = (); - } -} - -sub setup_gkv_sys() -{ - system_no_output(3, "mount", "-t", "debugfs", "nodev", - "/sys/kernel/debug"); -} - -sub setup_gkv_proc() -{ - if (system_no_output(3, "modprobe", "gcov_proc")) { - system_no_output(3, "modprobe", "gcov_prof"); - } -} - -sub check_gkv_sys($) -{ - my ($dir) = @_; - - if (-e "$dir/reset") { - return 1; - } - return 0; -} - -sub check_gkv_proc($) -{ - my ($dir) = @_; - - if (-e "$dir/vmlinux") { - return 1; - } - return 0; -} - -sub setup_gkv() -{ - my $dir; - my $sys_dir = "/sys/kernel/debug/gcov"; - my $proc_dir = "/proc/gcov"; - my @todo; - - if (!defined($gcov_dir)) { - info("Auto-detecting gcov kernel support.\n"); - @todo = ( "cs", "cp", "ss", "cs", "sp", "cp" ); - } elsif ($gcov_dir =~ /proc/) { - info("Checking gcov kernel support at $gcov_dir ". - "(user-specified).\n"); - @todo = ( "cp", "sp", "cp", "cs", "ss", "cs"); - } else { - info("Checking gcov kernel support at $gcov_dir ". - "(user-specified).\n"); - @todo = ( "cs", "ss", "cs", "cp", "sp", "cp", ); - } - foreach (@todo) { - if ($_ eq "cs") { - # Check /sys - $dir = defined($gcov_dir) ? $gcov_dir : $sys_dir; - if (check_gkv_sys($dir)) { - info("Found ".$GKV_NAME[$GKV_SYS]." gcov ". - "kernel support at $dir\n"); - return ($GKV_SYS, $dir); - } - } elsif ($_ eq "cp") { - # Check /proc - $dir = defined($gcov_dir) ? $gcov_dir : $proc_dir; - if (check_gkv_proc($dir)) { - info("Found ".$GKV_NAME[$GKV_PROC]." gcov ". - "kernel support at $dir\n"); - return ($GKV_PROC, $dir); - } - } elsif ($_ eq "ss") { - # Setup /sys - setup_gkv_sys(); - } elsif ($_ eq "sp") { - # Setup /proc - setup_gkv_proc(); - } - } - if (defined($gcov_dir)) { - die("ERROR: could not find gcov kernel data at $gcov_dir\n"); - } else { - die("ERROR: no gcov kernel data found\n"); - } -} - - -# -# get_overall_line(found, hit, name_singular, name_plural) -# -# Return a string containing overall information for the specified -# found/hit data. -# - -sub get_overall_line($$$$) -{ - my ($found, $hit, $name_sn, $name_pl) = @_; - my $name; - - return "no data found" if (!defined($found) || $found == 0); - $name = ($found == 1) ? $name_sn : $name_pl; - - return rate($hit, $found, "% ($hit of $found $name)"); -} - - -# -# print_overall_rate(ln_do, ln_found, ln_hit, fn_do, fn_found, fn_hit, br_do -# br_found, br_hit) -# -# Print overall coverage rates for the specified coverage types. -# - -sub print_overall_rate($$$$$$$$$) -{ - my ($ln_do, $ln_found, $ln_hit, $fn_do, $fn_found, $fn_hit, - $br_do, $br_found, $br_hit) = @_; - - info("Summary coverage rate:\n"); - info(" lines......: %s\n", - get_overall_line($ln_found, $ln_hit, "line", "lines")) - if ($ln_do); - info(" functions..: %s\n", - get_overall_line($fn_found, $fn_hit, "function", "functions")) - if ($fn_do); - info(" branches...: %s\n", - get_overall_line($br_found, $br_hit, "branch", "branches")) - if ($br_do); -} - - -# -# rate(hit, found[, suffix, precision, width]) -# -# Return the coverage rate [0..100] for HIT and FOUND values. 0 is only -# returned when HIT is 0. 100 is only returned when HIT equals FOUND. -# PRECISION specifies the precision of the result. SUFFIX defines a -# string that is appended to the result if FOUND is non-zero. Spaces -# are added to the start of the resulting string until it is at least WIDTH -# characters wide. -# - -sub rate($$;$$$) -{ - my ($hit, $found, $suffix, $precision, $width) = @_; - my $rate; - - # Assign defaults if necessary - $precision = 1 if (!defined($precision)); - $suffix = "" if (!defined($suffix)); - $width = 0 if (!defined($width)); - - return sprintf("%*s", $width, "-") if (!defined($found) || $found == 0); - $rate = sprintf("%.*f", $precision, $hit * 100 / $found); - - # Adjust rates if necessary - if ($rate == 0 && $hit > 0) { - $rate = sprintf("%.*f", $precision, 1 / 10 ** $precision); - } elsif ($rate == 100 && $hit != $found) { - $rate = sprintf("%.*f", $precision, 100 - 1 / 10 ** $precision); - } - - return sprintf("%*s", $width, $rate.$suffix); -} diff --git a/utils/lcov-1.11/bin/updateversion.pl b/utils/lcov-1.11/bin/updateversion.pl deleted file mode 100755 index 55f2bc1d..00000000 --- a/utils/lcov-1.11/bin/updateversion.pl +++ /dev/null @@ -1,146 +0,0 @@ -#!/usr/bin/perl -w - -use strict; - -sub update_man_page($); -sub update_bin_tool($); -sub update_txt_file($); -sub update_spec_file($); -sub get_file_info($); - -our $directory = $ARGV[0]; -our $version = $ARGV[1]; -our $release = $ARGV[2]; - -our @man_pages = ("man/gendesc.1", "man/genhtml.1", "man/geninfo.1", - "man/genpng.1", "man/lcov.1", "man/lcovrc.5"); -our @bin_tools = ("bin/gendesc", "bin/genhtml", "bin/geninfo", - "bin/genpng", "bin/lcov"); -our @txt_files = ("README"); -our @spec_files = ("rpm/lcov.spec"); - -if (!defined($directory) || !defined($version) || !defined($release)) { - die("Usage: $0 \n"); -} - -foreach (@man_pages) { - print("Updating man page $_\n"); - update_man_page($directory."/".$_); -} -foreach (@bin_tools) { - print("Updating bin tool $_\n"); - update_bin_tool($directory."/".$_); -} -foreach (@txt_files) { - print("Updating text file $_\n"); - update_txt_file($directory."/".$_); -} -foreach (@spec_files) { - print("Updating spec file $_\n"); - update_spec_file($directory."/".$_); -} -print("Done.\n"); - -sub get_file_info($) -{ - my ($filename) = @_; - my ($sec, $min, $hour, $year, $month, $day); - my @stat; - - @stat = stat($filename); - ($sec, $min, $hour, $day, $month, $year) = localtime($stat[9]); - $year += 1900; - $month += 1; - - return (sprintf("%04d-%02d-%02d", $year, $month, $day), - sprintf("%04d%02d%02d%02d%02d.%02d", $year, $month, $day, - $hour, $min, $sec), - sprintf("%o", $stat[2] & 07777)); -} - -sub update_man_page($) -{ - my ($filename) = @_; - my @date = get_file_info($filename); - my $date_string = $date[0]; - local *IN; - local *OUT; - - $date_string =~ s/-/\\-/g; - open(IN, "<$filename") || die ("Error: cannot open $filename\n"); - open(OUT, ">$filename.new") || - die("Error: cannot create $filename.new\n"); - while () { - s/\"LCOV\s+\d+\.\d+\"/\"LCOV $version\"/g; - s/\d\d\d\d\\\-\d\d\\\-\d\d/$date_string/g; - print(OUT $_); - } - close(OUT); - close(IN); - chmod(oct($date[2]), "$filename.new"); - system("mv", "-f", "$filename.new", "$filename"); - system("touch", "$filename", "-t", $date[1]); -} - -sub update_bin_tool($) -{ - my ($filename) = @_; - my @date = get_file_info($filename); - local *IN; - local *OUT; - - open(IN, "<$filename") || die ("Error: cannot open $filename\n"); - open(OUT, ">$filename.new") || - die("Error: cannot create $filename.new\n"); - while () { - s/(our\s+\$lcov_version\s*=\s*["']).*(["'].*)$/$1LCOV version $version$2/g; - print(OUT $_); - } - close(OUT); - close(IN); - chmod(oct($date[2]), "$filename.new"); - system("mv", "-f", "$filename.new", "$filename"); - system("touch", "$filename", "-t", $date[1]); -} - -sub update_txt_file($) -{ - my ($filename) = @_; - my @date = get_file_info($filename); - local *IN; - local *OUT; - - open(IN, "<$filename") || die ("Error: cannot open $filename\n"); - open(OUT, ">$filename.new") || - die("Error: cannot create $filename.new\n"); - while () { - s/(Last\s+changes:\s+)\d\d\d\d-\d\d-\d\d/$1$date[0]/g; - print(OUT $_); - } - close(OUT); - close(IN); - chmod(oct($date[2]), "$filename.new"); - system("mv", "-f", "$filename.new", "$filename"); - system("touch", "$filename", "-t", $date[1]); -} - -sub update_spec_file($) -{ - my ($filename) = @_; - my @date = get_file_info($filename); - local *IN; - local *OUT; - - open(IN, "<$filename") || die ("Error: cannot open $filename\n"); - open(OUT, ">$filename.new") || - die("Error: cannot create $filename.new\n"); - while () { - s/^(Version:\s*)\d+\.\d+.*$/$1$version/; - s/^(Release:\s*).*$/$1$release/; - print(OUT $_); - } - close(OUT); - close(IN); - system("mv", "-f", "$filename.new", "$filename"); - system("touch", "$filename", "-t", $date[1]); -} diff --git a/utils/lcov-1.11/contrib/galaxy/CHANGES b/utils/lcov-1.11/contrib/galaxy/CHANGES deleted file mode 100755 index b09883bd..00000000 --- a/utils/lcov-1.11/contrib/galaxy/CHANGES +++ /dev/null @@ -1 +0,0 @@ -09-04-2003 Initial checkin diff --git a/utils/lcov-1.11/contrib/galaxy/README b/utils/lcov-1.11/contrib/galaxy/README deleted file mode 100755 index e21c509c..00000000 --- a/utils/lcov-1.11/contrib/galaxy/README +++ /dev/null @@ -1,48 +0,0 @@ -------------------------------------------------- -- README file for the LCOV galaxy mapping tool - -- Last changes: 2003-09-04 - -------------------------------------------------- - -Description ------------ - -Further README contents ------------------------ - 1. Included files - 2. Installing - 3. Notes and Comments - - - -1. Important files ------------------- - README - This README file - CHANGES - List of changes between releases - conglomerate_functions.pl - Replacement file - Generates shading - genflat.pl - Generates info for shading from .info files - gen_makefile.sh - Replacement file - updates to postscript - posterize.pl - Replacement file - generates a final ps file - -2. Installing -------------- - This install requires fcgp, which means the target kernel src must be on -the system creating the map. - - Download and copy the new files into the fcgp directory, (Note: its always -a good idea to have backups). - - Run genflat.pl against your kernel info files - ./genflat.pl kernel.info kernel2.info > coverage.dat - - Run the make command for the fcgp (Note: this can take a while) - make KERNEL_DIR=/usr/src/linux - - Update posterize.pl as needed, normally page size, margins, titles. -Most of these settings will be broken out as command line options in the future. - - Run posterize.pl this will generate the file poster.ps. - -3. Notes and Comments ---------------------- - This is a quick and dirty implementation suited for my needs. It does not -perform any of the tiling the original did. diff --git a/utils/lcov-1.11/contrib/galaxy/conglomerate_functions.pl b/utils/lcov-1.11/contrib/galaxy/conglomerate_functions.pl deleted file mode 100755 index 4e259fee..00000000 --- a/utils/lcov-1.11/contrib/galaxy/conglomerate_functions.pl +++ /dev/null @@ -1,195 +0,0 @@ -#! /usr/bin/perl -w - -# Takes a set of ps images (belonging to one file) and produces a -# conglomerate picture of that file: static functions in the middle, -# others around it. Each one gets a box about its area. - -use strict; - -my $SCRUNCH = $ARGV [0]; -my $BOXSCRUNCH = $ARGV [1]; -my $Tmp; -my $DEBUG = 1; - -shift @ARGV; # skip SCRUNCH and BOXSCRUNCH -shift @ARGV; - - -DecorateFuncs (@ARGV); - - -#TMPFILE=`mktemp ${TMPDIR:-/tmp}/$$.XXXXXX` - -# Arrange. -my $ArgList = ""; - -foreach $Tmp (@ARGV) { - $ArgList .= "'$Tmp' "; -} - -my @Arranged = `../draw_arrangement $SCRUNCH 0 360 0 $ArgList`; - -my $CFile = $ARGV [0]; -$CFile =~ s/\.c\..*$/.c/; -if ($DEBUG) { print ("% Conglomeration of $CFile\n"); } - -print "gsave angle rotate\n"; - -# Now output the file, except last line. -my $LastLine = pop (@Arranged); -my $Fill = Box_2 ($LastLine,$CFile); -print $Fill; -# Draw box with file name -my @Output = Box ('normal', 'Helvetica-Bold', 32, $CFile, $LastLine); -splice(@Output, $#Output, 0, "grestore\n"); -#print @Output; - -print (@Arranged); -#add a duplicate box to test if this works -print @Output; - - -sub ParseBound -{ - my $BBoxLine = shift; - - $BBoxLine =~ /(-?[\d.]+)\s+(-?[\d.]+)\s+(-?[\d.]+)\s+(-?[\d.]+)/; - - # XMin, YMin, XMax, YMax - return ($1 * $BOXSCRUNCH, $2 * $BOXSCRUNCH, - $3 * $BOXSCRUNCH, $4 * $BOXSCRUNCH); -} - - - -# Box (type, font, fontsize, Label, BBoxLine) -sub Box -{ - my $Type = shift; - my $Font = shift; - my $Fontsize = shift; - my $Label = shift; - my $BBoxLine = shift; - my @Output = (); - - # print (STDERR "Box ('$Type', '$Font', '$Fontsize', '$Label', '$BBoxLine')\n"); - push (@Output, "% start of box\n"); - - push (@Output, "D5\n") if ($Type eq "dashed"); - - # print (STDERR "BBoxLine: '$BBoxLine'\n"); - # print (STDERR "Parsed: '" . join ("' '", ParseBound ($BBoxLine)) . "\n"); - my ($XMin, $YMin, $XMax, $YMax) = ParseBound ($BBoxLine); - - my $LeftSpaced = $XMin + 6; - my $BottomSpaced = $YMin + 6; - - # Put black box around it - push (@Output, ( - "($Label) $LeftSpaced $BottomSpaced $Fontsize /$Font\n", - "$YMin $XMin $YMax $XMax U\n" - ) - ); - - push (@Output, "D\n") if ($Type eq "dashed"); - # fill bounding box - push (@Output, "% end of box\n"); - - # Output bounding box - push (@Output, "% bound $XMin $YMin $XMax $YMax\n"); - - return @Output; -} - -sub Box_2 -{ - my $BBoxLine = shift; - my $CFile = shift; - my $CovFile = "./coverage.dat"; - my ($XMin, $YMin, $XMax, $YMax) = ParseBound ($BBoxLine); - my @output = `fgrep $CFile $CovFile`; - chomp $output[0]; - my ($junk, $Class, $per) = split /\t/, $output[0]; - return "$XMin $YMin $XMax $YMax $Class\n"; -} -# Decorate (rgb-vals(1 string) filename) -sub Decorate -{ - my $RGB = shift; - my $Filename = shift; - - my @Input = ReadPS ($Filename); - my $LastLine = pop (@Input); - my @Output = (); - - # Color at the beginning. - push (@Output, "C$RGB\n"); - - # Now output the file, except last line. - push (@Output, @Input); - - # Draw dashed box with function name - # FIXME Make bound cover the label as well! - my $FuncName = $Filename; - $FuncName =~ s/^[^.]+\.c\.(.+?)\..*$/$1/; - - push (@Output, Box ('dashed', 'Helvetica', 24, $FuncName, $LastLine)); - - # Slap over the top. - WritePS ($Filename, @Output); -} - - - -# Add colored boxes around functions -sub DecorateFuncs -{ - my $FName = ""; - my $FType = ""; - - foreach $FName (@ARGV) - { - $FName =~ /\+([A-Z]+)\+/; - $FType = $1; - - if ($FType eq 'STATIC') { - Decorate ("2", $FName); # Light green. - } - elsif ($FType eq 'INDIRECT') { - Decorate ("3", $FName); # Green. - } - elsif ($FType eq 'EXPORTED') { - Decorate ("4", $FName); # Red. - } - elsif ($FType eq 'NORMAL') { - Decorate ("5", $FName); # Blue. - } - else { - die ("Unknown extension $FName"); - } - } -} - - -sub ReadPS -{ - my $Filename = shift; - my @Contents = (); - - open (INFILE, "$Filename") or die ("Could not read $Filename: $!"); - @Contents = ; - close (INFILE); - - return @Contents; -} - -sub WritePS -{ - my $Filename = shift; - - open (OUTFILE, ">$Filename") - or die ("Could not write $Filename: $!"); - print (OUTFILE @_); - close (OUTFILE); -} - diff --git a/utils/lcov-1.11/contrib/galaxy/gen_makefile.sh b/utils/lcov-1.11/contrib/galaxy/gen_makefile.sh deleted file mode 100755 index ab51a5ea..00000000 --- a/utils/lcov-1.11/contrib/galaxy/gen_makefile.sh +++ /dev/null @@ -1,129 +0,0 @@ -#! /bin/sh - -cd image - -# Space-optimized version: strip comments, drop precision to 3 -# figures, eliminate duplicates. -# update(creinig): precision reduction is now done in data2ps and comments -# (except for % bound) now are also ommitted from the start - -echo 'image.ps: image-unop.ps' -#echo ' grep -v "^%" < $< | sed -e "s/\.\([0-9][0-9]\)[0-9]\+/.\1/g" -e "s/\(^\| \|-\)\([0-9][0-9][0-9]\)[0-9][0-9]\.[0-9][0-9]/\1\200/g" -e "s/\(^\| \|-\)\([0-9][0-9][0-9]\)[0-9]\.[0-9][0-9]/\1\20/g" -e "s/\(^\| \|-\)\([0-9][0-9][0-9]\)\.[0-9][0-9]/\1\2/g" -e "s/\(^\| \|-\)\([0-9][0-9]\)\.\([0-9]\)[0-9]/\1\2.\30/g" | awk "\$$0 ~ /lineto/ { if ( LASTLINE == \$$0 ) next; } { LASTLINE=\$$0; print; }" > $@' -echo ' grep -v "^% bound" < $< > $@' -# Need last comment (bounding box) -echo ' tail -1 $< >> $@' -echo ' ls -l image.ps image-unop.ps' - -echo 'image-unop.ps: outline.ps ring1.ps ring2.ps ring3.ps ring4.ps' -echo ' cat ring[1234].ps > $@' -# Bounding box is at bottom now. Next two won't change it. -echo ' tail -1 $@ > bounding-box' -echo ' cat outline.ps >> $@' -echo ' cat ../tux.ps >> $@' -echo ' cat bounding-box >> $@ && rm bounding-box' - -# Finished rings are precious! -echo .SECONDARY: ring1.ps ring2.ps ring3.ps ring4.ps - -# Rings 1 and 4 are all thrown together. -echo RING1_DEPS:=`find $RING1 -name '*.c.*' | sed 's/\.c.*/-all.ps/' | sort | uniq` -echo RING4_DEPS:=`find $RING4 -name '*.c.*' | sed 's/\.c.*/-all.ps/' | sort | uniq` - -# Other rings are divided into dirs. -echo RING2_DEPS:=`for d in $RING2; do echo $d-ring2.ps; done` -echo RING3_DEPS:=`for d in $RING3; do echo $d-ring3.ps; done` -echo - -# First ring starts at inner radius. -echo 'ring1.ps: $(RING1_DEPS)' -echo " @echo Making Ring 1" -echo " @echo /angle 0 def > \$@" -echo " @../draw_arrangement $FILE_SCRUNCH 0 360 $INNER_RADIUS \$(RING1_DEPS) >> \$@" -echo " @echo Done Ring 1" - -# Second ring starts at end of above ring (assume it's circular, so -# grab any bound). -echo 'ring2.ps: ring1.ps $(RING2_DEPS)' -echo " @echo Making Ring 2" -echo " @echo /angle 0 def > \$@" -echo " @../rotary_arrange.sh $DIR_SPACING" `for f in $RING2; do echo $f-ring2.ps $f-ring2.angle; done` '>> $@' -echo " @echo Done Ring 2" - -# Third ring starts at end of second ring. -echo 'ring3.ps: ring2.ps $(RING3_DEPS)' -echo " @echo Making Ring 3" -echo " @echo /angle 0 def > \$@" -echo " @../rotary_arrange.sh $DIR_SPACING" `for f in $RING3; do echo $f-ring3.ps $f-ring3.angle; done` '>> $@' -echo " @echo Done Ring 3" - -# Outer ring starts at end of fourth ring. -# And it's just a big ring of drivers. -echo 'ring4.ps: $(RING4_DEPS) ring3.radius' -echo " @echo Making Ring 4" -echo " @echo /angle 0 def > \$@" -echo " @../draw_arrangement $FILE_SCRUNCH 0 360 \`cat ring3.radius\` \$(RING4_DEPS) >> \$@" -echo " @echo Done Ring 4" -echo - -# How to make directory picture: angle file contains start and end angle. -# Second ring starts at end of above ring (assume it's circular, so -# grab any bound). -echo "%-ring2.ps: %-ring2.angle ring1.radius" -echo " @echo Rendering \$@" -echo " @../draw_arrangement $FILE_SCRUNCH 0 \`cat \$<\` \`cat ring1.radius\` \`find \$* -name '*-all.ps'\` > \$@" - -echo "%-ring3.ps: %-ring3.angle ring2.radius" -echo " @echo Rendering \$@" -echo " @../draw_arrangement $FILE_SCRUNCH 0 \`cat \$<\` \`cat ring2.radius\` \`find \$* -name '*-all.ps'\` > \$@" - -# How to extract radii -echo "%.radius: %.ps" -echo ' @echo scale=2\; `tail -1 $< | sed "s/^.* //"` + '$RING_SPACING' | bc > $@' -echo - -# How to make angle. Need total angle for that directory, and weight. -echo "%-ring2.angle: %-ring2.weight ring2.weight" -echo ' @echo "scale=2; ( 360 - ' `echo $RING2 | wc -w` ' * ' $DIR_SPACING ') * `cat $<` / `cat ring2.weight`" | bc > $@' - -echo "%-ring3.angle: %-ring3.weight ring3.weight" -echo ' @echo "scale=2; ( 360 - ' `echo $RING3 | wc -w` ' * ' $DIR_SPACING ') * `cat $<` / `cat ring3.weight`" | bc > $@' - -# How to make ring weights (sum directory totals). -echo "ring2.weight:" `for d in $RING2; do echo $d-ring2.weight; done` -echo ' @cat $^ | ../tally > $@' -echo "ring3.weight:" `for d in $RING3; do echo $d-ring3.weight; done` -echo ' @cat $^ | ../tally > $@' - -# How to make a wieght. -echo "%-ring2.weight:" `find $RING2 -name '*.c.*' | sed 's/\.c.*/-all.ps/' | sort | uniq` -echo ' @../total_area.pl `find $* -name \*-all.ps` > $@' -echo "%-ring3.weight:" `find $RING3 -name '*.c.*' | sed 's/\.c.*/-all.ps/' | sort | uniq` -echo ' @../total_area.pl `find $* -name \*-all.ps` > $@' -echo - -# Now rule to make the graphs of a function. -#echo %.ps::% -#echo ' @../function2ps `echo $< | sed '\''s/^.*\.\([^.]*\)\.\+.*$$/\1/'\''` > $@ $<' -## Need the space. -##echo ' @rm -f $<' -#echo - -# Rule to make all from constituent parts. -echo %-all.ps: -echo " @echo Rendering \$*.c" -echo " @../conglomerate_functions.pl $FUNCTION_SCRUNCH $BOX_SCRUNCH \$^ > \$@" -# Need the space. -#echo ' @rm -f $^' -echo - -# Generating outline, requires all the angles. -echo outline.ps: ../make-outline.sh ring1.ps ring2.ps ring3.ps ring4.ps `for f in $RING2; do echo $f-ring2.angle; done` `for f in $RING3; do echo $f-ring3.angle; done` -echo " ../make-outline.sh $INNER_RADIUS $DIR_SPACING $RING_SPACING \"$RING1\" > \$@" -echo - -# Now all the rules to make each function. -for d in `find . -type d`; do - for f in `cd $d; ls *+.ps 2>/dev/null | sed 's/\.c\..*$//' | uniq`; do - echo $d/$f-all.ps: `cd $d; ls $f.c.* | sed -e "s?^?$d/?"` - done -done diff --git a/utils/lcov-1.11/contrib/galaxy/genflat.pl b/utils/lcov-1.11/contrib/galaxy/genflat.pl deleted file mode 100755 index b8b8ff47..00000000 --- a/utils/lcov-1.11/contrib/galaxy/genflat.pl +++ /dev/null @@ -1,1238 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (c) International Business Machines Corp., 2002 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# genflat -# -# This script generates std output from .info files as created by the -# geninfo script. Call it with --help to get information on usage and -# available options. This code is based on the lcov genhtml script -# by Peter Oberparleiter -# -# -# History: -# 2003-08-19 ripped up Peter's script James M Kenefick Jr. -# - -use strict; -use File::Basename; -use Getopt::Long; -# Constants -our $lcov_version = ""; -our $lcov_url = ""; - -# Specify coverage rate limits (in %) for classifying file entries -# HI: $hi_limit <= rate <= 100 graph color: green -# MED: $med_limit <= rate < $hi_limit graph color: orange -# LO: 0 <= rate < $med_limit graph color: red -our $hi_limit = 50; -our $med_limit = 15; - -# Data related prototypes -sub print_usage(*); -sub gen_html(); -sub process_dir($); -sub process_file($$$); -sub info(@); -sub read_info_file($); -sub get_info_entry($); -sub set_info_entry($$$$;$$); -sub get_prefix(@); -sub shorten_prefix($); -sub get_dir_list(@); -sub get_relative_base_path($); -sub get_date_string(); -sub split_filename($); -sub subtract_counts($$); -sub add_counts($$); -sub apply_baseline($$); -sub combine_info_files($$); -sub combine_info_entries($$); -sub apply_prefix($$); -sub escape_regexp($); - - -# HTML related prototypes - - -sub write_file_table(*$$$$); - - -# Global variables & initialization -our %info_data; # Hash containing all data from .info file -our $dir_prefix; # Prefix to remove from all sub directories -our %test_description; # Hash containing test descriptions if available -our $date = get_date_string(); - -our @info_filenames; # List of .info files to use as data source -our $test_title; # Title for output as written to each page header -our $output_directory; # Name of directory in which to store output -our $base_filename; # Optional name of file containing baseline data -our $desc_filename; # Name of file containing test descriptions -our $css_filename; # Optional name of external stylesheet file to use -our $quiet; # If set, suppress information messages -our $help; # Help option flag -our $version; # Version option flag -our $show_details; # If set, generate detailed directory view -our $no_prefix; # If set, do not remove filename prefix -our $frames; # If set, use frames for source code view -our $keep_descriptions; # If set, do not remove unused test case descriptions -our $no_sourceview; # If set, do not create a source code view for each file -our $tab_size = 8; # Number of spaces to use in place of tab - -our $cwd = `pwd`; # Current working directory -chomp($cwd); -our $tool_dir = dirname($0); # Directory where genhtml tool is installed - - -# -# Code entry point -# - -# Add current working directory if $tool_dir is not already an absolute path -if (! ($tool_dir =~ /^\/(.*)$/)) -{ - $tool_dir = "$cwd/$tool_dir"; -} - -# Parse command line options -if (!GetOptions("output-directory=s" => \$output_directory, - "css-file=s" => \$css_filename, - "baseline-file=s" => \$base_filename, - "prefix=s" => \$dir_prefix, - "num-spaces=i" => \$tab_size, - "no-prefix" => \$no_prefix, - "quiet" => \$quiet, - "help" => \$help, - "version" => \$version - )) -{ - print_usage(*STDERR); - exit(1); -} - -@info_filenames = @ARGV; - -# Check for help option -if ($help) -{ - print_usage(*STDOUT); - exit(0); -} - -# Check for version option -if ($version) -{ - print($lcov_version."\n"); - exit(0); -} - -# Check for info filename -if (!@info_filenames) -{ - print(STDERR "No filename specified\n"); - print_usage(*STDERR); - exit(1); -} - -# Generate a title if none is specified -if (!$test_title) -{ - if (scalar(@info_filenames) == 1) - { - # Only one filename specified, use it as title - $test_title = basename($info_filenames[0]); - } - else - { - # More than one filename specified, used default title - $test_title = "unnamed"; - } -} - -# Make sure tab_size is within valid range -if ($tab_size < 1) -{ - print(STDERR "ERROR: invalid number of spaces specified: ". - "$tab_size!\n"); - exit(1); -} - -# Do something -gen_html(); - -exit(0); - - - -# -# print_usage(handle) -# -# Print usage information. -# - -sub print_usage(*) -{ - local *HANDLE = $_[0]; - my $executable_name = basename($0); - - print(HANDLE < \%data -# -# %data: "test" -> \%testdata -# "sum" -> \%sumcount -# "func" -> \%funcdata -# "found" -> $lines_found (number of instrumented lines found in file) -# "hit" -> $lines_hit (number of executed lines in file) -# -# %testdata: name of test affecting this file -> \%testcount -# -# %testcount: line number -> execution count for a single test -# %sumcount : line number -> execution count for all tests -# %funcdata : line number -> name of function beginning at that line -# -# Note that .info file sections referring to the same file and test name -# will automatically be combined by adding all execution counts. -# -# Note that if INFO_FILENAME ends with ".gz", it is assumed that the file -# is compressed using GZIP. If available, GUNZIP will be used to decompress -# this file. -# -# Die on error -# - -sub read_info_file($) -{ - my $tracefile = $_[0]; # Name of tracefile - my %result; # Resulting hash: file -> data - my $data; # Data handle for current entry - my $testdata; # " " - my $testcount; # " " - my $sumcount; # " " - my $funcdata; # " " - my $line; # Current line read from .info file - my $testname; # Current test name - my $filename; # Current filename - my $hitcount; # Count for lines hit - my $count; # Execution count of current line - my $negative; # If set, warn about negative counts - local *INFO_HANDLE; # Filehandle for .info file - - # Check if file exists and is readable - stat($_[0]); - if (!(-r _)) - { - die("ERROR: cannot read file $_[0]!\n"); - } - - # Check if this is really a plain file - if (!(-f _)) - { - die("ERROR: not a plain file: $_[0]!\n"); - } - - # Check for .gz extension - if ($_[0] =~ /^(.*)\.gz$/) - { - # Check for availability of GZIP tool - system("gunzip -h >/dev/null 2>/dev/null") - and die("ERROR: gunzip command not available!\n"); - - # Check integrity of compressed file - system("gunzip -t $_[0] >/dev/null 2>/dev/null") - and die("ERROR: integrity check failed for ". - "compressed file $_[0]!\n"); - - # Open compressed file - open(INFO_HANDLE, "gunzip -c $_[0]|") - or die("ERROR: cannot start gunzip to uncompress ". - "file $_[0]!\n"); - } - else - { - # Open uncompressed file - open(INFO_HANDLE, $_[0]) - or die("ERROR: cannot read file $_[0]!\n"); - } - - $testname = ""; - while () - { - chomp($_); - $line = $_; - - # Switch statement - foreach ($line) - { - /^TN:(\w+)/ && do - { - # Test name information found - $testname = $1; - last; - }; - - /^[SK]F:(.*)/ && do - { - # Filename information found - # Retrieve data for new entry - $filename = $1; - - $data = $result{$filename}; - ($testdata, $sumcount, $funcdata) = - get_info_entry($data); - - if (defined($testname)) - { - $testcount = $testdata->{$testname}; - } - else - { - my %new_hash; - $testcount = \%new_hash; - } - last; - }; - - /^DA:(\d+),(-?\d+)/ && do - { - # Fix negative counts - $count = $2 < 0 ? 0 : $2; - if ($2 < 0) - { - $negative = 1; - } - # Execution count found, add to structure - # Add summary counts - $sumcount->{$1} += $count; - - # Add test-specific counts - if (defined($testname)) - { - $testcount->{$1} += $count; - } - last; - }; - - /^FN:(\d+),([^,]+)/ && do - { - # Function data found, add to structure - $funcdata->{$1} = $2; - last; - }; - - /^end_of_record/ && do - { - # Found end of section marker - if ($filename) - { - # Store current section data - if (defined($testname)) - { - $testdata->{$testname} = - $testcount; - } - set_info_entry($data, $testdata, - $sumcount, $funcdata); - $result{$filename} = $data; - } - - }; - - # default - last; - } - } - close(INFO_HANDLE); - - # Calculate lines_found and lines_hit for each file - foreach $filename (keys(%result)) - { - $data = $result{$filename}; - - ($testdata, $sumcount, $funcdata) = get_info_entry($data); - - $data->{"found"} = scalar(keys(%{$sumcount})); - $hitcount = 0; - - foreach (keys(%{$sumcount})) - { - if ($sumcount->{$_} >0) { $hitcount++; } - } - - $data->{"hit"} = $hitcount; - - $result{$filename} = $data; - } - - if (scalar(keys(%result)) == 0) - { - die("ERROR: No valid records found in tracefile $tracefile\n"); - } - if ($negative) - { - warn("WARNING: Negative counts found in tracefile ". - "$tracefile\n"); - } - - return(\%result); -} - - -# -# get_info_entry(hash_ref) -# -# Retrieve data from an entry of the structure generated by read_info_file(). -# Return a list of references to hashes: -# (test data hash ref, sum count hash ref, funcdata hash ref, lines found, -# lines hit) -# - -sub get_info_entry($) -{ - my $testdata_ref = $_[0]->{"test"}; - my $sumcount_ref = $_[0]->{"sum"}; - my $funcdata_ref = $_[0]->{"func"}; - my $lines_found = $_[0]->{"found"}; - my $lines_hit = $_[0]->{"hit"}; - - return ($testdata_ref, $sumcount_ref, $funcdata_ref, $lines_found, - $lines_hit); -} - - -# -# set_info_entry(hash_ref, testdata_ref, sumcount_ref, funcdata_ref[, -# lines_found, lines_hit]) -# -# Update the hash referenced by HASH_REF with the provided data references. -# - -sub set_info_entry($$$$;$$) -{ - my $data_ref = $_[0]; - - $data_ref->{"test"} = $_[1]; - $data_ref->{"sum"} = $_[2]; - $data_ref->{"func"} = $_[3]; - - if (defined($_[4])) { $data_ref->{"found"} = $_[4]; } - if (defined($_[5])) { $data_ref->{"hit"} = $_[5]; } -} - - -# -# get_prefix(filename_list) -# -# Search FILENAME_LIST for a directory prefix which is common to as many -# list entries as possible, so that removing this prefix will minimize the -# sum of the lengths of all resulting shortened filenames. -# - -sub get_prefix(@) -{ - my @filename_list = @_; # provided list of filenames - my %prefix; # mapping: prefix -> sum of lengths - my $current; # Temporary iteration variable - - # Find list of prefixes - foreach (@filename_list) - { - # Need explicit assignment to get a copy of $_ so that - # shortening the contained prefix does not affect the list - $current = shorten_prefix($_); - while ($current = shorten_prefix($current)) - { - # Skip rest if the remaining prefix has already been - # added to hash - if ($prefix{$current}) { last; } - - # Initialize with 0 - $prefix{$current}="0"; - } - - } - - # Calculate sum of lengths for all prefixes - foreach $current (keys(%prefix)) - { - foreach (@filename_list) - { - # Add original length - $prefix{$current} += length($_); - - # Check whether prefix matches - if (substr($_, 0, length($current)) eq $current) - { - # Subtract prefix length for this filename - $prefix{$current} -= length($current); - } - } - } - - # Find and return prefix with minimal sum - $current = (keys(%prefix))[0]; - - foreach (keys(%prefix)) - { - if ($prefix{$_} < $prefix{$current}) - { - $current = $_; - } - } - - return($current); -} - - -# -# shorten_prefix(prefix) -# -# Return PREFIX shortened by last directory component. -# - -sub shorten_prefix($) -{ - my @list = split("/", $_[0]); - - pop(@list); - return join("/", @list); -} - - - -# -# get_dir_list(filename_list) -# -# Return sorted list of directories for each entry in given FILENAME_LIST. -# - -sub get_dir_list(@) -{ - my %result; - - foreach (@_) - { - $result{shorten_prefix($_)} = ""; - } - - return(sort(keys(%result))); -} - - -# -# get_relative_base_path(subdirectory) -# -# Return a relative path string which references the base path when applied -# in SUBDIRECTORY. -# -# Example: get_relative_base_path("fs/mm") -> "../../" -# - -sub get_relative_base_path($) -{ - my $result = ""; - my $index; - - # Make an empty directory path a special case - if (!$_[0]) { return(""); } - - # Count number of /s in path - $index = ($_[0] =~ s/\//\//g); - - # Add a ../ to $result for each / in the directory path + 1 - for (; $index>=0; $index--) - { - $result .= "../"; - } - - return $result; -} - - -# -# get_date_string() -# -# Return the current date in the form: yyyy-mm-dd -# - -sub get_date_string() -{ - my $year; - my $month; - my $day; - - ($year, $month, $day) = (localtime())[5, 4, 3]; - - return sprintf("%d-%02d-%02d", $year+1900, $month+1, $day); -} - - -# -# split_filename(filename) -# -# Return (path, filename, extension) for a given FILENAME. -# - -sub split_filename($) -{ - if (!$_[0]) { return(); } - my @path_components = split('/', $_[0]); - my @file_components = split('\.', pop(@path_components)); - my $extension = pop(@file_components); - - return (join("/",@path_components), join(".",@file_components), - $extension); -} - - -# -# write_file_table(filehandle, base_dir, overview, testhash, fileview) -# -# Write a complete file table. OVERVIEW is a reference to a hash containing -# the following mapping: -# -# filename -> "lines_found,lines_hit,page_link" -# -# TESTHASH is a reference to the following hash: -# -# filename -> \%testdata -# %testdata: name of test affecting this file -> \%testcount -# %testcount: line number -> execution count for a single test -# -# Heading of first column is "Filename" if FILEVIEW is true, "Directory name" -# otherwise. -# - -sub write_file_table(*$$$$) -{ - my $dir = $_[0]; - my $base_dir = $_[1]; - my %overview = %{$_[2]}; - my %testhash = %{$_[3]}; - my $fileview = $_[4]; - my $filename; - my $hit; - my $found; - my $classification; - my $rate_string; - my $rate; - my $junk; - - - foreach $filename (sort(keys(%overview))) - { - ($found, $hit, $junk) = split(",", $overview{$filename}); -#James I think this is right - $rate = $hit * 100 / $found; - $rate_string = sprintf("%.1f", $rate); - - if ($rate < 0.001) { $classification = "None"; } - elsif ($rate < $med_limit) { $classification = "Lo"; } - elsif ($rate < $hi_limit) { $classification = "Med"; } - else { $classification = "Hi"; } - - print "$dir/$filename\t$classification\t$rate_string\n"; - - } -} - - -# -# info(printf_parameter) -# -# Use printf to write PRINTF_PARAMETER to stdout only when the $quiet flag -# is not set. -# - -sub info(@) -{ - if (!$quiet) - { - # Print info string - printf(STDERR @_); - } -} - - -# -# subtract_counts(data_ref, base_ref) -# - -sub subtract_counts($$) -{ - my %data = %{$_[0]}; - my %base = %{$_[1]}; - my $line; - my $data_count; - my $base_count; - my $hit = 0; - my $found = 0; - - foreach $line (keys(%data)) - { - $found++; - $data_count = $data{$line}; - $base_count = $base{$line}; - - if (defined($base_count)) - { - $data_count -= $base_count; - - # Make sure we don't get negative numbers - if ($data_count<0) { $data_count = 0; } - } - - $data{$line} = $data_count; - if ($data_count > 0) { $hit++; } - } - - return (\%data, $found, $hit); -} - - -# -# add_counts(data1_ref, data2_ref) -# -# DATA1_REF and DATA2_REF are references to hashes containing a mapping -# -# line number -> execution count -# -# Return a list (RESULT_REF, LINES_FOUND, LINES_HIT) where RESULT_REF -# is a reference to a hash containing the combined mapping in which -# execution counts are added. -# - -sub add_counts($$) -{ - my %data1 = %{$_[0]}; # Hash 1 - my %data2 = %{$_[1]}; # Hash 2 - my %result; # Resulting hash - my $line; # Current line iteration scalar - my $data1_count; # Count of line in hash1 - my $data2_count; # Count of line in hash2 - my $found = 0; # Total number of lines found - my $hit = 0; # Number of lines with a count > 0 - - foreach $line (keys(%data1)) - { - $data1_count = $data1{$line}; - $data2_count = $data2{$line}; - - # Add counts if present in both hashes - if (defined($data2_count)) { $data1_count += $data2_count; } - - # Store sum in %result - $result{$line} = $data1_count; - - $found++; - if ($data1_count > 0) { $hit++; } - } - - # Add lines unique to data2 - foreach $line (keys(%data2)) - { - # Skip lines already in data1 - if (defined($data1{$line})) { next; } - - # Copy count from data2 - $result{$line} = $data2{$line}; - - $found++; - if ($result{$line} > 0) { $hit++; } - } - - return (\%result, $found, $hit); -} - - -# -# apply_baseline(data_ref, baseline_ref) -# -# Subtract the execution counts found in the baseline hash referenced by -# BASELINE_REF from actual data in DATA_REF. -# - -sub apply_baseline($$) -{ - my %data_hash = %{$_[0]}; - my %base_hash = %{$_[1]}; - my $filename; - my $testname; - my $data; - my $data_testdata; - my $data_funcdata; - my $data_count; - my $base; - my $base_testdata; - my $base_count; - my $sumcount; - my $found; - my $hit; - - foreach $filename (keys(%data_hash)) - { - # Get data set for data and baseline - $data = $data_hash{$filename}; - $base = $base_hash{$filename}; - - # Get set entries for data and baseline - ($data_testdata, undef, $data_funcdata) = - get_info_entry($data); - ($base_testdata, $base_count) = get_info_entry($base); - - # Sumcount has to be calculated anew - $sumcount = {}; - - # For each test case, subtract test specific counts - foreach $testname (keys(%{$data_testdata})) - { - # Get counts of both data and baseline - $data_count = $data_testdata->{$testname}; - - $hit = 0; - - ($data_count, undef, $hit) = - subtract_counts($data_count, $base_count); - - # Check whether this test case did hit any line at all - if ($hit > 0) - { - # Write back resulting hash - $data_testdata->{$testname} = $data_count; - } - else - { - # Delete test case which did not impact this - # file - delete($data_testdata->{$testname}); - } - - # Add counts to sum of counts - ($sumcount, $found, $hit) = - add_counts($sumcount, $data_count); - } - - # Write back resulting entry - set_info_entry($data, $data_testdata, $sumcount, - $data_funcdata, $found, $hit); - - $data_hash{$filename} = $data; - } - - return (\%data_hash); -} - - -# -# combine_info_entries(entry_ref1, entry_ref2) -# -# Combine .info data entry hashes referenced by ENTRY_REF1 and ENTRY_REF2. -# Return reference to resulting hash. -# - -sub combine_info_entries($$) -{ - my $entry1 = $_[0]; # Reference to hash containing first entry - my $testdata1; - my $sumcount1; - my $funcdata1; - - my $entry2 = $_[1]; # Reference to hash containing second entry - my $testdata2; - my $sumcount2; - my $funcdata2; - - my %result; # Hash containing combined entry - my %result_testdata; - my $result_sumcount = {}; - my %result_funcdata; - my $lines_found; - my $lines_hit; - - my $testname; - - # Retrieve data - ($testdata1, $sumcount1, $funcdata1) = get_info_entry($entry1); - ($testdata2, $sumcount2, $funcdata2) = get_info_entry($entry2); - - # Combine funcdata - foreach (keys(%{$funcdata1})) - { - $result_funcdata{$_} = $funcdata1->{$_}; - } - - foreach (keys(%{$funcdata2})) - { - $result_funcdata{$_} = $funcdata2->{$_}; - } - - # Combine testdata - foreach $testname (keys(%{$testdata1})) - { - if (defined($testdata2->{$testname})) - { - # testname is present in both entries, requires - # combination - ($result_testdata{$testname}) = - add_counts($testdata1->{$testname}, - $testdata2->{$testname}); - } - else - { - # testname only present in entry1, add to result - $result_testdata{$testname} = $testdata1->{$testname}; - } - - # update sum count hash - ($result_sumcount, $lines_found, $lines_hit) = - add_counts($result_sumcount, - $result_testdata{$testname}); - } - - foreach $testname (keys(%{$testdata2})) - { - # Skip testnames already covered by previous iteration - if (defined($testdata1->{$testname})) { next; } - - # testname only present in entry2, add to result hash - $result_testdata{$testname} = $testdata2->{$testname}; - - # update sum count hash - ($result_sumcount, $lines_found, $lines_hit) = - add_counts($result_sumcount, - $result_testdata{$testname}); - } - - # Calculate resulting sumcount - - # Store result - set_info_entry(\%result, \%result_testdata, $result_sumcount, - \%result_funcdata, $lines_found, $lines_hit); - - return(\%result); -} - - -# -# combine_info_files(info_ref1, info_ref2) -# -# Combine .info data in hashes referenced by INFO_REF1 and INFO_REF2. Return -# reference to resulting hash. -# - -sub combine_info_files($$) -{ - my %hash1 = %{$_[0]}; - my %hash2 = %{$_[1]}; - my $filename; - - foreach $filename (keys(%hash2)) - { - if ($hash1{$filename}) - { - # Entry already exists in hash1, combine them - $hash1{$filename} = - combine_info_entries($hash1{$filename}, - $hash2{$filename}); - } - else - { - # Entry is unique in both hashes, simply add to - # resulting hash - $hash1{$filename} = $hash2{$filename}; - } - } - - return(\%hash1); -} - - -# -# apply_prefix(filename, prefix) -# -# If FILENAME begins with PREFIX, remove PREFIX from FILENAME and return -# resulting string, otherwise return FILENAME. -# - -sub apply_prefix($$) -{ - my $filename = $_[0]; - my $prefix = $_[1]; - my $clean_prefix = escape_regexp($prefix); - - if (defined($prefix) && ($prefix ne "")) - { - if ($filename =~ /^$clean_prefix\/(.*)$/) - { - return substr($filename, length($prefix) + 1); - } - } - - return $filename; -} - - -# -# escape_regexp(string) -# -# Escape special characters in STRING which would be incorrectly interpreted -# in a PERL regular expression. -# - -sub escape_regexp($) -{ - my $string = $_[0]; - - # Escape special characters - $string =~ s/\\/\\\\/g; - $string =~ s/\^/\\\^/g; - $string =~ s/\$/\\\$/g; - $string =~ s/\./\\\./g; - $string =~ s/\|/\\\|/g; - $string =~ s/\(/\\\(/g; - $string =~ s/\)/\\\)/g; - $string =~ s/\[/\\\[/g; - $string =~ s/\]/\\\]/g; - $string =~ s/\*/\\\*/g; - $string =~ s/\?/\\\?/g; - $string =~ s/\{/\\\{/g; - $string =~ s/\}/\\\}/g; - $string =~ s/\+/\\\+/g; - - return $string; -} diff --git a/utils/lcov-1.11/contrib/galaxy/posterize.pl b/utils/lcov-1.11/contrib/galaxy/posterize.pl deleted file mode 100755 index 1b2895ed..00000000 --- a/utils/lcov-1.11/contrib/galaxy/posterize.pl +++ /dev/null @@ -1,312 +0,0 @@ -#!/usr/bin/perl -# -# Copyright (c) International Business Machines Corp., 2002 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# posterize.pl -# -# This script generates a postscript file from output generated from the -# fcgp http://sourceforge.net/projects/fcgp/ for plotting -# -# -# History: -# 2003-09-04 wrote - James M Kenefick Jr. -# - - - -# a good deal of this could be turned in to cli -# arguments. - -# Constants -my $Title = "Linux Kernel Coverage"; -my $KernelVersion = "2.5.73"; -my $TestDescription = "A Sample Print"; -my $Image = "../lgp/image.ps"; - -# Variables -my $Bounds = ""; -# Paper sizes in inches -my $PAPER_WIDTH = 34; -my $PAPER_HEIGHT = 42; - -# points per inch -my $ppi = 72; - -# Margins -my $TopMargin = 1; -my $BottomMargin = 1.5; -my $LeftMargin = 1; -my $RightMargin = 1; - - -$RightMargin = $PAPER_WIDTH - $RightMargin; -$TopMargin = $PAPER_HEIGHT - $TopMargin; - -my $filename = "poster.ps"; - -# Sizes in ppi -my $PPI_WIDTH = ($PAPER_WIDTH * $ppi); -my $PPI_HEIGHT = ($PAPER_HEIGHT * $ppi); - -# Date we create poster -my $date = `date`; - -print STDERR "Creating Poster\n"; - -open POSTER, ">$filename"; - - - -print(POSTER < 0 in parent from wait; -fork03 - Check that child can use a large text space and do a large - number of operations. -fork04 - Child inheritance of Environment Variables after fork(). -fork05 - Make sure LDT is propagated correctly -fork06 - Test that a process can fork children a large number of - times in succession -fork07 - Check that all children inherit parent's file descriptor -fork08 - Check if the parent's file descriptors are affected by - actions in the child; they should not be. -fork09 - Check that child has access to a full set of files. -fork10 - Check inheritance of file descriptor by children, they - should all be referring to the same file. -fork11 - Test that parent gets a pid from each child when doing wait -vfork01 - Fork a process using vfork() and verify that, the attribute values like - euid, ruid, suid, egid, rgid, sgid, umask, inode and device number of - root and current working directories are same as that of the parent - process. -vfork02 - Fork a process using vfork() and verify that, the pending signals in - the parent are not pending in the child process. -ioctl01 - - Testcase to check the errnos set by the ioctl(2) system call. - -ioctl02 - - Testcase to test the TCGETA, and TCSETA ioctl implementations for - the tty driver - -sockioctl01 - - Verify that ioctl() on sockets returns the proper errno for various - failure cases - -getitimer01 - check that a correct call to getitimer() succeeds - - -getitimer02 - check that a getitimer() call fails as expected - with an incorrect second argument. - -getitimer03 - check that a getitimer() call fails as expected - with an incorrect first argument. - -setitimer01 - check that a reasonable setitimer() call succeeds. - - -setitimer02 - check that a setitimer() call fails as expected - with incorrect values. - -setitimer03 - check that a setitimer() call fails as expected - with incorrect values. - -float_trigo - increase CPUs workload - verify that results of some math functions are stable - trigonometric (acos, asin, atan, atan2, cos, sin, tan), - hyperbolic (cosh, sinh, tanh), - -float_exp_log - increase CPUs workload - verify that results of some math functions are stable - exponential and logarithmic functions (exp, log, log10), - Functions that manipulate floating-point numbers (modf, ldexp, frexp), - Euclidean distance function (hypot), - -float_bessel - increase CPUs workload - verify that results of some math functions are stable - Bessel (j0, j1, y0, y1), - Computes the natural logarithm of the gamma function (lgamma), - -fload_power - increase CPUs workload - verify that results of some math functions are stable - Computes sqrt, power, fmod - -float_iperb - increase CPUs workload - verify that results of some math functions are stable -pth_str01 - - Creates a tree of threads - -pth_str02 - - Creates n threads - -pth_str03 - - Creates a tree of threads does calculations, and - returns result to parent - - -asyncio02 - - Write/close flushes data to the file. - - -fpathconf - - Basic test for fpathconf(2) - -gethostid01 - - Basic test for gethostid(2) - - -pathconf01 - - Basic test for pathconf(2) - -setpgrp01 - - Basic test for the setpgrp(2) system call. - -setpgrp02 - - Testcase to check the basic functionality of the setpgrp(2) syscall. - - -ulimit01 - - Basic test for the ulimit(2) system call. - -mmstress - - Performs General Stress with Race conditions - -mmap1 - - Test the LINUX memory manager. The program is aimed at - stressing the memory manager by simultaneous map/unmap/read - by light weight processes, the test is scheduled to run for - a minimum of 24 hours. - -mmap2 - - Test the LINUX memory manager. The program is aimed at - stressing the memory manager by repeated map/write/unmap of a - of a large gb size file. - -mmap3 - - Test the LINUX memory manager. The program is aimed at - stressing the memory manager by repeated map/write/unmap - of file/memory of random size (maximum 1GB) this is done by - multiple processes. - -mmap001 - - Tests mmapping a big file and writing it once - -mmap01 - - Verify that, mmap() succeeds when used to map a file where size of the - file is not a multiple of the page size, the memory area beyond the end - of the file to the end of the page is accessible. Also, verify that - this area is all zeroed and the modifications done to this area are - not written to the file. - -mmap02 - - Call mmap() with prot parameter set to PROT_READ and with the file - descriptor being open for read, to map a file creating mapped memory - with read access. The minimum file permissions should be 0444. - -mmap03 - - Call mmap() to map a file creating a mapped region with execute access - under the following conditions - - - The prot parameter is set to PROT_EXE - - The file descriptor is open for read - - The file being mapped has execute permission bit set. - - The minimum file permissions should be 0555. - - The call should succeed to map the file creating mapped memory with the - required attributes. - -mmap04 - - Call mmap() to map a file creating a mapped region with read/exec access - under the following conditions - - - The prot parameter is set to PROT_READ|PROT_EXEC - - The file descriptor is open for read - - The file being mapped has read and execute permission bit set. - - The minimum file permissions should be 0555. - - The call should succeed to map the file creating mapped memory with the - required attributes. - - -mmap05 - - Call mmap() to map a file creating mapped memory with no access under - the following conditions - - - The prot parameter is set to PROT_NONE - - The file descriptor is open for read(any mode other than write) - - The minimum file permissions should be 0444. - - The call should succeed to map the file creating mapped memory with the - required attributes. - -mmap06 - - Call mmap() to map a file creating a mapped region with read access - under the following conditions - - - The prot parameter is set to PROT_READ - - The file descriptor is open for writing. - - The call should fail to map the file. - - -mmap07 - - Call mmap() to map a file creating a mapped region with read access - under the following conditions - - - The prot parameter is set to PROT_WRITE - - The file descriptor is open for writing. - - The flags parameter has MAP_PRIVATE set. - - The call should fail to map the file. - -mmap08 - - Verify that mmap() fails to map a file creating a mapped region - when the file specified by file descriptor is not valid. - - -mremap01 - - Verify that, mremap() succeeds when used to expand the existing - virtual memory mapped region to the requested size where the - virtual memory area was previously mapped to a file using mmap(). - -mremap02 - - Verify that, - mremap() fails when used to expand the existing virtual memory mapped - region to the requested size, if the virtual memory area previously - mapped was not page aligned or invalid argument specified. - -mremap03 - - Verify that, - mremap() fails when used to expand the existing virtual memory mapped - region to the requested size, if there already exists mappings that - cover the whole address space requested or the old address specified was - not mapped. - -mremap04 - - Verify that, - mremap() fails when used to expand the existing virtual memory mapped - region to the requested size, if the memory area cannot be expanded at - the current virtual address and MREMAP_MAYMOVE flag not set. - -munmap01 - - Verify that, munmap call will succeed to unmap a mapped file or - anonymous shared memory region from the calling process's address space - and after successful completion of munmap, the unmapped region is no - longer accessible. - -munmap02 - - Verify that, munmap call will succeed to unmap a mapped file or - anonymous shared memory region from the calling process's address space - if the region specified by the address and the length is part or all of - the mapped region. - -munmap03 - - Verify that, munmap call will fail to unmap a mapped file or anonymous - shared memory region from the calling process's address space if the - address and the length of the region to be unmapped points outside the - calling process's address space - -brk01 - Test the basic functionality of brk. - -sbrk01 - Basic test for the sbrk(2) system call. - - -mprotect01 - - Testcase to check the error conditions for mprotect(2) - -mprotect02 - - Testcase to check the mprotect(2) system call. - -mprotect03 - - Testcase to check the mprotect(2) system call. - -msgctl01 - create a message queue, then issue the IPC_STAT command - and RMID commands to test the functionality - - -msgctl02 - create a message queue, then issue the IPC_SET command - to lower the msg_qbytes value. - - -msgctl03 - create a message queue, then issue the IPC_RMID command - - - -msgctl04 - test for EACCES, EFAULT and EINVAL errors using - a variety of incorrect calls. - - -msgctl05 - test for EPERM error - - - -msgget01 - create a message queue, write a message to it and - read it back. - - -msgget02 - test for EEXIST and ENOENT errors - - -msgget03 - test for an ENOSPC error by using up all available - message queues. - -msgget04 - test for an EACCES error by creating a message queue - with no read or write permission and then attempting - to access it with various permissions. - -msgrcv01 - test that msgrcv() receives the expected message - -msgrcv02 - test for EACCES and EFAULT errors - -msgrcv03 - test for EINVAL error - -msgrcv04 - test for E2BIG and ENOMSG errors - -msgrcv05 - test for EINTR error - -msgrcv06 - test for EIDRM error - -msgsnd01 - test that msgsnd() enqueues a message correctly - -msgsnd02 - test for EACCES and EFAULT errors - -msgsnd03 - test for EINVAL error - -msgsnd04 - test for EAGAIN error - -msgsnd05 - test for EINTR error - - -msgsnd06 - test for EIDRM error - -link02 - - Basic test for link(2) - -link03 - - Multi links tests - -link04 - - Negative test cases for link(2) - -link05 - - Multi links (EMLINK) negative test - -readlink01 - - Verify that, readlink will succeed to read the contents of the symbolic - link created the process. - -readlink02 - - Basic test for the readlink(2) system call - -readlink03 - - Verify that, - 1) readlink(2) returns -1 and sets errno to EACCES if search/write - permission is denied in the directory where the symbolic link - resides. - 2) readlink(2) returns -1 and sets errno to EINVAL if the buffer size - is not positive. - 3) readlink(2) returns -1 and sets errno to EINVAL if the specified - file is not a symbolic link file. - 4) readlink(2) returns -1 and sets errno to ENAMETOOLONG if the - pathname component of symbolic link is too long (ie, > PATH_MAX). - 5) readlink(2) returns -1 and sets errno to ENOENT if the component of - symbolic link points to an empty string. - -readlink04 - - Verify that, readlink call will succeed to read the contents of the - symbolic link if invoked by non-root user who is not the owner of the - symbolic link. - - -symlink01 - - Test of various file function calls, such as rename or open, on a symbolic - link file. - -symlink02 - - Basic test for the symlink(2) system call. - -symlink03 - - Verify that, - 1) symlink(2) returns -1 and sets errno to EACCES if search/write - permission is denied in the directory where the symbolic link is - being created. - 2) symlink(2) returns -1 and sets errno to EEXIST if the specified - symbolic link already exists. - 3) symlink(2) returns -1 and sets errno to EFAULT if the specified - file or symbolic link points to invalid address. - 4) symlink(2) returns -1 and sets errno to ENAMETOOLONG if the - pathname component of symbolic link is too long (ie, > PATH_MAX). - 5) symlink(2) returns -1 and sets errno to ENOTDIR if the directory - component in pathname of symbolic link is not a directory. - 6) symlink(2) returns -1 and sets errno to ENOENT if the component of - symbolic link points to an empty string. - -symlink04 - - Verify that, symlink will succeed to create a symbolic link of an existing - object name path. - - -symlink05 - - Verify that, symlink will succeed to create a symbolic link of an - non-existing object name path. - - -unlink05 - - Basic test for the unlink(2) system call. - -unlink06 - - Test for the unlink(2) system call of a FIFO. - -unlink07 - - Tests for error handling for the unlink(2) system call. - -unlink08 - - More tests for error handling for the unlink(2) system call. - - -linktest - - Regression test for max links per file - -rename01 - - This test will verify the rename(2) syscall basic functionality. - Verify rename() works when the "new" file or directory does not exist. - -rename02 - - Basic test for the rename(2) system call - -rename03 - - This test will verify that rename(2) functions correctly - when the "new" file or directory exists - -rename04 - - This test will verify that rename(2) failed when newpath is - a non-empty directory and return EEXIST or ENOTEMPTY - -rename05 - - This test will verify that rename(2) fails with EISDIR - -rename06 - - This test will verify that rename(2) failed in EINVAL - -rename07 - - This test will verify that rename(2) failed in ENOTDIR - -rename08 - - This test will verify that rename(2) syscall failed in EFAULT - -rename09 - - check rename() fails with EACCES - -rename10 - - This test will verify that rename(2) syscall fails with ENAMETOOLONG - and ENOENT - -rename11 - - This test will verify that rename(2) failed in EBUSY - -rename12 - - check rename() fails with EPERM - -rename13 - - Verify rename() return successfully and performs no other action - when "old" file and "new" file link to the same file. - -rmdir01 - - This test will verify that rmdir(2) syscall basic functionality. - verify rmdir(2) returns a value of 0 and the directory being - removed - -rmdir02 - - This test will verify that rmdir(2) fail in - 1. ENOTEMPTY - 2. EBUSY - 3. ENAMETOOLONG - 4. ENOENT - 5. ENOTDIR - 6. EFAULT - 7. EFAULT - -rmdir03 - - check rmdir() fails with EPERM or EACCES - -rmdir04 - - Basic test for the rmdir(2) system call - -rmdir05 - - Verify that rmdir(2) returns a value of -1 and sets errno to indicate the error. - - - -mkdir01 - - Basic errno test for mkdir(2) - -mkdir02 - - This test will verify that new directory created - by mkdir(2) inherits the group ID from the parent - directory and S_ISGID bit, if the S_ISGID bit is set - in the parent directory. - -mkdir03 - - Check mkdir() with various error conditions that should produce - EFAULT, ENAMETOOLONG, EEXIST, ENOENT and ENOTDIR - -mkdir04 - - Attempt to create a directory in a directory having no permissions. - -mkdir05 - - This test will verify the mkdir(2) syscall basic functionality - -mkdir08 - - Basic test for mkdir(2) - - -mknod01 - - Basic test for mknod(2) - -mknod02 - - Verify that mknod(2) succeeds when used to create a filesystem - node with set group-ID bit set on a directory without set group-ID bit set. - The node created should have set group-ID bit set and its gid should be - equal to that of its parent directory. - -mknod03 - - Verify that mknod(2) succeeds when used to create a filesystem - node with set group-ID bit set on a directory with set group-ID bit set. - The node created should have set group-ID bit set and its gid should be - equal to the effective gid of the process. - -mknod04 - - Verify that mknod(2) succeeds when used to create a filesystem - node on a directory with set group-ID bit set. - The node created should not have group-ID bit set and its gid should be - equal to the effective gid of the process. - -mknod05 - - Verify that mknod(2) succeeds when used by root to create a filesystem - node with set group-ID bit set on a directory with set group-ID bit set. - The node created should have set group-ID bit set and its gid should be - equal to that of its parent directory. - - -mknod06 - - Verify that, - 1) mknod(2) returns -1 and sets errno to EEXIST if specified path - already exists. - 2) mknod(2) returns -1 and sets errno to EFAULT if pathname points - outside user's accessible address space. - 3) mknod(2) returns -1 and sets errno to ENOENT if the directory - component in pathname does not exist. - 4) mknod(2) returns -1 and sets errno to ENAMETOOLONG if the pathname - component was too long. - 5) mknod(2) returns -1 and sets errno to ENOTDIR if the directory - component in pathname is not a directory. - -mknod07 - - Verify that, - 1) mknod(2) returns -1 and sets errno to EPERM if the process id of - the caller is not super-user. - 2) mknod(2) returns -1 and sets errno to EACCES if parent directory - does not allow write permission to the process. - -mknod08 - - Verify that mknod(2) succeeds when used to create a filesystem - node on a directory without set group-ID bit set. The node created - should not have set group-ID bit set and its gid should be equal to that - of its parent directory. - - - - -access01 - - Basic test for access(2) using F_OK, R_OK, W_OK, and X_OK arguments. - -access02 - - Verify that access() succeeds to check the read/write/execute permissions - on a file if the mode argument passed was R_OK/W_OK/X_OK. - - Also verify that, access() succeeds to test the accessibility of the file - referred to by symbolic link if the pathname points to a symbolic link. - -access03 - - EFAULT error testing for access(2). - -access04 - - Verify that, - 1. access() fails with -1 return value and sets errno to EACCES - if the permission bits of the file mode do not permit the - requested (Read/Write/Execute) access. - 2. access() fails with -1 return value and sets errno to EINVAL - if the specified access mode argument is invalid. - 3. access() fails with -1 return value and sets errno to EFAULT - if the pathname points outside allocate address space for the - process. - 4. access() fails with -1 return value and sets errno to ENOENT - if the specified file doesn't exist (or pathname is NULL). - 5. access() fails with -1 return value and sets errno to ENAMETOOLONG - if the pathname size is > PATH_MAX characters. - -access05 - - Verify that access() succeeds to check the existence of a file if - search access is permitted on the pathname of the specified file. - -access06 - - EFAULT error testing for access(2). - -chroot01 - - Testcase to check the whether chroot sets errno to EPERM. - -chroot02 - - Test functionality of chroot(2) - -chroot03 - - Testcase to test whether chroot(2) sets errno correctly. - -pipeio - - This tool can be used to beat on system or named pipes. - See the help() function below for user information. - -pipe01 - - Testcase to check the basic functionality of the pipe(2) syscall: - Check that both ends of the pipe (both file descriptors) are - available to a process opening the pipe. - -pipe05 - - Check what happens when pipe is passed a bad file descriptor. - -pipe06 - - Check what happens when the system runs out of pipes. - -pipe08 - - Check that a SIGPIPE signal is generated when a write is - attempted on an empty pipe. - -pipe09 - - Check that two processes can use the same pipe at the same time. - -pipe10 - - Check that parent can open a pipe and have a child read from it - -pipe11 - - Check if many children can read what is written to a pipe by the - parent. - - -sem01 - - Creates a semaphore and two processes. The processes - each go through a loop where they semdown, delay for a - random amount of time, and semup, so they will almost - always be fighting for control of the semaphore. - -sem02 - The application creates several threads using pthread_create(). - One thread performs a semop() with the SEM_UNDO flag set. The - change in semaphore value performed by that semop should be - "undone" only when the last pthread exits. - - -semctl01 - - test the 10 possible semctl() commands - -semctl02 - - test for EACCES error - -semctl03 - - test for EINVAL and EFAULT errors - -semctl04 - - test for EPERM error - - -semctl05 - - test for ERANGE error - -semget01 - - test that semget() correctly creates a semaphore set - -semget02 - - test for EACCES and EEXIST errors - -semget03 - - test for ENOENT error - -semget05 - - test for ENOSPC error - -semget06 - - test for EINVAL error - -semop01 - - test that semop() basic functionality is correct - -semop02 - - test for E2BIG, EACCES, EFAULT and EINVAL errors - -semop03 - - test for EFBIG error - -semop04 - - test for EAGAIN error - -semop05 - - test for EINTR and EIDRM errors - - - -msgctl01 - create a message queue, then issue the IPC_STAT command - and RMID commands to test the functionality - - -msgctl02 - create a message queue, then issue the IPC_SET command - to lower the msg_qbytes value. - - -msgctl03 - create a message queue, then issue the IPC_RMID command - - - -msgctl04 - test for EACCES, EFAULT and EINVAL errors using - a variety of incorrect calls. - - -msgctl05 - test for EPERM error - - - -msgget01 - create a message queue, write a message to it and - read it back. - - -msgget02 - test for EEXIST and ENOENT errors - - -msgget03 - test for an ENOSPC error by using up all available - message queues. - -msgget04 - test for an EACCES error by creating a message queue - with no read or write permission and then attempting - to access it with various permissions. - -msgrcv01 - test that msgrcv() receives the expected message - -msgrcv02 - test for EACCES and EFAULT errors - -msgrcv03 - test for EINVAL error - -msgrcv04 - test for E2BIG and ENOMSG errors - -msgrcv05 - test for EINTR error - -msgrcv06 - test for EIDRM error - -msgsnd01 - test that msgsnd() enqueues a message correctly - -msgsnd02 - test for EACCES and EFAULT errors - -msgsnd03 - test for EINVAL error - -msgsnd04 - test for EAGAIN error - -msgsnd05 - test for EINTR error - - -msgsnd06 - test for EIDRM error - -shmat01 - test that shmat() works correctly - -shmat02 - check for EINVAL and EACCES errors - - -shmat03 - test for EACCES error - - -shmctl01 - test the IPC_STAT, IPC_SET and IPC_RMID commands as - they are used with shmctl() - - -shmctl02 - check for EACCES, EFAULT and EINVAL errors - - -shmctl03 - check for EACCES, and EPERM errors - - -shmdt01 - check that shared memory is detached correctly - - -shmdt02 - check for EINVAL error - - -shmget01 - test that shmget() correctly creates a shared memory segment - - -shmget02 - check for ENOENT, EEXIST and EINVAL errors - - -shmget03 - test for ENOSPC error - - -shmget04 - test for EACCES error - - -shmget05 - test for EACCES error - -openfile - - Creates files and opens simultaneously - -open01 - - Open a file with oflag = O_CREAT set, does it set the sticky bit off? - - Open "/tmp" with O_DIRECTORY, does it set the S_IFDIR bit on? - -open02 - - Test if open without O_CREAT returns -1 if a file does not exist. - -open03 - - Basic test for open(2) - -open04 - - Testcase to check that open(2) sets EMFILE if a process opens files - more than its descriptor size - -open05 - - Testcase to check open(2) sets errno to EACCES correctly. - -open06 - - Testcase to check open(2) sets errno to ENXIO correctly. - -open07 - - Test the open(2) system call to ensure that it sets ELOOP correctly. - -open08 - - Check for the following errors: - 1. EEXIST - 2. EISDIR - 3. ENOTDIR - 4. ENAMETOOLONG - 5. EFAULT - 6. ETXTBSY - - -openfile - - Creates files and opens simultaneously - - -chdir01 - - Check proper operation of chdir(): tests whether the - system call can it change the current, working directory, and find a - file there? Will it fail on a non-directory entry ? - -chdir02 - - Basic test for chdir(2). - -chdir03 - - Testcase for testing that chdir(2) sets EACCES errno - -chdir04 - - Testcase to test whether chdir(2) sets errno correctly. - - -chmod01 - - Verify that, chmod(2) succeeds when used to change the mode permissions - of a file. - -chmod02 - - Basic test for chmod(2). - -chmod03 - - Verify that, chmod(2) will succeed to change the mode of a file - and set the sticky bit on it if invoked by non-root (uid != 0) - process with the following constraints, - - the process is the owner of the file. - - the effective group ID or one of the supplementary group ID's of the - process is equal to the group ID of the file. - -chmod04 - - Verify that, chmod(2) will succeed to change the mode of a directory - and set the sticky bit on it if invoked by non-root (uid != 0) process - with the following constraints, - - the process is the owner of the directory. - - the effective group ID or one of the supplementary group ID's of the - process is equal to the group ID of the directory. - -chmod05 - - Verify that, chmod(2) will succeed to change the mode of a directory - but fails to set the setgid bit on it if invoked by non-root (uid != 0) - process with the following constraints, - - the process is the owner of the directory. - - the effective group ID or one of the supplementary group ID's of the - process is not equal to the group ID of the directory. - -chmod06 - - Verify that, - 1) chmod(2) returns -1 and sets errno to EPERM if the effective user id - of process does not match the owner of the file and the process is - not super user. - 2) chmod(2) returns -1 and sets errno to EACCES if search permission is - denied on a component of the path prefix. - 3) chmod(2) returns -1 and sets errno to EFAULT if pathname points - outside user's accessible address space. - 4) chmod(2) returns -1 and sets errno to ENAMETOOLONG if the pathname - component is too long. - 5) chmod(2) returns -1 and sets errno to ENOTDIR if the directory - component in pathname is not a directory. - 6) chmod(2) returns -1 and sets errno to ENOENT if the specified file - does not exists. - -chmod07 - - Verify that, chmod(2) will succeed to change the mode of a file/directory - and sets the sticky bit on it if invoked by root (uid = 0) process with - the following constraints, - - the process is not the owner of the file/directory. - - the effective group ID or one of the supplementary group ID's of the - process is equal to the group ID of the file/directory. - - -chown01 - - Basic test for chown(2). - -chown02 - - Verify that, when chown(2) invoked by super-user to change the owner and - group of a file specified by path to any numeric owner(uid)/group(gid) - values, - - clears setuid and setgid bits set on an executable file. - - preserves setgid bit set on a non-group-executable file. - -chown03 - - Verify that, chown(2) succeeds to change the group of a file specified - by path when called by non-root user with the following constraints, - - euid of the process is equal to the owner of the file. - - the intended gid is either egid, or one of the supplementary gids - of the process. - Also, verify that chown() clears the setuid/setgid bits set on the file. - -chown04 - - Verify that, - 1) chown(2) returns -1 and sets errno to EPERM if the effective user id - of process does not match the owner of the file and the process is - not super user. - 2) chown(2) returns -1 and sets errno to EACCES if search permission is - denied on a component of the path prefix. - 3) chown(2) returns -1 and sets errno to EFAULT if pathname points - outside user's accessible address space. - 4) chown(2) returns -1 and sets errno to ENAMETOOLONG if the pathname - component is too long. - 5) chown(2) returns -1 and sets errno to ENOTDIR if the directory - component in pathname is not a directory. - 6) chown(2) returns -1 and sets errno to ENOENT if the specified file - does not exists. - -chown05 - - Verify that, chown(2) succeeds to change the owner and group of a file - specified by path to any numeric owner(uid)/group(gid) values when invoked - by super-user. - - -close01 - - Test that closing a regular file and a pipe works correctly - -close02 - - Check that an invalid file descriptor returns EBADF - -close08 - - Basic test for close(2). - - -fchdir01 - - create a directory and cd into it. - -fchdir02 - - try to cd into a bad directory (bad fd). - - -fchmod01 - - Basic test for Fchmod(2). - -fchmod02 - - Verify that, fchmod(2) will succeed to change the mode of a file/directory - set the sticky bit on it if invoked by root (uid = 0) process with - the following constraints, - - the process is not the owner of the file/directory. - - the effective group ID or one of the supplementary group ID's of the - process is equal to the group ID of the file/directory. - -fchmod03 - - Verify that, fchmod(2) will succeed to change the mode of a file - and set the sticky bit on it if invoked by non-root (uid != 0) - process with the following constraints, - - the process is the owner of the file. - - the effective group ID or one of the supplementary group ID's of the - process is equal to the group ID of the file. - -fchmod04 - - Verify that, fchmod(2) will succeed to change the mode of a directory - and set the sticky bit on it if invoked by non-root (uid != 0) process - with the following constraints, - - the process is the owner of the directory. - - the effective group ID or one of the supplementary group ID's of the - process is equal to the group ID of the directory. - -fchmod05 - - Verify that, fchmod(2) will succeed to change the mode of a directory - but fails to set the setgid bit on it if invoked by non-root (uid != 0) - process with the following constraints, - - the process is the owner of the directory. - - the effective group ID or one of the supplementary group ID's of the - process is not equal to the group ID of the directory. - -fchmod06 - - Verify that, - 1) fchmod(2) returns -1 and sets errno to EPERM if the effective user id - of process does not match the owner of the file and the process is - not super user. - 2) fchmod(2) returns -1 and sets errno to EBADF if the file descriptor - of the specified file is not valid. - -fchmod07 - - Verify that, fchmod(2) succeeds when used to change the mode permissions - of a file specified by file descriptor. - - -fchown01 - - Basic test for fchown(2). - -fchown02 - - Verify that, when fchown(2) invoked by super-user to change the owner and - group of a file specified by file descriptor to any numeric - owner(uid)/group(gid) values, - - clears setuid and setgid bits set on an executable file. - - preserves setgid bit set on a non-group-executable file. - -fchown03 - - Verify that, fchown(2) succeeds to change the group of a file specified - by path when called by non-root user with the following constraints, - - euid of the process is equal to the owner of the file. - - the intended gid is either egid, or one of the supplementary gids - of the process. - Also, verify that fchown() clears the setuid/setgid bits set on the file. - -fchown04 - - Verify that, - 1) fchown(2) returns -1 and sets errno to EPERM if the effective user id - of process does not match the owner of the file and the process is - not super user. - 2) fchown(2) returns -1 and sets errno to EBADF if the file descriptor - of the specified file is not valid. - -fchown05 - - Verify that, fchown(2) succeeds to change the owner and group of a file - specified by file descriptor to any numeric owner(uid)/group(gid) values - when invoked by super-user. - -lchown01 - - Verify that, lchown(2) succeeds to change the owner and group of a file - specified by path to any numeric owner(uid)/group(gid) values when invoked - by super-user. - - -lchown02 - - Verify that, - 1) lchown(2) returns -1 and sets errno to EPERM if the effective user id - of process does not match the owner of the file and the process is - not super user. - 2) lchown(2) returns -1 and sets errno to EACCES if search permission is - denied on a component of the path prefix. - 3) lchown(2) returns -1 and sets errno to EFAULT if pathname points - outside user's accessible address space. - 4) lchown(2) returns -1 and sets errno to ENAMETOOLONG if the pathname - component is too long. - 5) lchown(2) returns -1 and sets errno to ENOTDIR if the directory - component in pathname is not a directory. - 6) lchown(2) returns -1 and sets errno to ENOENT if the specified file - does not exists. - - -creat01 - - Testcase to check the basic functionality of the creat(2) system call. - -creat03 - - Testcase to check whether the sticky bit cleared. - -creat04 - - Testcase to check creat(2) fails with EACCES - -creat05 - - Testcase to check that creat(2) system call returns EMFILE. - -creat06 - - Testcase to check creat(2) sets the following errnos correctly: - 1. EISDIR - 2. ENAMETOOLONG - 3. ENOENT - 4. ENOTDIR - 5. EFAULT - 6. EACCES - -creat07 - - Testcase to check creat(2) sets the following errnos correctly: - 1. ETXTBSY - -creat09 - - Basic test for creat(2) using 0700 argument. - -truncate01 - - Verify that, truncate(2) succeeds to truncate a file to a specified - length. - - -truncate02 - - Verify that, truncate(2) succeeds to truncate a file to a certain length, - but the attempt to read past the truncated length will fail. - - -truncate03 - - Verify that, - 1) truncate(2) returns -1 and sets errno to EACCES if search/write - permission denied for the process on the component of the path prefix - or named file. - 2) truncate(2) returns -1 and sets errno to ENOTDIR if the component of - the path prefix is not a directory. - 3) truncate(2) returns -1 and sets errno to EFAULT if pathname points - outside user's accessible address space. - 4) truncate(2) returns -1 and sets errno to ENAMETOOLONG if the component - of a pathname exceeded 255 characters or entire pathname exceeds 1023 - characters. - 5) truncate(2) returns -1 and sets errno to ENOENT if the named file - does not exist. - -ftruncate01 - - Verify that, ftruncate(2) succeeds to truncate a file to a specified - length if the file indicated by file descriptor opened for writing. - -ftruncate02 - - Verify that, ftruncate(2) succeeds to truncate a file to a certain length, - but the attempt to read past the truncated length will fail. - -ftruncate03 - - Verify that, - 1) ftruncate(2) returns -1 and sets errno to EINVAL if the specified - truncate length is less than 0. - 2) ftruncate(2) returns -1 and sets errno to EBADF if the file descriptor - of the specified file is not valid. - -vhangup01 - - Check the return value, and errno of vhangup(2) - when a non-root user calls vhangup(). - -vhangup02 - - To test the basic functionality of vhangup(2) -growfiles - - This program will grow a list of files. - Each file will grow by grow_incr before the same - file grows twice. Each file is open and closed before next file is opened. - -pipe01 - - Testcase to check the basic functionality of the pipe(2) syscall: - Check that both ends of the pipe (both file descriptors) are - available to a process opening the pipe. - -pipe05 - - Check what happens when pipe is passed a bad file descriptor. - -pipe06 - - Check what happens when the system runs out of pipes. - -pipe08 - - Check that a SIGPIPE signal is generated when a write is - attempted on an empty pipe. - -pipe09 - - Check that two processes can use the same pipe at the same time. - -pipe10 - - Check that parent can open a pipe and have a child read from it - -pipe11 - - Check if many children can read what is written to a pipe by the - parent. - -pipeio - - This tool can be used to beat on system or named pipes. - See the help() function below for user information. - - /ipc_stress/message_queue_test_01.c - /ipc_stress/pipe_test_01.c - /ipc_stress/semaphore_test_01.c - /ipc_stress/single_test_01.c - -proc01 - Recursively reads all files within /proc filesystem. - -lftest - The purpose of this test is to verify the file size limitations of a filesystem. - It writes one buffer at a time and lseeks from the beginning of the file to the - end of the last write position. The intent is to test lseek64. - - -llseek01 - - Verify that, llseek() call succeeds to set the file pointer position - to an offset larger than file size. Also, verify that any attempt - to write to this location fails. - -llseek02 - - Verify that, - 1. llseek() returns -1 and sets errno to EINVAL, if the 'Whence' argument - is not a proper value. - 2. llseek() returns -1 and sets errno to EBADF, if the file handle of - the specified file is not valid. - -lseek01 - - Basic test for lseek(2) - -lseek02 - - Negative test for lseek(2) - -lseek03 - - Negative test for lseek(2) whence - -lseek04 - - Negative test for lseek(2) of a fifo - -lseek05 - - Negative test for lseek(2) of a pipe - -lseek06 - - Verify that, lseek() call succeeds to set the file pointer position - to less than or equal to the file size, when a file is opened for - read or write. - -lseek07 - - Verify that, lseek() call succeeds to set the file pointer position - to more than the file size, when a file is opened for reading/writing. - -lseek08 - - Verify that, lseek() call succeeds to set the file pointer position - to the end of the file when 'whence' value set to SEEK_END and any - attempts to read from that position should fail. - -lseek09 - - Verify that, lseek() call succeeds to set the file pointer position - to the current specified location, when 'whence' value is set to - SEEK_CUR and the data read from the specified location should match - the expected data. - -lseek10 - - Verify that, - 1. lseek() returns -1 and sets errno to ESPIPE, if the file handle of - the specified file is associated with a pipe, socket, or FIFO. - 2. lseek() returns -1 and sets errno to EINVAL, if the 'Whence' argument - is not a proper value. - 3. lseek() returns -1 and sets errno to EBADF, if the file handle of - the specified file is not valid. - -rwtest - - A wrapper for doio and iogen. - -doio - a general purpose io initiator with system call and - write logging. See doio.h for the structure which defines - what doio requests should look like. - - Currently doio can handle read,write,reada,writea,ssread, - sswrite, and many varieties of listio requests. - For disk io, if the O_SSD flag is set doio will allocate - the appropriate amount of ssd and do the transfer - thus, doio - can handle all of the primitive types of file io. - -iogen - A tool for generating file/sds io for a doio process - -pread01 - - Verify the functionality of pread() by writing known data using pwrite() - to the file at various specified offsets and later read from the file from - various specified offsets, comparing the data read against the data - written. - -pread02 - - Verify that, - 1) pread() fails when attempted to read from an unnamed pipe. - 2) pread() fails if the specified offset position was invalid. - - -pwrite01 - - Verify the functionality of pwrite() by writing known data using pwrite() - to the file at various specified offsets and later read from the file from - various specified offsets, comparing the data written against the data - read using read(). - -pwrite02 - - Verify that, - 1) pwrite() fails when attempted to write to an unnamed pipe. - 2) pwrite() fails if the specified offset position was invalid. - - -read01 - - Basic test for the read(2) system call - -read02 - - test 1: Does read return -1 if file descriptor is not valid, check for EBADF - - test 2: Check if read sets EISDIR, if the fd refers to a directory - - test 3: Check if read sets EFAULT, if buf is -1. - -read03 - - Testcase to check that read() sets errno to EAGAIN - -read04 - - Testcase to check if read returns the number of bytes read correctly. - - -readv01 - - Testcase to check the basic functionality of the readv(2) system call. - -readv02 - - Testcase to check the error conditions of the readv(2) system call. - -write01 - - Basic test for write(2) system call. - -write02 - - Basic functionality test: does the return from write match the count - of the number of bytes written. - - -write03 - - Testcase to check that write(2) doesn't corrupt a file when it fails - -write04 - - Testcase to check that write() sets errno to EAGAIN - -write05 - - Check the return value, and errnos of write(2) - - when the file descriptor is invalid - EBADF - - when the buf parameter is invalid - EFAULT - - on an attempt to write to a pipe that is not open for reading - EPIPE - - -writev01 - - Testcase to check the basic functionality of writev(2) system call. - - -writev02 - - In these testcases, writev() is called with partially valid data - to be written in a sparse file. - - -writev03 - - The testcases are written calling writev() with partially valid data - to overwrite the contents, to write in the beginning and to write in - the end of the file. - -writev04 - - The testcases are written calling writev() with partially valid data - to overwrite the contents, to write in the beginning and to write in - the end of the file. This is same as writev03, but the length of - buffer used here is 8192 bytes. - -writev05 - - These testcases are written to test writev() on sparse files. This - is same as writev02. But the initial write() with valid data is - done at the beginning of the file. - -disktest - - Does repeated accesses to a filespec and optionally writes to, reads from, - and verifies the data. By default, disktest makes assumptions about - the running environment which allows for a quick start of IO generation. - However, Disktest has a large number of command line options which can - be used to adapt the test for a variety of uses including data integrity, - medium integrity, performance, and simple application simulation. - - - - -getdents01 - get a directory entry - -getdents02 - check that we get a failure with a bad file descriptor - - -getdents03 - check for an EINVAL error - - -getdents04 - check for an ENOTDIR error - -getdents05 - check that we get a failure with a bad dirp address. -process_stress - Spawn creates a tree - of processes with Dval depth and Bval breadth. Each parent will spawn - Bval children. Each child will store information about themselves - in shared memory. The leaf nodes will communicate the existence - of one another through message queues, once each leaf node has - received communication from all of her siblings she will reduce - the semaphore count and exit. Meanwhile all parents are waiting - to hear from their children through the use of semaphores. When - the semaphore count reaches zero then the parent knows all the - children have talked to one another. Locking of the connter semaphore - is provided by the use of another (binary) semaphore. - - - - -sched_stress - Exports required environment variables and runs sched_driver -sched_driver - This program uses system calls to change the - priorities of the throughput measurement testcases. - When real-time is in effect, priorities 50 through 64 - are used. (MAX_PRI and MIN_PRI) When user-time - (normal) is in effect, 0-14 (corresponding to nice() - calls) is used. The driver only keeps track of - values from 50 to 64, and the testcases will scale - them down to 0 to 14 when needed, to change the - priority of a user-time process. - -time-schedule - This programme will determine the context switch - (scheduling) overhead on a system. It takes into - account SMP machines. True context switches are - measured. -trace_sched - This utility spawns N tasks, each task sets its priority - by making a system call to the scheduler. The thread - function reads the priority that the scheduler sets for - this task and also reads from /proc the processor this - task last executed on the information that is gathered - by the thread function may be in real-time. Its only an - approximation. - -sched_getscheduler01 - - Testcase to check sched_getscheduler() returns correct return value - -sched_getscheduler02 - - To check for the errno ESRCH - - -sched_setscheduler01 - - Testcase to test whether sched_setscheduler(2) sets the errnos - correctly. - -sched_setscheduler02 - - Testcase to test whether sched_setscheduler(2) sets the errnos - correctly. - - -sched_yield01 - - Testcase to check that sched_yield returns correct values. - - -nice01 - - Verify that root can provide a negative value to nice() - and hence root can decrease the nice value of the process - using nice() system call - -nice02 - - Verify that any user can successfully increase the nice value of - the process by passing a higher increment value (> max. applicable limits) - to nice() system call. - -nice03 - - Verify that any user can successfully increase the nice value of - the process by passing an increment value (< max. applicable limits) to - nice() system call. - -nice04 - - Verify that, nice(2) fails when, a non-root user attempts to increase - the priority of a process by specifying a negative increment value. - -nice05 - - Basic test for nice(2) - - -poll01 - - Verify that valid open file descriptor must be provided to poll() to - succeed. - -select01 - - Basic test for the select(2) system call to a fd of regular file with no I/O - and small timeout - -select02 - - Basic test for the select(2) system call to fd of system pipe with no I/O - and small timeout - -select03 - - Basic test for the select(2) system call to fd of a named-pipe (FIFO) - -select04 - - Verify that select(2) returns immediately (does not block) if the - timeout value is zero. - -select05 - - Verify that select(2) fails when one or more of the file descriptor sets - specify a file descriptor which is not valid. - -select06 - - Verify that select(2) fails when a signal is delivered before any of the - selected events occur and before the timeout interval expires. - -select07 - - Verify that select(2) fails when an invalid timeout interval is specified. - -select08 - - Verify the functionality of select(2) by passing non-null writefds - which points to a regular file, pipes or FIFO's. - -select09 - - Verify the functionality of select(2) by passing non-null readfds - which points to a regular file, pipes or FIFO's. - -select10 - - Verify that a successful call to select() shall return the desired - number of modified descriptors for which bits are set in the bit masks, - where descriptors points to a regular file, pipes or FIFO's. -sem01 - - Creates a semaphore and two processes. The processes - each go through a loop where they semdown, delay for a - random amount of time, and semup, so they will almost - always be fighting for control of the semaphore. - -sem02 - The application creates several threads using pthread_create(). - One thread performs a semop() with the SEM_UNDO flag set. The - change in semaphore value performed by that semop should be - "undone" only when the last pthread exits. - - -semctl01 - - test the 10 possible semctl() commands - -semctl02 - - test for EACCES error - -semctl03 - - test for EINVAL and EFAULT errors - -semctl04 - - test for EPERM error - - -semctl05 - - test for ERANGE error - -semget01 - - test that semget() correctly creates a semaphore set - -semget02 - - test for EACCES and EEXIST errors - -semget03 - - test for ENOENT error - -semget05 - - test for ENOSPC error - -semget06 - - test for EINVAL error - -semop01 - - test that semop() basic functionality is correct - -semop02 - - test for E2BIG, EACCES, EFAULT and EINVAL errors - -semop03 - - test for EFBIG error - -semop04 - - test for EAGAIN error - -semop05 - - test for EINTR and EIDRM errors - - -shmat01 - test that shmat() works correctly - -shmat02 - check for EINVAL and EACCES errors - - -shmat03 - test for EACCES error - - -shmctl01 - test the IPC_STAT, IPC_SET and IPC_RMID commands as - they are used with shmctl() - - -shmctl02 - check for EACCES, EFAULT and EINVAL errors - - -shmctl03 - check for EACCES, and EPERM errors - - -shmdt01 - check that shared memory is detached correctly - - -shmdt02 - check for EINVAL error - - -shmget01 - test that shmget() correctly creates a shared memory segment - - -shmget02 - check for ENOENT, EEXIST and EINVAL errors - - -shmget03 - test for ENOSPC error - - -shmget04 - test for EACCES error - - -shmget05 - test for EACCES error -shmat1 - - Test the LINUX memory manager. The program is aimed at - stressing the memory manager by repeated shmat/write/read/ - shmatd of file/memory of random size (maximum 1000 * 4096) - done by multiple processes. - -shm_test - - This program is designed to stress the Memory management sub - - system of Linux. This program will spawn multiple pairs of - reader and writer threads. One thread will create the shared - segment of random size and write to this memory, the other - pair will read from this memory. - -sigaction01 - - Test some features of sigaction (see below for more details) - - -sigaction02 - - Testcase to check the basic errnos set by the sigaction(2) syscall. - - -sigaltstack01 - - Send a signal using the main stack. While executing the signal handler - compare a variable's address lying on the main stack with the stack - boundaries returned by sigaltstack(). - - -sigaltstack02 - - Verify that, - 1. sigaltstack() fails and sets errno to EINVAL when "ss_flags" field - pointed to by 'ss' contains invalid flags. - 2. sigaltstack() fails and sets errno to ENOMEM when the size of alternate - stack area is less than MINSIGSTKSZ. - -sighold02 - - Basic test for the sighold02(2) system call. - - -signal01 - set the signal handler to our own function - - -signal02 - Test that we get an error using illegal signals - -signal03 - - Boundary value and other invalid value checking of signal setup and signal - sending. - - -signal04 - restore signals to default behavior - - -signal05 - set signals to be ignored - - -sigprocmask01 - - Verify that sigprocmask() succeeds to examine and change the calling - process's signal mask. - Also, verify that sigpending() succeeds to store signal mask that are - blocked from delivery and pending for the calling process. - -sigrelse01 - - Basic test for the sigrelse(2) system call. - -sigsuspend01 - - Verify that sigsuspend() succeeds to change process's current signal - mask with the specified signal mask and suspends the process execution - until the delivery of a signal. -kill01 - - Test case to check the basic functionality of kill(). - -kill02 - - Sending a signal to processes with the same process group ID - -kill03 - - Test case to check that kill fails when given an invalid signal. - -kill04 - - Test case to check that kill() fails when passed a non-existent pid. - -kill05 - - Test case to check that kill() fails when passed a pid owned by another - user. - -kill06 - - Test case to check the basic functionality of kill() when killing an - entire process group with a negative pid. - -kill07 - - Test case to check that SIGKILL can not be caught. - -kill08 - - Test case to check the basic functionality of kill() when kill an - entire process group. - -kill09 - Basic test for kill(2) - -kill10 - Signal flooding test. - - -mtest01 - mallocs memory at a time until malloc fails. -mallocstress - - This program is designed to stress the VMM by doing repeated */ - mallocs and frees, with out using the swap space. This is */ - achieved by spawning N threads with repeatedly malloc and free*/ - a memory of size M. The stress can be increased by increasing */ - the number of repetitions over the default number using the */ - -l [num] option. - -clisrv - - Sender: Read contents of data file. Write each line to socket, then - read line back from socket and write to standard output. - Receiver: Read a stream socket one line at a time and write each line - back to the sender. - Usage: pthcli [port number] - - -socket01 - - Verify that socket() returns the proper errno for various failure cases - - -socketpair01 - - Verify that socketpair() returns the proper errno for various failure cases - - -sockioctl01 - - Verify that ioctl() on sockets returns the proper errno for various - failure cases - -connect01 - - Verify that connect() returns the proper errno for various failure cases - -getpeername01 - - Verify that getpeername() returns the proper errno for various failure cases - - -getsockname01 - - Verify that getsockname() returns the proper errno for various failure cases - -getsockopt01 - - Verify that getsockopt() returns the proper errno for various failure cases - -listen01 - - Verify that listen() returns the proper errno for various failure cases - -accept01 - - Verify that accept() returns the proper errno for various failure cases - -bind01 - - Verify that bind() returns the proper errno for various failure cases - - -recv01 - - Verify that recv() returns the proper errno for various failure cases - - -recvfrom01 - - Verify that recvfrom() returns the proper errno for various failure cases - - -recvmsg01 - - Verify that recvmsg() returns the proper errno for various failure cases - -send01 - - Verify that send() returns the proper errno for various failure cases - -sendmsg01 - - Verify that sendmsg() returns the proper errno for various failure cases -sendto01 - - Verify that sendto() returns the proper errno for various failure cases - -setsockopt01 - - Verify that setsockopt() returns the proper errno for various failure cases - - -fstat01 - - Basic test for fstat(2) - -fstat02 - - Verify that, fstat(2) succeeds to get the status of a file and fills - the stat structure elements though file pointed to by file descriptor - not opened for reading. - -fstat03 - - Verify that, fstat(2) returns -1 and sets errno to EBADF if the file - pointed to by file descriptor is not valid. - -fstat04 - - Verify that, fstat(2) succeeds to get the status of a file pointed by - file descriptor and fills the stat structure elements. - - -fstatfs01 - - Basic test for fstatfs(2) - -fstatfs02 - - Testcase to check fstatfs() sets errno correctly. - -lstat01 - - Verify that, lstat(2) succeeds to get the status of a file pointed to by - symlink and fills the stat structure elements. - -lstat02 - - Basic test for lstat(2) - -lstat03 - - Verify that, - 1) lstat(2) returns -1 and sets errno to EACCES if search permission is - denied on a component of the path prefix. - 2) lstat(2) returns -1 and sets errno to ENOENT if the specified file - does not exists or empty string. - 3) lstat(2) returns -1 and sets errno to EFAULT if pathname points - outside user's accessible address space. - 4) lstat(2) returns -1 and sets errno to ENAMETOOLONG if the pathname - component is too long. - 5) lstat(2) returns -1 and sets errno to ENOTDIR if the directory - component in pathname is not a directory. - -stat01 - - Verify that, stat(2) succeeds to get the status of a file and fills the - stat structure elements. - -stat02 - - Verify that, stat(2) succeeds to get the status of a file and fills the - stat structure elements though process doesn't have read access to the - file. - - -stat03 - - Verify that, - 1) stat(2) returns -1 and sets errno to EACCES if search permission is - denied on a component of the path prefix. - 2) stat(2) returns -1 and sets errno to ENOENT if the specified file - does not exists or empty string. - 3) stat(2) returns -1 and sets errno to EFAULT if pathname points - outside user's accessible address space. - 4) stat(2) returns -1 and sets errno to ENAMETOOLONG if the pathname - component is too long. - 5) stat(2) returns -1 and sets errno to ENOTDIR if the directory - component in pathname is not a directory. - -stat05 - - Basic test for the stat05(2) system call. - -statfs01 - - Basic test for the statfs(2) system call. - -statfs02 - - Testcase to check that statfs(2) sets errno correctly. - - -read01 - - Basic test for the read(2) system call - -read02 - - test 1: Does read return -1 if file descriptor is not valid, check for EBADF - - test 2: Check if read sets EISDIR, if the fd refers to a directory - - test 3: Check if read sets EFAULT, if buf is -1. - -read03 - - Testcase to check that read() sets errno to EAGAIN - -read04 - - Testcase to check if read returns the number of bytes read correctly. - -umask01 - - Basic test for the umask(2) system call. - -umask02 - - Check that umask changes the mask, and that the previous - value of the mask is returned correctly for each value. - -umask03 - - Check that umask changes the mask, and that the previous - value of the mask is returned correctly for each value. - - - -getgroups01 - - Getgroups system call critical test - -getgroups02 - - Basic test for getgroups(2) - -getgroups03 - - Verify that, getgroups() system call gets the supplementary group IDs - of the calling process. - -getgroups04 - - Verify that, - getgroups() fails with -1 and sets errno to EINVAL if the size - argument value is -ve. - -gethostname01 - - Basic test for gethostname(2) - - -getpgid01 - - Testcase to check the basic functionality of getpgid(). - -getpgid02 - - Testcase to check the basic functionality of getpgid(). - -getpgrp01 - Basic test for getpgrp(2) - - -getpriority01 - - Verify that getpriority() succeeds get the scheduling priority of - the current process, process group or user. - - -getpriority02 - - Verify that, - 1) getpriority() sets errno to ESRCH if no process was located - was located for 'which' and 'who' arguments. - 2) getpriority() sets errno to EINVAL if 'which' argument was - not one of PRIO_PROCESS, PRIO_PGRP, or PRIO_USER. - -getresgid01 - - Verify that getresgid() will be successful to get the real, effective - and saved user id of the calling process. - -getresgid02 - - Verify that getresgid() will be successful to get the real, effective - and saved user ids after calling process invokes setregid() to change - the effective/saved gids to that of specified user. - -getresgid03 - - Verify that getresgid() will be successful to get the real, effective - and saved user ids after calling process invokes setresgid() to change - the effective gid to that of specified user. - - -getresuid01 - - Verify that getresuid() will be successful to get the real, effective - and saved user id of the calling process. - -getresuid02 - - Verify that getresuid() will be successful to get the real, effective - and saved user ids after calling process invokes setreuid() to change - the effective/saved uids to that of specified user. - -getresuid03 - - Verify that getresuid() will be successful to get the real, effective - and saved user ids after calling process invokes setresuid() to change - the effective uid to that of specified user. - - -getsid01 - - call getsid() and make sure it succeeds - -getsid02 - - call getsid() with an invalid PID to produce a failure - - -setfsgid01 - - Testcase to check the basic functionality of setfsgid(2) system - call. - -setfsuid01 - - Testcase to test the basic functionality of the setfsuid(2) system - call. - - -setgid01 - - Basic test for the setgid(2) system call. - -setgid02 - - Testcase to ensure that the setgid() system call sets errno to EPERM - - -setgroups01 - - Basic test for the setgroups(2) system call. - -setgroups02 - - Verify that, - 1. setgroups() fails with -1 and sets errno to EINVAL if the size - argument value is > NGROUPS - 2. setgroups() fails with -1 and sets errno to EPERM if the - calling process is not super-user. - -setgroups03 - - Verify that, only root process can invoke setgroups() system call to - set the supplementary group IDs of the process. - - -setpgid01 - - Basic test for setpgid(2) system call. - -setpgid02 - - Testcase to check that setpgid() sets errno correctly. - -setpgid03 - - Test to check the error and trivial conditions in setpgid system call - -setpriority01 - - set the priority for the test process lower. - -setpriority02 - - test for an expected failure by trying to raise - the priority for the test process while not having - permissions to do so. - -setpriority03 - - test for an expected failure by using an invalid - PRIO value - setpriority04 - -setpriority04 - test for an expected failure by using an invalid - process id - - -setpriority05 - test for an expected failure by trying to change - a process with an ID that is different from the - test process - -setregid01 - - Basic test for the setregid(2) system call. - -setregid02 - - Test that setregid() fails and sets the proper errno values when a - non-root user attempts to change the real or effective group id to a - value other than the current gid or the current effective gid. - -setregid03 - - Test setregid() when executed by a non-root user. - -setregid04 - - Test setregid() when executed by root. - -setresuid01 - - Test setresuid() when executed by root. - -setresuid02 - - Test that a non-root user can change the real, effective and saved - uid values through the setresuid system call. - - -setresuid03 - - Test that the setresuid system call sets the proper errno - values when a non-root user attempts to change the real, effective or - saved uid to a value other than one of the current uid, the current - effective uid of the current saved uid. Also verify that setresuid - fails if an invalid uid value is given. - -setreuid01 - - Basic test for the setreuid(2) system call. - -setreuid02 - - Test setreuid() when executed by root. - -setreuid03 - - Test setreuid() when executed by an unprivileged user. - - -setreuid04 - - Test that root can change the real and effective uid to an - unprivileged user. - -setreuid05 - - Test the setreuid() feature, verifying the role of the saved-set-uid - and setreuid's effect on it. - -setreuid06 - - Test that EINVAL is set when setreuid is given an invalid user id. - -setrlimit01 - - Testcase to check the basic functionality of the setrlimit system call. - - -setrlimit02 - - Testcase to test the different errnos set by setrlimit(2) system call. - -setrlimit03 - - Test for EPERM when the super-user tries to increase RLIMIT_NOFILE - beyond the system limit. - -setsid01 - - Test to check the error and trivial conditions in setsid system call - -setuid01 - - Basic test for the setuid(2) system call. - -setuid02 - - Basic test for the setuid(2) system call as root. - -setuid03 - - Test to check the error and trivial conditions in setuid - -fs_perms - - Regression test for Linux filesystem permissions. -uname01 - - Basic test for the uname(2) system call. - -uname02 - - Call uname() with an invalid address to produce a failure - -uname03 - - Call uname() and make sure it succeeds -sysctl01 - - Testcase for testing the basic functionality of sysctl(2) system call. - This testcase attempts to read the kernel parameters using - sysctl({CTL_KERN, KERN_ }, ...) and compares it with the known - values. - -sysctl03 - - Testcase to check that sysctl(2) sets errno to EPERM correctly. - - -sysctl04 - - Testcase to check that sysctl(2) sets errno to ENOTDIR - - -sysctl05 - - Testcase to check that sysctl(2) sets errno to EFAULT - -time01 - - Basic test for the time(2) system call. - - -time02 - - Verify that time(2) returns the value of time in seconds since - the Epoch and stores this value in the memory pointed to by the parameter. - -times01 - - Basic test for the times(2) system call. - -times02 - - Testcase to test that times() sets errno correctly - -times03 - - Testcase to check the basic functionality of the times() system call. - -utime01 - - Verify that the system call utime() successfully sets the modification - and access times of a file to the current time, if the times argument - is null, and the user ID of the process is "root". - -utime02 - - Verify that the system call utime() successfully sets the modification - and access times of a file to the current time, under the following - constraints, - - The times argument is null. - - The user ID of the process is not "root". - - The file is owned by the user ID of the process. - -utime03 - - Verify that the system call utime() successfully sets the modification - and access times of a file to the current time, under the following - constraints, - - The times argument is null. - - The user ID of the process is not "root". - - The file is not owned by the user ID of the process. - - The user ID of the process has write access to the file. - - -utime04 - - Verify that the system call utime() successfully sets the modification - and access times of a file to the time specified by times argument, if - the times argument is not null, and the user ID of the process is "root". - - -utime05 - - Verify that the system call utime() successfully sets the modification - and access times of a file to the value specified by the times argument - under the following constraints, - - The times argument is not null, - - The user ID of the process is not "root". - - The file is owned by the user ID of the process. - - -utime06 - - 1. Verify that the system call utime() fails to set the modification - and access times of a file to the current time, under the following - constraints, - - The times argument is null. - - The user ID of the process is not "root". - - The file is not owned by the user ID of the process. - - The user ID of the process does not have write access to the - file. - 2. Verify that the system call utime() fails to set the modification - and access times of a file if the specified file doesn't exist. - -settimeofday01 - - Testcase to check the basic functionality of settimeofday(). - - -settimeofday02 - - Testcase to check that settimeofday() sets errnos correctly. - -stime01 - - Verify that the system call stime() successfully sets the system's idea - of data and time if invoked by "root" user. - -stime02 - - Verify that the system call stime() fails to set the system's idea - of data and time if invoked by "non-root" user. - -gettimeofday01 - - Testcase to check that gettimeofday(2) sets errno to EFAULT. - - - -alarm01 - - Basic test for alarm(2). - -alarm02 - - Boundary Value Test for alarm(2). - -alarm03 - - Alarm(2) cleared by a fork. - -alarm04 - - Check that when an alarm request is made, the signal SIGALRM is received - even after the process has done an exec(). - -alarm05 - - Check the functionality of the Alarm system call when the time input - parameter is non zero. - -alarm06 - - Check the functionality of the Alarm system call when the time input - parameter is zero. - -alarm07 - - Check the functionality of the alarm() when the time input - parameter is non-zero and the process does a fork. - -getegid01 - - Basic test for getegid(2) - - -geteuid01 - - Basic test for geteuid(2) - - -getgid01 - - Basic test for getgid(2) - -getgid02 - - Testcase to check the basic functionality of getgid(). - -getgid03 - - Testcase to check the basic functionality of getegid(). - - -getpid01 - - Basic test for getpid(2) - - -getpid02 - - Verify that getpid() system call gets the process ID of the of the - calling process. - - -getppid01 - - Testcase to check the basic functionality of the getppid() syscall. - - -getuid01 - - Basic test for getuid(2) - -getuid02 - - Testcase to check the basic functionality of the geteuid() system call. - -getuid03 - - Testcase to check the basic functionality of the getuid() system call. - -nanosleep01 - - Verify that nanosleep() will be successful to suspend the execution - of a process for a specified time. - -nanosleep02 - - Verify that nanosleep() will be successful to suspend the execution - of a process, returns after the receipt of a signal and writes the - remaining sleep time into the structure. - -nanosleep03 - - Verify that nanosleep() will fail to suspend the execution - of a process for a specified time if interrupted by a non-blocked signal. - -nanosleep04 - - Verify that nanosleep() will fail to suspend the execution - of a process if the specified pause time is invalid. - diff --git a/utils/lcov-1.11/example/README b/utils/lcov-1.11/example/README deleted file mode 100755 index cf6cf2e4..00000000 --- a/utils/lcov-1.11/example/README +++ /dev/null @@ -1,6 +0,0 @@ - -To get an example of how the LCOV generated HTML output looks like, -type 'make output' and point a web browser to the resulting file - - output/index.html - diff --git a/utils/lcov-1.11/example/descriptions.txt b/utils/lcov-1.11/example/descriptions.txt deleted file mode 100755 index 47e60213..00000000 --- a/utils/lcov-1.11/example/descriptions.txt +++ /dev/null @@ -1,10 +0,0 @@ -test_noargs - Example program is called without arguments so that default range - [0..9] is used. - -test_2_to_2000 - Example program is called with "2" and "2000" as arguments. - -test_overflow - Example program is called with "0" and "100000" as arguments. The - resulting sum is too large to be stored as an int variable. diff --git a/utils/lcov-1.11/example/example.c b/utils/lcov-1.11/example/example.c deleted file mode 100755 index f9049aa6..00000000 --- a/utils/lcov-1.11/example/example.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * example.c - * - * Calculate the sum of a given range of integer numbers. The range is - * specified by providing two integer numbers as command line argument. - * If no arguments are specified, assume the predefined range [0..9]. - * Abort with an error message if the resulting number is too big to be - * stored as int variable. - * - * This program example is similar to the one found in the GCOV documentation. - * It is used to demonstrate the HTML output generated by LCOV. - * - * The program is split into 3 modules to better demonstrate the 'directory - * overview' function. There are also a lot of bloated comments inserted to - * artificially increase the source code size so that the 'source code - * overview' function makes at least a minimum of sense. - * - */ - -#include -#include -#include "iterate.h" -#include "gauss.h" - -static int start = 0; -static int end = 9; - - -int main (int argc, char* argv[]) -{ - int total1, total2; - - /* Accept a pair of numbers as command line arguments. */ - - if (argc == 3) - { - start = atoi(argv[1]); - end = atoi(argv[2]); - } - - - /* Use both methods to calculate the result. */ - - total1 = iterate_get_sum (start, end); - total2 = gauss_get_sum (start, end); - - - /* Make sure both results are the same. */ - - if (total1 != total2) - { - printf ("Failure (%d != %d)!\n", total1, total2); - } - else - { - printf ("Success, sum[%d..%d] = %d\n", start, end, total1); - } - - return 0; -} diff --git a/utils/lcov-1.11/example/gauss.h b/utils/lcov-1.11/example/gauss.h deleted file mode 100755 index 302a4a98..00000000 --- a/utils/lcov-1.11/example/gauss.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef GAUSS_H -#define GAUSS_H GAUSS_h - -extern int gauss_get_sum (int min, int max); - -#endif /* GAUSS_H */ diff --git a/utils/lcov-1.11/example/iterate.h b/utils/lcov-1.11/example/iterate.h deleted file mode 100755 index 47132795..00000000 --- a/utils/lcov-1.11/example/iterate.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef ITERATE_H -#define ITERATE_H ITERATE_H - -extern int iterate_get_sum (int min, int max); - -#endif /* ITERATE_H */ diff --git a/utils/lcov-1.11/example/methods/gauss.c b/utils/lcov-1.11/example/methods/gauss.c deleted file mode 100755 index 9da3ce50..00000000 --- a/utils/lcov-1.11/example/methods/gauss.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * methods/gauss.c - * - * Calculate the sum of a given range of integer numbers. - * - * Somewhat of a more subtle way of calculation - and it even has a story - * behind it: - * - * Supposedly during math classes in elementary school, the teacher of - * young mathematician Gauss gave the class an assignment to calculate the - * sum of all natural numbers between 1 and 100, hoping that this task would - * keep the kids occupied for some time. The story goes that Gauss had the - * result ready after only a few minutes. What he had written on his black - * board was something like this: - * - * 1 + 100 = 101 - * 2 + 99 = 101 - * 3 + 98 = 101 - * . - * . - * 100 + 1 = 101 - * - * s = (1/2) * 100 * 101 = 5050 - * - * A more general form of this formula would be - * - * s = (1/2) * (max + min) * (max - min + 1) - * - * which is used in the piece of code below to implement the requested - * function in constant time, i.e. without dependencies on the size of the - * input parameters. - * - */ - -#include "gauss.h" - - -int gauss_get_sum (int min, int max) -{ - /* This algorithm doesn't work well with invalid range specifications - so we're intercepting them here. */ - if (max < min) - { - return 0; - } - - return (int) ((max + min) * (double) (max - min + 1) / 2); -} diff --git a/utils/lcov-1.11/example/methods/iterate.c b/utils/lcov-1.11/example/methods/iterate.c deleted file mode 100755 index 023d1801..00000000 --- a/utils/lcov-1.11/example/methods/iterate.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * methods/iterate.c - * - * Calculate the sum of a given range of integer numbers. - * - * This particular method of implementation works by way of brute force, - * i.e. it iterates over the entire range while adding the numbers to finally - * get the total sum. As a positive side effect, we're able to easily detect - * overflows, i.e. situations in which the sum would exceed the capacity - * of an integer variable. - * - */ - -#include -#include -#include "iterate.h" - - -int iterate_get_sum (int min, int max) -{ - int i, total; - - total = 0; - - /* This is where we loop over each number in the range, including - both the minimum and the maximum number. */ - - for (i = min; i <= max; i++) - { - /* We can detect an overflow by checking whether the new - sum would become negative. */ - - if (total + i < total) - { - printf ("Error: sum too large!\n"); - exit (1); - } - - /* Everything seems to fit into an int, so continue adding. */ - - total += i; - } - - return total; -} diff --git a/utils/lcov-1.11/lcovrc b/utils/lcov-1.11/lcovrc deleted file mode 100755 index 5a6d4ebc..00000000 --- a/utils/lcov-1.11/lcovrc +++ /dev/null @@ -1,160 +0,0 @@ -# -# /etc/lcovrc - system-wide defaults for LCOV -# -# To change settings for a single user, place a customized copy of this file -# at location ~/.lcovrc -# - -# Specify an external style sheet file (same as --css-file option of genhtml) -#genhtml_css_file = gcov.css - -# Specify coverage rate limits (in %) for classifying file entries -# HI: hi_limit <= rate <= 100 graph color: green -# MED: med_limit <= rate < hi_limit graph color: orange -# LO: 0 <= rate < med_limit graph color: red -genhtml_hi_limit = 90 -genhtml_med_limit = 75 - -# Width of line coverage field in source code view -genhtml_line_field_width = 12 - -# Width of branch coverage field in source code view -genhtml_branch_field_width = 16 - -# Width of overview image (used by --frames option of genhtml) -genhtml_overview_width = 80 - -# Resolution of overview navigation: this number specifies the maximum -# difference in lines between the position a user selected from the overview -# and the position the source code window is scrolled to (used by --frames -# option of genhtml) -genhtml_nav_resolution = 4 - -# Clicking a line in the overview image should show the source code view at -# a position a bit further up so that the requested line is not the first -# line in the window. This number specifies that offset in lines (used by -# --frames option of genhtml) -genhtml_nav_offset = 10 - -# Do not remove unused test descriptions if non-zero (same as -# --keep-descriptions option of genhtml) -genhtml_keep_descriptions = 0 - -# Do not remove prefix from directory names if non-zero (same as --no-prefix -# option of genhtml) -genhtml_no_prefix = 0 - -# Do not create source code view if non-zero (same as --no-source option of -# genhtml) -genhtml_no_source = 0 - -# Replace tabs with number of spaces in source view (same as --num-spaces -# option of genhtml) -genhtml_num_spaces = 8 - -# Highlight lines with converted-only data if non-zero (same as --highlight -# option of genhtml) -genhtml_highlight = 0 - -# Include color legend in HTML output if non-zero (same as --legend option of -# genhtml) -genhtml_legend = 0 - -# Use FILE as HTML prolog for generated pages (same as --html-prolog option of -# genhtml) -#genhtml_html_prolog = FILE - -# Use FILE as HTML epilog for generated pages (same as --html-epilog option of -# genhtml) -#genhtml_html_epilog = FILE - -# Use custom filename extension for pages (same as --html-extension option of -# genhtml) -#genhtml_html_extension = html - -# Compress all generated html files with gzip. -#genhtml_html_gzip = 1 - -# Include sorted overview pages (can be disabled by the --no-sort option of -# genhtml) -genhtml_sort = 1 - -# Include function coverage data display (can be disabled by the -# --no-func-coverage option of genhtml) -#genhtml_function_coverage = 1 - -# Include branch coverage data display (can be disabled by the -# --no-branch-coverage option of genhtml) -#genhtml_branch_coverage = 1 - -# Specify the character set of all generated HTML pages -genhtml_charset=UTF-8 - -# Allow HTML markup in test case description text if non-zero -genhtml_desc_html=0 - -# Location of the gcov tool (same as --gcov-info option of geninfo) -#geninfo_gcov_tool = gcov - -# Adjust test names to include operating system information if non-zero -#geninfo_adjust_testname = 0 - -# Calculate checksum for each source code line if non-zero (same as --checksum -# option of geninfo if non-zero, same as --no-checksum if zero) -#geninfo_checksum = 1 - -# Specify whether to capture coverage data for external source files (can -# be overridden by the --external and --no-external options of geninfo/lcov) -#geninfo_external = 1 - -# Enable libtool compatibility mode if non-zero (same as --compat-libtool option -# of geninfo if non-zero, same as --no-compat-libtool if zero) -#geninfo_compat_libtool = 0 - -# Use gcov's --all-blocks option if non-zero -#geninfo_gcov_all_blocks = 1 - -# Specify compatiblity modes (same as --compat option of geninfo). -#geninfo_compat = libtool=on, hammer=auto, split_crc=auto - -# Adjust path to source files by removing or changing path components that -# match the specified pattern (Perl regular expression format) -#geninfo_adjust_src_path = /tmp/build => /usr/src - -# Specify if geninfo should try to automatically determine the base-directory -# when collecting coverage data. -geninfo_auto_base = 1 - -# Directory containing gcov kernel files -# lcov_gcov_dir = /proc/gcov - -# Location of the insmod tool -lcov_insmod_tool = /sbin/insmod - -# Location of the modprobe tool -lcov_modprobe_tool = /sbin/modprobe - -# Location of the rmmod tool -lcov_rmmod_tool = /sbin/rmmod - -# Location for temporary directories -lcov_tmp_dir = /tmp - -# Show full paths during list operation if non-zero (same as --list-full-path -# option of lcov) -lcov_list_full_path = 0 - -# Specify the maximum width for list output. This value is ignored when -# lcov_list_full_path is non-zero. -lcov_list_width = 80 - -# Specify the maximum percentage of file names which may be truncated when -# choosing a directory prefix in list output. This value is ignored when -# lcov_list_full_path is non-zero. -lcov_list_truncate_max = 20 - -# Specify if function coverage data should be collected and processed. -lcov_function_coverage = 1 - -# Specify if branch coverage data should be collected and processed. -lcov_branch_coverage = 0 diff --git a/utils/lcov-1.11/man/gendesc.1 b/utils/lcov-1.11/man/gendesc.1 deleted file mode 100755 index 9be5132c..00000000 --- a/utils/lcov-1.11/man/gendesc.1 +++ /dev/null @@ -1,78 +0,0 @@ -.TH gendesc 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" -.SH NAME -gendesc \- Generate a test case description file -.SH SYNOPSIS -.B gendesc -.RB [ \-h | \-\-help ] -.RB [ \-v | \-\-version ] -.RS 8 -.br -.RB [ \-o | \-\-output\-filename -.IR filename ] -.br -.I inputfile -.SH DESCRIPTION -Convert plain text test case descriptions into a format as understood by -.BR genhtml . -.I inputfile -needs to observe the following format: - -For each test case: -.IP " \-" -one line containing the test case name beginning at the start of the line -.RE -.IP " \-" -one or more lines containing the test case description indented with at -least one whitespace character (tab or space) -.RE - -.B Example input file: - -test01 -.RS -An example test case description. -.br -Description continued -.RE - -test42 -.RS -Supposedly the answer to most of your questions -.RE - -Note: valid test names can consist of letters, decimal digits and the -underscore character ('_'). -.SH OPTIONS -.B \-h -.br -.B \-\-help -.RS -Print a short help text, then exit. -.RE - -.B \-v -.br -.B \-\-version -.RS -Print version number, then exit. -.RE - - -.BI "\-o " filename -.br -.BI "\-\-output\-filename " filename -.RS -Write description data to -.IR filename . - -By default, output is written to STDOUT. -.RE -.SH AUTHOR -Peter Oberparleiter - -.SH SEE ALSO -.BR lcov (1), -.BR genhtml (1), -.BR geninfo (1), -.BR genpng (1), -.BR gcov (1) diff --git a/utils/lcov-1.11/man/genhtml.1 b/utils/lcov-1.11/man/genhtml.1 deleted file mode 100755 index 297d80ae..00000000 --- a/utils/lcov-1.11/man/genhtml.1 +++ /dev/null @@ -1,569 +0,0 @@ -.TH genhtml 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" -.SH NAME -genhtml \- Generate HTML view from LCOV coverage data files -.SH SYNOPSIS -.B genhtml -.RB [ \-h | \-\-help ] -.RB [ \-v | \-\-version ] -.RS 8 -.br -.RB [ \-q | \-\-quiet ] -.RB [ \-s | \-\-show\-details ] -.RB [ \-f | \-\-frames ] -.br -.RB [ \-b | \-\-baseline\-file ] -.IR baseline\-file -.br -.RB [ \-o | \-\-output\-directory -.IR output\-directory ] -.br -.RB [ \-t | \-\-title -.IR title ] -.br -.RB [ \-d | \-\-description\-file -.IR description\-file ] -.br -.RB [ \-k | \-\-keep\-descriptions ] -.RB [ \-c | \-\-css\-file -.IR css\-file ] -.br -.RB [ \-p | \-\-prefix -.IR prefix ] -.RB [ \-\-no\-prefix ] -.br -.RB [ \-\-no\-source ] -.RB [ \-\-num\-spaces -.IR num ] -.RB [ \-\-highlight ] -.br -.RB [ \-\-legend ] -.RB [ \-\-html\-prolog -.IR prolog\-file ] -.br -.RB [ \-\-html\-epilog -.IR epilog\-file ] -.RB [ \-\-html\-extension -.IR extension ] -.br -.RB [ \-\-html\-gzip ] -.RB [ \-\-sort ] -.RB [ \-\-no\-sort ] -.br -.RB [ \-\-function\-coverage ] -.RB [ \-\-no\-function\-coverage ] -.br -.RB [ \-\-branch\-coverage ] -.RB [ \-\-no\-branch\-coverage ] -.br -.RB [ \-\-demangle\-cpp ] -.RB [ \-\-ignore\-errors -.IR errors ] -.br -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-rc -.IR keyword = value ] -.br -.IR tracefile(s) -.RE -.SH DESCRIPTION -Create an HTML view of coverage data found in -.IR tracefile . -Note that -.I tracefile -may also be a list of filenames. - -HTML output files are created in the current working directory unless the -\-\-output\-directory option is used. If -.I tracefile -ends with ".gz", it is assumed to be GZIP\-compressed and the gunzip tool -will be used to decompress it transparently. - -Note that all source code files have to be present and readable at the -exact file system location they were compiled. - -Use option -.I \--css\-file -to modify layout and colors of the generated HTML output. Files are -marked in different colors depending on the associated coverage rate. By -default, the coverage limits for low, medium and high coverage are set to -0\-75%, 75\-90% and 90\-100% percent respectively. To change these -values, use configuration file options -.IR genhtml_hi_limit " and " genhtml_med_limit . - -Also note that when displaying percentages, 0% and 100% are only printed when -the values are exactly 0% and 100% respectively. Other values which would -conventionally be rounded to 0% or 100% are instead printed as nearest -non-boundary value. This behavior is in accordance with that of the -.BR gcov (1) -tool. - -.SH OPTIONS -.B \-h -.br -.B \-\-help -.RS -Print a short help text, then exit. - -.RE -.B \-v -.br -.B \-\-version -.RS -Print version number, then exit. - -.RE -.B \-q -.br -.B \-\-quiet -.RS -Do not print progress messages. - -Suppresses all informational progress output. When this switch is enabled, -only error or warning messages are printed. - -.RE -.B \-f -.br -.B \-\-frames -.RS -Use HTML frames for source code view. - -If enabled, a frameset is created for each source code file, providing -an overview of the source code as a "clickable" image. Note that this -option will slow down output creation noticeably because each source -code character has to be inspected once. Note also that the GD.pm Perl -module has to be installed for this option to work (it may be obtained -from http://www.cpan.org). - -.RE -.B \-s -.br -.B \-\-show\-details -.RS -Generate detailed directory view. - -When this option is enabled, -.B genhtml -generates two versions of each -file view. One containing the standard information plus a link to a -"detailed" version. The latter additionally contains information about -which test case covered how many lines of each source file. - -.RE -.BI "\-b " baseline\-file -.br -.BI "\-\-baseline\-file " baseline\-file -.RS -Use data in -.I baseline\-file -as coverage baseline. - -The tracefile specified by -.I baseline\-file -is read and all counts found in the original -.I tracefile -are decremented by the corresponding counts in -.I baseline\-file -before creating any output. - -Note that when a count for a particular line in -.I baseline\-file -is greater than the count in the -.IR tracefile , -the result is zero. - -.RE -.BI "\-o " output\-directory -.br -.BI "\-\-output\-directory " output\-directory -.RS -Create files in -.I output\-directory. - -Use this option to tell -.B genhtml -to write the resulting files to a directory other than -the current one. If -.I output\-directory -does not exist, it will be created. - -It is advisable to use this option since depending on the -project size, a lot of files and subdirectories may be created. - -.RE -.BI "\-t " title -.br -.BI "\-\-title " title -.RS -Display -.I title -in header of all pages. - -.I title -is written to the header portion of each generated HTML page to -identify the context in which a particular output -was created. By default this is the name of the tracefile. - -.RE -.BI "\-d " description\-file -.br -.BI "\-\-description\-file " description\-file -.RS -Read test case descriptions from -.IR description\-file . - -All test case descriptions found in -.I description\-file -and referenced in the input data file are read and written to an extra page -which is then incorporated into the HTML output. - -The file format of -.IR "description\-file " is: - -for each test case: -.RS -TN: -.br -TD: - -.RE - -Valid test case names can consist of letters, numbers and the underscore -character ('_'). -.RE -.B \-k -.br -.B \-\-keep\-descriptions -.RS -Do not remove unused test descriptions. - -Keep descriptions found in the description file even if the coverage data -indicates that the associated test case did not cover any lines of code. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_keep_descriptions . - -.RE -.BI "\-c " css\-file -.br -.BI "\-\-css\-file " css\-file -.RS -Use external style sheet file -.IR css\-file . - -Using this option, an extra .css file may be specified which will replace -the default one. This may be helpful if the default colors make your eyes want -to jump out of their sockets :) - -This option can also be configured permanently using the configuration file -option -.IR genhtml_css_file . - -.RE -.BI "\-p " prefix -.br -.BI "\-\-prefix " prefix -.RS -Remove -.I prefix -from all directory names. - -Because lists containing long filenames are difficult to read, there is a -mechanism implemented that will automatically try to shorten all directory -names on the overview page beginning with a common prefix. By default, -this is done using an algorithm that tries to find the prefix which, when -applied, will minimize the resulting sum of characters of all directory -names. - -Use this option to specify the prefix to be removed by yourself. - -.RE -.B \-\-no\-prefix -.RS -Do not remove prefix from directory names. - -This switch will completely disable the prefix mechanism described in the -previous section. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_no_prefix . - -.RE -.B \-\-no\-source -.RS -Do not create source code view. - -Use this switch if you don't want to get a source code view for each file. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_no_source . - -.RE -.BI "\-\-num\-spaces " spaces -.RS -Replace tabs in source view with -.I num -spaces. - -Default value is 8. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_num_spaces . - -.RE -.B \-\-highlight -.RS -Highlight lines with converted\-only coverage data. - -Use this option in conjunction with the \-\-diff option of -.B lcov -to highlight those lines which were only covered in data sets which were -converted from previous source code versions. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_highlight . - -.RE -.B \-\-legend -.RS -Include color legend in HTML output. - -Use this option to include a legend explaining the meaning of color coding -in the resulting HTML output. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_legend . - -.RE -.BI "\-\-html\-prolog " prolog\-file -.RS -Read customized HTML prolog from -.IR prolog\-file . - -Use this option to replace the default HTML prolog (the initial part of the -HTML source code leading up to and including the tag) with the contents -of -.IR prolog\-file . -Within the prolog text, the following words will be replaced when a page is generated: - -.B "@pagetitle@" -.br -The title of the page. - -.B "@basedir@" -.br -A relative path leading to the base directory (e.g. for locating css\-files). - -This option can also be configured permanently using the configuration file -option -.IR genhtml_html_prolog . - -.RE -.BI "\-\-html\-epilog " epilog\-file -.RS -Read customized HTML epilog from -.IR epilog\-file . - -Use this option to replace the default HTML epilog (the final part of the HTML -source including ) with the contents of -.IR epilog\-file . - -Within the epilog text, the following words will be replaced when a page is generated: - -.B "@basedir@" -.br -A relative path leading to the base directory (e.g. for locating css\-files). - -This option can also be configured permanently using the configuration file -option -.IR genhtml_html_epilog . - -.RE -.BI "\-\-html\-extension " extension -.RS -Use customized filename extension for generated HTML pages. - -This option is useful in situations where different filename extensions -are required to render the resulting pages correctly (e.g. php). Note that -a '.' will be inserted between the filename and the extension specified by -this option. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_html_extension . -.RE - -.B \-\-html\-gzip -.RS -Compress all generated html files with gzip and add a .htaccess file specifying -gzip\-encoding in the root output directory. - -Use this option if you want to save space on your webserver. Requires a -webserver with .htaccess support and a browser with support for gzip -compressed html. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_html_gzip . - -.RE -.B \-\-sort -.br -.B \-\-no\-sort -.RS -Specify whether to include sorted views of file and directory overviews. - -Use \-\-sort to include sorted views or \-\-no\-sort to not include them. -Sorted views are -.B enabled -by default. - -When sorted views are enabled, each overview page will contain links to -views of that page sorted by coverage rate. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_sort . - -.RE -.B \-\-function\-coverage -.br -.B \-\-no\-function\-coverage -.RS -Specify whether to display function coverage summaries in HTML output. - -Use \-\-function\-coverage to enable function coverage summaries or -\-\-no\-function\-coverage to disable it. Function coverage summaries are -.B enabled -by default - -When function coverage summaries are enabled, each overview page will contain -the number of functions found and hit per file or directory, together with -the resulting coverage rate. In addition, each source code view will contain -a link to a page which lists all functions found in that file plus the -respective call count for those functions. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_function_coverage . - -.RE -.B \-\-branch\-coverage -.br -.B \-\-no\-branch\-coverage -.RS -Specify whether to display branch coverage data in HTML output. - -Use \-\-branch\-coverage to enable branch coverage display or -\-\-no\-branch\-coverage to disable it. Branch coverage data display is -.B enabled -by default - -When branch coverage display is enabled, each overview page will contain -the number of branches found and hit per file or directory, together with -the resulting coverage rate. In addition, each source code view will contain -an extra column which lists all branches of a line with indications of -whether the branch was taken or not. Branches are shown in the following format: - - ' + ': Branch was taken at least once -.br - ' - ': Branch was not taken -.br - ' # ': The basic block containing the branch was never executed -.br - -Note that it might not always be possible to relate branches to the -corresponding source code statements: during compilation, GCC might shuffle -branches around or eliminate some of them to generate better code. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_branch_coverage . - -.RE -.B \-\-demangle\-cpp -.RS -Specify whether to demangle C++ function names. - -Use this option if you want to convert C++ internal function names to -human readable format for display on the HTML function overview page. -This option requires that the c++filt tool is installed (see -.BR c++filt (1)). - -.RE -.B \-\-ignore\-errors -.I errors -.br -.RS -Specify a list of errors after which to continue processing. - -Use this option to specify a list of one or more classes of errors after which -geninfo should continue processing instead of aborting. - -.I errors -can be a comma\-separated list of the following keywords: - -.B source: -the source code file for a data set could not be found. -.RE - -.B \-\-config\-file -.I config\-file -.br -.RS -Specify a configuration file to use. - -When this option is specified, neither the system\-wide configuration file -/etc/lcovrc, nor the per\-user configuration file ~/.lcovrc is read. - -This option may be useful when there is a need to run several -instances of -.B genhtml -with different configuration file options in parallel. -.RE - -.B \-\-rc -.IR keyword = value -.br -.RS -Override a configuration directive. - -Use this option to specify a -.IR keyword = value -statement which overrides the corresponding configuration statement in -the lcovrc configuration file. You can specify this option more than once -to override multiple configuration statements. -See -.BR lcovrc (5) -for a list of available keywords and their meaning. -.RE - -.SH FILES - -.I /etc/lcovrc -.RS -The system\-wide configuration file. -.RE - -.I ~/.lcovrc -.RS -The per\-user configuration file. -.RE - -.SH AUTHOR -Peter Oberparleiter - -.SH SEE ALSO -.BR lcov (1), -.BR lcovrc (5), -.BR geninfo (1), -.BR genpng (1), -.BR gendesc (1), -.BR gcov (1) diff --git a/utils/lcov-1.11/man/geninfo.1 b/utils/lcov-1.11/man/geninfo.1 deleted file mode 100755 index 4229b466..00000000 --- a/utils/lcov-1.11/man/geninfo.1 +++ /dev/null @@ -1,531 +0,0 @@ -.TH geninfo 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" -.SH NAME -geninfo \- Generate tracefiles from .da files -.SH SYNOPSIS -.B geninfo -.RB [ \-h | \-\-help ] -.RB [ \-v | \-\-version ] -.RB [ \-q | \-\-quiet ] -.br -.RS 8 -.RB [ \-i | \-\-initial ] -.RB [ \-t | \-\-test\-name -.IR test\-name ] -.br -.RB [ \-o | \-\-output\-filename -.IR filename ] -.RB [ \-f | \-\-follow ] -.br -.RB [ \-b | \-\-base\-directory -.IR directory ] -.br -.RB [ \-\-checksum ] -.RB [ \-\-no\-checksum ] -.br -.RB [ \-\-compat\-libtool ] -.RB [ \-\-no\-compat\-libtool ] -.br -.RB [ \-\-gcov\-tool -.IR tool ] -.RB [ \-\-ignore\-errors -.IR errors ] -.br -.RB [ \-\-no\-recursion ] -.I directory -.RB [ \-\-external ] -.RB [ \-\-no\-external ] -.br -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-no\-markers ] -.br -.RB [ \-\-derive\-func\-data ] -.RB [ \-\-compat -.IR mode =on|off|auto] -.br -.RB [ \-\-rc -.IR keyword = value ] -.RE -.SH DESCRIPTION -.B geninfo -converts all GCOV coverage data files found in -.I directory -into tracefiles, which the -.B genhtml -tool can convert to HTML output. - -Unless the \-\-output\-filename option is specified, -.B geninfo -writes its -output to one file per .da file, the name of which is generated by simply -appending ".info" to the respective .da file name. - -Note that the current user needs write access to both -.I directory -as well as to the original source code location. This is necessary because -some temporary files have to be created there during the conversion process. - -Note also that -.B geninfo -is called from within -.BR lcov , -so that there is usually no need to call it directly. - -.B Exclusion markers - -To exclude specific lines of code from a tracefile, you can add exclusion -markers to the source code. Additionally you can exclude specific branches from -branch coverage without excluding the involved lines from line and function -coverage. Exclusion markers are keywords which can for example be added in the -form of a comment. - -The following markers are recognized by geninfo: - -LCOV_EXCL_LINE -.RS -Lines containing this marker will be excluded. -.br -.RE -LCOV_EXCL_START -.RS -Marks the beginning of an excluded section. The current line is part of this -section. -.br -.RE -LCOV_EXCL_STOP -.RS -Marks the end of an excluded section. The current line not part of this -section. -.RE -.br -LCOV_EXCL_BR_LINE -.RS -Lines containing this marker will be excluded from branch coverage. -.br -.RE -LCOV_EXCL_BR_START -.RS -Marks the beginning of a section which is excluded from branch coverage. The -current line is part of this section. -.br -.RE -LCOV_EXCL_BR_STOP -.RS -Marks the end of a section which is excluded from branch coverage. The current -line not part of this section. -.RE -.br - -.SH OPTIONS - -.B \-b -.I directory -.br -.B \-\-base\-directory -.I directory -.br -.RS -.RI "Use " directory -as base directory for relative paths. - -Use this option to specify the base directory of a build\-environment -when geninfo produces error messages like: - -.RS -ERROR: could not read source file /home/user/project/subdir1/subdir2/subdir1/subdir2/file.c -.RE - -In this example, use /home/user/project as base directory. - -This option is required when using geninfo on projects built with libtool or -similar build environments that work with a base directory, i.e. environments, -where the current working directory when invoking the compiler is not the same -directory in which the source code file is located. - -Note that this option will not work in environments where multiple base -directories are used. In that case use configuration file setting -.B geninfo_auto_base=1 -(see -.BR lcovrc (5)). -.RE - -.B \-\-checksum -.br -.B \-\-no\-checksum -.br -.RS -Specify whether to generate checksum data when writing tracefiles. - -Use \-\-checksum to enable checksum generation or \-\-no\-checksum to -disable it. Checksum generation is -.B disabled -by default. - -When checksum generation is enabled, a checksum will be generated for each -source code line and stored along with the coverage data. This checksum will -be used to prevent attempts to combine coverage data from different source -code versions. - -If you don't work with different source code versions, disable this option -to speed up coverage data processing and to reduce the size of tracefiles. -.RE - -.B \-\-compat -.IR mode = value [, mode = value ,...] -.br -.RS -Set compatibility mode. - -Use \-\-compat to specify that geninfo should enable one or more compatibility -modes when capturing coverage data. You can provide a comma-separated list -of mode=value pairs to specify the values for multiple modes. - -Valid -.I values -are: - -.B on -.RS -Enable compatibility mode. -.RE -.B off -.RS -Disable compatibility mode. -.RE -.B auto -.RS -Apply auto-detection to determine if compatibility mode is required. Note that -auto-detection is not available for all compatibility modes. -.RE - -If no value is specified, 'on' is assumed as default value. - -Valid -.I modes -are: - -.B libtool -.RS -Enable this mode if you are capturing coverage data for a project that -was built using the libtool mechanism. See also -\-\-compat\-libtool. - -The default value for this setting is 'on'. - -.RE -.B hammer -.RS -Enable this mode if you are capturing coverage data for a project that -was built using a version of GCC 3.3 that contains a modification -(hammer patch) of later GCC versions. You can identify a modified GCC 3.3 -by checking the build directory of your project for files ending in the -extension '.bbg'. Unmodified versions of GCC 3.3 name these files '.bb'. - -The default value for this setting is 'auto'. - -.RE -.B split_crc -.RS -Enable this mode if you are capturing coverage data for a project that -was built using a version of GCC 4.6 that contains a modification -(split function checksums) of later GCC versions. Typical error messages -when running geninfo on coverage data produced by such GCC versions are -\'out of memory' and 'reached unexpected end of file'. - -The default value for this setting is 'auto' -.RE - -.RE - -.B \-\-compat\-libtool -.br -.B \-\-no\-compat\-libtool -.br -.RS -Specify whether to enable libtool compatibility mode. - -Use \-\-compat\-libtool to enable libtool compatibility mode or \-\-no\-compat\-libtool -to disable it. The libtool compatibility mode is -.B enabled -by default. - -When libtool compatibility mode is enabled, geninfo will assume that the source -code relating to a .da file located in a directory named ".libs" can be -found in its parent directory. - -If you have directories named ".libs" in your build environment but don't use -libtool, disable this option to prevent problems when capturing coverage data. -.RE - -.B \-\-config\-file -.I config\-file -.br -.RS -Specify a configuration file to use. - -When this option is specified, neither the system\-wide configuration file -/etc/lcovrc, nor the per\-user configuration file ~/.lcovrc is read. - -This option may be useful when there is a need to run several -instances of -.B geninfo -with different configuration file options in parallel. -.RE - -.B \-\-derive\-func\-data -.br -.RS -Calculate function coverage data from line coverage data. - -Use this option to collect function coverage data, even if the version of the -gcov tool installed on the test system does not provide this data. lcov will -instead derive function coverage data from line coverage data and -information about which lines belong to a function. -.RE - -.B \-\-external -.br -.B \-\-no\-external -.br -.RS -Specify whether to capture coverage data for external source files. - -External source files are files which are not located in one of the directories -specified by \-\-directory or \-\-base\-directory. Use \-\-external to include -external source files while capturing coverage data or \-\-no\-external to -ignore this data. - -Data for external source files is -.B included -by default. -.RE - -.B \-f -.br -.B \-\-follow -.RS -Follow links when searching .da files. -.RE - -.B \-\-gcov\-tool -.I tool -.br -.RS -Specify the location of the gcov tool. -.RE - -.B \-h -.br -.B \-\-help -.RS -Print a short help text, then exit. -.RE - -.B \-\-ignore\-errors -.I errors -.br -.RS -Specify a list of errors after which to continue processing. - -Use this option to specify a list of one or more classes of errors after which -geninfo should continue processing instead of aborting. - -.I errors -can be a comma\-separated list of the following keywords: - -.B gcov: -the gcov tool returned with a non\-zero return code. - -.B source: -the source code file for a data set could not be found. -.RE - -.B \-i -.br -.B \-\-initial -.RS -Capture initial zero coverage data. - -Run geninfo with this option on the directories containing .bb, .bbg or .gcno -files before running any test case. The result is a "baseline" coverage data -file that contains zero coverage for every instrumented line and function. -Combine this data file (using lcov \-a) with coverage data files captured -after a test run to ensure that the percentage of total lines covered is -correct even when not all object code files were loaded during the test. - -Note: currently, the \-\-initial option does not generate branch coverage -information. -.RE - -.B \-\-no\-markers -.br -.RS -Use this option if you want to get coverage data without regard to exclusion -markers in the source code file. -.RE - -.B \-\-no\-recursion -.br -.RS -Use this option if you want to get coverage data for the specified directory -only without processing subdirectories. -.RE - -.BI "\-o " output\-filename -.br -.BI "\-\-output\-filename " output\-filename -.RS -Write all data to -.IR output\-filename . - -If you want to have all data written to a single file (for easier -handling), use this option to specify the respective filename. By default, -one tracefile will be created for each processed .da file. -.RE - -.B \-q -.br -.B \-\-quiet -.RS -Do not print progress messages. - -Suppresses all informational progress output. When this switch is enabled, -only error or warning messages are printed. -.RE - -.B \-\-rc -.IR keyword = value -.br -.RS -Override a configuration directive. - -Use this option to specify a -.IR keyword = value -statement which overrides the corresponding configuration statement in -the lcovrc configuration file. You can specify this option more than once -to override multiple configuration statements. -See -.BR lcovrc (5) -for a list of available keywords and their meaning. -.RE - -.BI "\-t " testname -.br -.BI "\-\-test\-name " testname -.RS -Use test case name -.I testname -for resulting data. Valid test case names can consist of letters, decimal -digits and the underscore character ('_'). - -This proves useful when data from several test cases is merged (i.e. by -simply concatenating the respective tracefiles) in which case a test -name can be used to differentiate between data from each test case. -.RE - -.B \-v -.br -.B \-\-version -.RS -Print version number, then exit. -.RE - - -.SH FILES - -.I /etc/lcovrc -.RS -The system\-wide configuration file. -.RE - -.I ~/.lcovrc -.RS -The per\-user configuration file. -.RE - -Following is a quick description of the tracefile format as used by -.BR genhtml ", " geninfo " and " lcov . - -A tracefile is made up of several human\-readable lines of text, -divided into sections. If available, a tracefile begins with the -.I testname -which is stored in the following format: - - TN: - -For each source file referenced in the .da file, there is a section containing -filename and coverage data: - - SF: - -Following is a list of line numbers for each function name found in the -source file: - - FN:, - -Next, there is a list of execution counts for each instrumented function: - - FNDA:, - -This list is followed by two lines containing the number of functions found -and hit: - - FNF: - FNH: - -Branch coverage information is stored which one line per branch: - - BRDA:,,, - -Block number and branch number are gcc internal IDs for the branch. Taken is -either '-' if the basic block containing the branch was never executed or -a number indicating how often that branch was taken. - -Branch coverage summaries are stored in two lines: - - BRF: - BRH: - -Then there is a list of execution counts for each instrumented line -(i.e. a line which resulted in executable code): - - DA:,[,] - -Note that there may be an optional checksum present for each instrumented -line. The current -.B geninfo -implementation uses an MD5 hash as checksumming algorithm. - -At the end of a section, there is a summary about how many lines -were found and how many were actually instrumented: - - LH: - LF: - -Each sections ends with: - - end_of_record - -In addition to the main source code file there are sections for all -#included files which also contain executable code. - -Note that the absolute path of a source file is generated by interpreting -the contents of the respective .bb file (see -.BR "gcov " (1) -for more information on this file type). Relative filenames are prefixed -with the directory in which the .bb file is found. - -Note also that symbolic links to the .bb file will be resolved so that the -actual file path is used instead of the path to a link. This approach is -necessary for the mechanism to work with the /proc/gcov files. - -.SH AUTHOR -Peter Oberparleiter - -.SH SEE ALSO -.BR lcov (1), -.BR lcovrc (5), -.BR genhtml (1), -.BR genpng (1), -.BR gendesc (1), -.BR gcov (1) diff --git a/utils/lcov-1.11/man/genpng.1 b/utils/lcov-1.11/man/genpng.1 deleted file mode 100755 index e5c412af..00000000 --- a/utils/lcov-1.11/man/genpng.1 +++ /dev/null @@ -1,101 +0,0 @@ -.TH genpng 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" -.SH NAME -genpng \- Generate an overview image from a source file -.SH SYNOPSIS -.B genpng -.RB [ \-h | \-\-help ] -.RB [ \-v | \-\-version ] -.RS 7 -.br -.RB [ \-t | \-\-tab\-size -.IR tabsize ] -.RB [ \-w | \-\-width -.IR width ] -.br -.RB [ \-o | \-\-output\-filename -.IR output\-filename ] -.br -.IR source\-file -.SH DESCRIPTION -.B genpng -creates an overview image for a given source code file of either -plain text or .gcov file format. - -Note that the -.I GD.pm -Perl module has to be installed for this script to work -(it may be obtained from -.IR http://www.cpan.org ). - -Note also that -.B genpng -is called from within -.B genhtml -so that there is usually no need to call it directly. - -.SH OPTIONS -.B \-h -.br -.B \-\-help -.RS -Print a short help text, then exit. -.RE - -.B \-v -.br -.B \-\-version -.RS -Print version number, then exit. -.RE - -.BI "\-t " tab\-size -.br -.BI "\-\-tab\-size " tab\-size -.RS -Use -.I tab\-size -spaces in place of tab. - -All occurrences of tabulator signs in the source code file will be replaced -by the number of spaces defined by -.I tab\-size -(default is 4). -.RE - -.BI "\-w " width -.br -.BI "\-\-width " width -.RS -Set width of output image to -.I width -pixel. - -The resulting image will be exactly -.I width -pixel wide (default is 80). - -Note that source code lines which are longer than -.I width -will be truncated. -.RE - - -.BI "\-o " filename -.br -.BI "\-\-output\-filename " filename -.RS -Write image to -.IR filename . - -Specify a name for the resulting image file (default is -.IR source\-file .png). -.RE -.SH AUTHOR -Peter Oberparleiter - -.SH SEE ALSO -.BR lcov (1), -.BR genhtml (1), -.BR geninfo (1), -.BR gendesc (1), -.BR gcov (1) diff --git a/utils/lcov-1.11/man/lcov.1 b/utils/lcov-1.11/man/lcov.1 deleted file mode 100755 index 16d01de5..00000000 --- a/utils/lcov-1.11/man/lcov.1 +++ /dev/null @@ -1,886 +0,0 @@ -.TH lcov 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" -.SH NAME -lcov \- a graphical GCOV front\-end -.SH SYNOPSIS -.B lcov -.BR \-c | \-\-capture -.RS 5 -.br -.RB [ \-d | \-\-directory -.IR directory ] -.RB [ \-k | \-\-kernel\-directory -.IR directory ] -.br -.RB [ \-o | \-\-output\-file -.IR tracefile ] -.RB [ \-t | \-\-test\-name -.IR testname ] -.br -.RB [ \-b | \-\-base\-directory -.IR directory ] -.RB [ \-i | \-\-initial ] -.RB [ \-\-gcov\-tool -.IR tool ] -.br -.RB [ \-\-checksum ] -.RB [ \-\-no\-checksum ] -.RB [ \-\-no\-recursion ] -.RB [ \-f | \-\-follow ] -.br -.RB [ \-\-compat\-libtool ] -.RB [ \-\-no\-compat\-libtool ] -.RB [ \-\-ignore\-errors -.IR errors ] -.br -.RB [ \-\-to\-package -.IR package ] -.RB [ \-\-from\-package -.IR package ] -.RB [ \-q | \-\-quiet ] -.br -.RB [ \-\-no\-markers ] -.RB [ \-\-external ] -.RB [ \-\-no\-external ] -.br -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-rc -.IR keyword = value ] -.br -.RB [ \-\-compat -.IR mode =on|off|auto] -.br -.RE - -.B lcov -.BR \-z | \-\-zerocounters -.RS 5 -.br -.RB [ \-d | \-\-directory -.IR directory ] -.RB [ \-\-no\-recursion ] -.RB [ \-f | \-\-follow ] -.br -.RB [ \-q | \-\-quiet ] -.br -.RE - -.B lcov -.BR \-l | \-\-list -.I tracefile -.RS 5 -.br -.RB [ \-q | \-\-quiet ] -.RB [ \-\-list\-full\-path ] -.RB [ \-\-no\-list\-full\-path ] -.br -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-rc -.IR keyword = value ] -.br -.RE - -.B lcov -.BR \-a | \-\-add\-tracefile -.I tracefile -.RS 5 -.br -.RB [ \-o | \-\-output\-file -.IR tracefile ] -.RB [ \-\-checksum ] -.RB [ \-\-no\-checksum ] -.br -.RB [ \-q | \-\-quiet ] -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-rc -.IR keyword = value ] -.br -.RE - -.B lcov -.BR \-e | \-\-extract -.I tracefile pattern -.RS 5 -.br -.RB [ \-o | \-\-output\-file -.IR tracefile ] -.RB [ \-\-checksum ] -.RB [ \-\-no\-checksum ] -.br -.RB [ \-q | \-\-quiet ] -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-rc -.IR keyword = value ] -.br -.RE - -.B lcov -.BR \-r | \-\-remove -.I tracefile pattern -.RS 5 -.br -.RB [ \-o | \-\-output\-file -.IR tracefile ] -.RB [ \-\-checksum ] -.RB [ \-\-no\-checksum ] -.br -.RB [ \-q | \-\-quiet ] -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-rc -.IR keyword = value ] -.br -.RE - -.B lcov -.BR \-\-diff -.IR "tracefile diff" -.RS 5 -.br -.RB [ \-o | \-\-output\-file -.IR tracefile ] -.RB [ \-\-checksum ] -.RB [ \-\-no\-checksum ] -.br -.RB [ \-\-convert\-filenames ] -.RB [ \-\-strip -.IR depth ] -.RB [ \-\-path -.IR path ] -.RB [ \-q | \-\-quiet ] -.br -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-rc -.IR keyword = value ] -.br -.RE - -.B lcov -.BR \-\-summary -.I tracefile -.RS 5 -.br -.RB [ \-q | \-\-quiet ] -.br -.RE - -.B lcov -.RB [ \-h | \-\-help ] -.RB [ \-v | \-\-version ] -.RS 5 -.br -.RE - -.SH DESCRIPTION -.B lcov -is a graphical front\-end for GCC's coverage testing tool gcov. It collects -line, function and branch coverage data for multiple source files and creates -HTML pages containing the source code annotated with coverage information. -It also adds overview pages for easy navigation within the file structure. - -Use -.B lcov -to collect coverage data and -.B genhtml -to create HTML pages. Coverage data can either be collected from the -currently running Linux kernel or from a user space application. To do this, -you have to complete the following preparation steps: - -For Linux kernel coverage: -.RS -Follow the setup instructions for the gcov\-kernel infrastructure: -.I http://ltp.sourceforge.net/coverage/gcov.php -.br - - -.RE -For user space application coverage: -.RS -Compile the application with GCC using the options -"\-fprofile\-arcs" and "\-ftest\-coverage". -.RE - -Please note that this man page refers to the output format of -.B lcov -as ".info file" or "tracefile" and that the output of GCOV -is called ".da file". - -Also note that when printing percentages, 0% and 100% are only printed when -the values are exactly 0% and 100% respectively. Other values which would -conventionally be rounded to 0% or 100% are instead printed as nearest -non-boundary value. This behavior is in accordance with that of the -.BR gcov (1) -tool. - -.SH OPTIONS - - -.B \-a -.I tracefile -.br -.B \-\-add\-tracefile -.I tracefile -.br -.RS -Add contents of -.IR tracefile . - -Specify several tracefiles using the \-a switch to combine the coverage data -contained in these files by adding up execution counts for matching test and -filename combinations. - -The result of the add operation will be written to stdout or the tracefile -specified with \-o. - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. - -.RE - -.B \-b -.I directory -.br -.B \-\-base\-directory -.I directory -.br -.RS -.RI "Use " directory -as base directory for relative paths. - -Use this option to specify the base directory of a build\-environment -when lcov produces error messages like: - -.RS -ERROR: could not read source file /home/user/project/subdir1/subdir2/subdir1/subdir2/file.c -.RE - -In this example, use /home/user/project as base directory. - -This option is required when using lcov on projects built with libtool or -similar build environments that work with a base directory, i.e. environments, -where the current working directory when invoking the compiler is not the same -directory in which the source code file is located. - -Note that this option will not work in environments where multiple base -directories are used. In that case use configuration file setting -.B geninfo_auto_base=1 -(see -.BR lcovrc (5)). -.RE - -.B \-c -.br -.B \-\-capture -.br -.RS -Capture coverage data. - -By default captures the current kernel execution counts and writes the -resulting coverage data to the standard output. Use the \-\-directory -option to capture counts for a user space program. - -The result of the capture operation will be written to stdout or the tracefile -specified with \-o. - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. -.RE - -.B \-\-checksum -.br -.B \-\-no\-checksum -.br -.RS -Specify whether to generate checksum data when writing tracefiles. - -Use \-\-checksum to enable checksum generation or \-\-no\-checksum to -disable it. Checksum generation is -.B disabled -by default. - -When checksum generation is enabled, a checksum will be generated for each -source code line and stored along with the coverage data. This checksum will -be used to prevent attempts to combine coverage data from different source -code versions. - -If you don't work with different source code versions, disable this option -to speed up coverage data processing and to reduce the size of tracefiles. -.RE - -.B \-\-compat -.IR mode = value [, mode = value ,...] -.br -.RS -Set compatibility mode. - -Use \-\-compat to specify that lcov should enable one or more compatibility -modes when capturing coverage data. You can provide a comma-separated list -of mode=value pairs to specify the values for multiple modes. - -Valid -.I values -are: - -.B on -.RS -Enable compatibility mode. -.RE -.B off -.RS -Disable compatibility mode. -.RE -.B auto -.RS -Apply auto-detection to determine if compatibility mode is required. Note that -auto-detection is not available for all compatibility modes. -.RE - -If no value is specified, 'on' is assumed as default value. - -Valid -.I modes -are: - -.B libtool -.RS -Enable this mode if you are capturing coverage data for a project that -was built using the libtool mechanism. See also -\-\-compat\-libtool. - -The default value for this setting is 'on'. - -.RE -.B hammer -.RS -Enable this mode if you are capturing coverage data for a project that -was built using a version of GCC 3.3 that contains a modification -(hammer patch) of later GCC versions. You can identify a modified GCC 3.3 -by checking the build directory of your project for files ending in the -extension '.bbg'. Unmodified versions of GCC 3.3 name these files '.bb'. - -The default value for this setting is 'auto'. - -.RE -.B split_crc -.RS -Enable this mode if you are capturing coverage data for a project that -was built using a version of GCC 4.6 that contains a modification -(split function checksums) of later GCC versions. Typical error messages -when running lcov on coverage data produced by such GCC versions are -\'out of memory' and 'reached unexpected end of file'. - -The default value for this setting is 'auto' -.RE - -.RE - -.B \-\-compat\-libtool -.br -.B \-\-no\-compat\-libtool -.br -.RS -Specify whether to enable libtool compatibility mode. - -Use \-\-compat\-libtool to enable libtool compatibility mode or \-\-no\-compat\-libtool -to disable it. The libtool compatibility mode is -.B enabled -by default. - -When libtool compatibility mode is enabled, lcov will assume that the source -code relating to a .da file located in a directory named ".libs" can be -found in its parent directory. - -If you have directories named ".libs" in your build environment but don't use -libtool, disable this option to prevent problems when capturing coverage data. -.RE - -.B \-\-config\-file -.I config\-file -.br -.RS -Specify a configuration file to use. - -When this option is specified, neither the system\-wide configuration file -/etc/lcovrc, nor the per\-user configuration file ~/.lcovrc is read. - -This option may be useful when there is a need to run several -instances of -.B lcov -with different configuration file options in parallel. -.RE - -.B \-\-convert\-filenames -.br -.RS -Convert filenames when applying diff. - -Use this option together with \-\-diff to rename the file names of processed -data sets according to the data provided by the diff. -.RE - -.B \-\-diff -.I tracefile -.I difffile -.br -.RS -Convert coverage data in -.I tracefile -using source code diff file -.IR difffile . - -Use this option if you want to merge coverage data from different source code -levels of a program, e.g. when you have data taken from an older version -and want to combine it with data from a more current version. -.B lcov -will try to map source code lines between those versions and adjust the coverage -data respectively. -.I difffile -needs to be in unified format, i.e. it has to be created using the "\-u" option -of the -.B diff -tool. - -Note that lines which are not present in the old version will not be counted -as instrumented, therefore tracefiles resulting from this operation should -not be interpreted individually but together with other tracefiles taken -from the newer version. Also keep in mind that converted coverage data should -only be used for overview purposes as the process itself introduces a loss -of accuracy. - -The result of the diff operation will be written to stdout or the tracefile -specified with \-o. - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. -.RE - -.B \-d -.I directory -.br -.B \-\-directory -.I directory -.br -.RS -Use .da files in -.I directory -instead of kernel. - -If you want to work on coverage data for a user space program, use this -option to specify the location where the program was compiled (that's -where the counter files ending with .da will be stored). - -Note that you may specify this option more than once. -.RE - -.B \-\-external -.br -.B \-\-no\-external -.br -.RS -Specify whether to capture coverage data for external source files. - -External source files are files which are not located in one of the directories -specified by \-\-directory or \-\-base\-directory. Use \-\-external to include -external source files while capturing coverage data or \-\-no\-external to -ignore this data. - -Data for external source files is -.B included -by default. -.RE - -.B \-e -.I tracefile -.I pattern -.br -.B \-\-extract -.I tracefile -.I pattern -.br -.RS -Extract data from -.IR tracefile . - -Use this switch if you want to extract coverage data for only a particular -set of files from a tracefile. Additional command line parameters will be -interpreted as shell wildcard patterns (note that they may need to be -escaped accordingly to prevent the shell from expanding them first). -Every file entry in -.I tracefile -which matches at least one of those patterns will be extracted. - -The result of the extract operation will be written to stdout or the tracefile -specified with \-o. - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. -.RE - -.B \-f -.br -.B \-\-follow -.br -.RS -Follow links when searching for .da files. -.RE - -.B \-\-from\-package -.I package -.br -.RS -Use .da files in -.I package -instead of kernel or directory. - -Use this option if you have separate machines for build and test and -want to perform the .info file creation on the build machine. See -\-\-to\-package for more information. -.RE - -.B \-\-gcov\-tool -.I tool -.br -.RS -Specify the location of the gcov tool. -.RE - -.B \-h -.br -.B \-\-help -.br -.RS -Print a short help text, then exit. -.RE - -.B \-\-ignore\-errors -.I errors -.br -.RS -Specify a list of errors after which to continue processing. - -Use this option to specify a list of one or more classes of errors after which -lcov should continue processing instead of aborting. - -.I errors -can be a comma\-separated list of the following keywords: - -.B gcov: -the gcov tool returned with a non\-zero return code. - -.B source: -the source code file for a data set could not be found. - -.B graph: -the graph file could not be found or is corrupted. -.RE - -.B \-i -.br -.B \-\-initial -.RS -Capture initial zero coverage data. - -Run lcov with \-c and this option on the directories containing .bb, .bbg -or .gcno files before running any test case. The result is a "baseline" -coverage data file that contains zero coverage for every instrumented line. -Combine this data file (using lcov \-a) with coverage data files captured -after a test run to ensure that the percentage of total lines covered is -correct even when not all source code files were loaded during the test. - -Recommended procedure when capturing data for a test case: - -1. create baseline coverage data file -.RS -# lcov \-c \-i \-d appdir \-o app_base.info -.br - -.RE -2. perform test -.RS -# appdir/test -.br - -.RE -3. create test coverage data file -.RS -# lcov \-c \-d appdir \-o app_test.info -.br - -.RE -4. combine baseline and test coverage data -.RS -# lcov \-a app_base.info \-a app_test.info \-o app_total.info -.br - -.RE -.RE - -.B \-k -.I subdirectory -.br -.B \-\-kernel\-directory -.I subdirectory -.br -.RS -Capture kernel coverage data only from -.IR subdirectory . - -Use this option if you don't want to get coverage data for all of the -kernel, but only for specific subdirectories. This option may be specified -more than once. - -Note that you may need to specify the full path to the kernel subdirectory -depending on the version of the kernel gcov support. -.RE - -.B \-l -.I tracefile -.br -.B \-\-list -.I tracefile -.br -.RS -List the contents of the -.IR tracefile . - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. -.RE - -.B \-\-list\-full\-path -.br -.B \-\-no\-list\-full\-path -.br -.RS -Specify whether to show full paths during list operation. - -Use \-\-list\-full\-path to show full paths during list operation -or \-\-no\-list\-full\-path to show shortened paths. Paths are -.B shortened -by default. -.RE - -.B \-\-no\-markers -.br -.RS -Use this option if you want to get coverage data without regard to exclusion -markers in the source code file. See -.BR "geninfo " (1) -for details on exclusion markers. -.RE - -.B \-\-no\-recursion -.br -.RS -Use this option if you want to get coverage data for the specified directory -only without processing subdirectories. -.RE - -.B \-o -.I tracefile -.br -.B \-\-output\-file -.I tracefile -.br -.RS -Write data to -.I tracefile -instead of stdout. - -Specify "\-" as a filename to use the standard output. - -By convention, lcov\-generated coverage data files are called "tracefiles" and -should have the filename extension ".info". -.RE - -.B \-\-path -.I path -.br -.RS -Strip path from filenames when applying diff. - -Use this option together with \-\-diff to tell lcov to disregard the specified -initial path component when matching between tracefile and diff filenames. -.RE - -.B \-q -.br -.B \-\-quiet -.br -.RS -Do not print progress messages. - -This option is implied when no output filename is specified to prevent -progress messages to mess with coverage data which is also printed to -the standard output. -.RE - -.B \-\-rc -.IR keyword = value -.br -.RS -Override a configuration directive. - -Use this option to specify a -.IR keyword = value -statement which overrides the corresponding configuration statement in -the lcovrc configuration file. You can specify this option more than once -to override multiple configuration statements. -See -.BR lcovrc (5) -for a list of available keywords and their meaning. -.RE - -.B \-r -.I tracefile -.I pattern -.br -.B \-\-remove -.I tracefile -.I pattern -.br -.RS -Remove data from -.IR tracefile . - -Use this switch if you want to remove coverage data for a particular -set of files from a tracefile. Additional command line parameters will be -interpreted as shell wildcard patterns (note that they may need to be -escaped accordingly to prevent the shell from expanding them first). -Every file entry in -.I tracefile -which matches at least one of those patterns will be removed. - -The result of the remove operation will be written to stdout or the tracefile -specified with \-o. - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. -.RE - -.B \-\-strip -.I depth -.br -.RS -Strip path components when applying diff. - -Use this option together with \-\-diff to tell lcov to disregard the specified -number of initial directories when matching tracefile and diff filenames. -.RE - -.B \-\-summary -.I tracefile -.br -.RS -Show summary coverage information for the specified tracefile. - -Note that you may specify this option more than once. - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. -.RE - -.B \-t -.I testname -.br -.B \-\-test\-name -.I testname -.br -.RS -Specify test name to be stored in the tracefile. - -This name identifies a coverage data set when more than one data set is merged -into a combined tracefile (see option \-a). - -Valid test names can consist of letters, decimal digits and the underscore -character ("_"). -.RE - -.B \-\-to\-package -.I package -.br -.RS -Store .da files for later processing. - -Use this option if you have separate machines for build and test and -want to perform the .info file creation on the build machine. To do this, -follow these steps: - -On the test machine: -.RS -.br -\- run the test -.br -\- run lcov \-c [\-d directory] \-\-to-package -.I file -.br -\- copy -.I file -to the build machine -.RE -.br - -On the build machine: -.RS -.br -\- run lcov \-c \-\-from-package -.I file -[\-o and other options] -.RE -.br - -This works for both kernel and user space coverage data. Note that you might -have to specify the path to the build directory using \-b with -either \-\-to\-package or \-\-from-package. Note also that the package data -must be converted to a .info file before recompiling the program or it will -become invalid. -.RE - -.B \-v -.br -.B \-\-version -.br -.RS -Print version number, then exit. -.RE - -.B \-z -.br -.B \-\-zerocounters -.br -.RS -Reset all execution counts to zero. - -By default tries to reset kernel execution counts. Use the \-\-directory -option to reset all counters of a user space program. - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. -.RE - -.SH FILES - -.I /etc/lcovrc -.RS -The system\-wide configuration file. -.RE - -.I ~/.lcovrc -.RS -The per\-user configuration file. -.RE - -.SH AUTHOR -Peter Oberparleiter - -.SH SEE ALSO -.BR lcovrc (5), -.BR genhtml (1), -.BR geninfo (1), -.BR genpng (1), -.BR gendesc (1), -.BR gcov (1) diff --git a/utils/lcov-1.11/man/lcovrc.5 b/utils/lcov-1.11/man/lcovrc.5 deleted file mode 100755 index 36a42364..00000000 --- a/utils/lcov-1.11/man/lcovrc.5 +++ /dev/null @@ -1,841 +0,0 @@ -.TH lcovrc 5 "LCOV 1.11" 2014\-05\-23 "User Manuals" - -.SH NAME -lcovrc \- lcov configuration file - -.SH DESCRIPTION -The -.I lcovrc -file contains configuration information for the -.B lcov -code coverage tool (see -.BR lcov (1)). -.br - -The system\-wide configuration file is located at -.IR /etc/lcovrc . -To change settings for a single user, place a customized copy of this file at -location -.IR ~/.lcovrc . -Where available, command\-line options override configuration file settings. - -Lines in a configuration file can either be: -.IP " *" -empty lines or lines consisting only of white space characters. These lines are -ignored. -.IP " *" -comment lines which start with a hash sign ('#'). These are treated like empty -lines and will be ignored. -.IP " *" -statements in the form -.RI ' key " = " value '. -A list of valid statements and their description can be found in -section 'OPTIONS' below. -.PP - -.B Example configuration: -.IP -# -.br -# Example LCOV configuration file -.br -# -.br - -# External style sheet file -.br -#genhtml_css_file = gcov.css -.br - -# Coverage rate limits -.br -genhtml_hi_limit = 90 -.br -genhtml_med_limit = 75 -.br - -# Width of line coverage field in source code view -.br -genhtml_line_field_width = 12 -.br - -# Width of branch coverage field in source code view -.br -genhtml_branch_field_width = 16 -.br - -# Width of overview image -.br -genhtml_overview_width = 80 -.br - -# Resolution of overview navigation -.br -genhtml_nav_resolution = 4 -.br - -# Offset for source code navigation -.br -genhtml_nav_offset = 10 -.br - -# Do not remove unused test descriptions if non\-zero -.br -genhtml_keep_descriptions = 0 -.br - -# Do not remove prefix from directory names if non\-zero -.br -genhtml_no_prefix = 0 -.br - -# Do not create source code view if non\-zero -.br -genhtml_no_source = 0 -.br - -# Specify size of tabs -.br -genhtml_num_spaces = 8 -.br - -# Highlight lines with converted\-only data if non\-zero -.br -genhtml_highlight = 0 -.br - -# Include color legend in HTML output if non\-zero -.br -genhtml_legend = 0 -.br - -# Include HTML file at start of HTML output -.br -#genhtml_html_prolog = prolog.html -.br - -# Include HTML file at end of HTML output -.br -#genhtml_html_epilog = epilog.html -.br - -# Use custom HTML file extension -.br -#genhtml_html_extension = html -.br - -# Compress all generated html files with gzip. -.br -#genhtml_html_gzip = 1 -.br - -# Include sorted overview pages -.br -genhtml_sort = 1 -.br - -# Include function coverage data display -.br -#genhtml_function_coverage = 1 -.br - -# Include branch coverage data display -.br -#genhtml_branch_coverage = 1 -.br - -# Specify the character set of all generated HTML pages -.br -genhtml_charset=UTF\-8 -.br - -# Allow HTML markup in test case description text if non\-zero -.br -genhtml_desc_html=0 -.br - -# Location of the gcov tool -.br -#geninfo_gcov_tool = gcov -.br - -# Adjust test names if non\-zero -.br -#geninfo_adjust_testname = 0 -.br - -# Calculate a checksum for each line if non\-zero -.br -geninfo_checksum = 0 -.br - -# Enable libtool compatibility mode if non\-zero -.br -geninfo_compat_libtool = 0 -.br - -# Specify whether to capture coverage data for external source -.br -# files -.br -#geninfo_external = 1 -.br - -# Use gcov's --all-blocks option if non-zero -.br -#geninfo_gcov_all_blocks = 1 -.br - -# Specify compatiblity modes (same as \-\-compat option -.br -# of geninfo) -.br -#geninfo_compat = libtool=on, hammer=auto, split_crc=auto -.br - -# Adjust path to source files by removing or changing path -.br -# components that match the specified pattern (Perl regular -.br -# expression format) -.br -#geninfo_adjust_src_path = /tmp/build => /usr/src - -# Specify if geninfo should try to automatically determine -.br -# the base-directory when collecting coverage data. -.br -geninfo_auto_base = 1 -.br - -# Directory containing gcov kernel files -.br -lcov_gcov_dir = /proc/gcov -.br - -# Location for temporary directories -.br -lcov_tmp_dir = /tmp -.br - -# Show full paths during list operation if non\-zero -.br -lcov_list_full_path = 0 -.br - -# Specify the maximum width for list output. This value is -.br -# ignored when lcov_list_full_path is non\-zero. -.br -lcov_list_width = 80 -.br - -# Specify the maximum percentage of file names which may be -.br -# truncated when choosing a directory prefix in list output. -.br -# This value is ignored when lcov_list_full_path is non\-zero. -.br -lcov_list_truncate_max = 20 - -# Specify if function coverage data should be collected and -.br -# processed. -.br -lcov_function_coverage = 1 -.br - -# Specify if branch coverage data should be collected and -.br -# processed. -.br -lcov_branch_coverage = 0 -.br -.PP - -.SH OPTIONS - -.BR genhtml_css_file " =" -.I filename -.IP -Specify an external style sheet file. Use this option to modify the appearance of the HTML output as generated by -.BR genhtml . -During output generation, a copy of this file will be placed in the output -directory. -.br - -This option corresponds to the \-\-css\-file command line option of -.BR genhtml . -.br - -By default, a standard CSS file is generated. -.PP - -.BR genhtml_hi_limit " =" -.I hi_limit -.br -.BR genhtml_med_limit " =" -.I med_limit -.br -.IP -Specify coverage rate limits for classifying file entries. Use this option to -modify the coverage rates (in percent) for line, function and branch coverage at -which a result is classified as high, medium or low coverage. This -classification affects the color of the corresponding entries on the overview -pages of the HTML output: -.br - -High: hi_limit <= rate <= 100 default color: green -.br -Medium: med_limit <= rate < hi_limit default color: orange -.br -Low: 0 <= rate < med_limit default color: red -.br - -Defaults are 90 and 75 percent. -.PP - -.BR genhtml_line_field_width " =" -.I number_of_characters -.IP -Specify the width (in characters) of the source code view column containing -line coverage information. -.br - -Default is 12. -.PP - -.BR genhtml_branch_field_width " =" -.I number_of_characters -.IP -Specify the width (in characters) of the source code view column containing -branch coverage information. -.br - -Default is 16. -.PP - -.BR genhtml_overview_width " =" -.I pixel_size -.IP -Specify the width (in pixel) of the overview image created when generating HTML -output using the \-\-frames option of -.BR genhtml . -.br - -Default is 80. -.PP - -.BR genhtml_nav_resolution " =" -.I lines -.IP -Specify the resolution of overview navigation when generating HTML output using -the \-\-frames option of -.BR genhtml . -This number specifies the maximum difference in lines between the position a -user selected from the overview and the position the source code window is -scrolled to. -.br - -Default is 4. -.PP - - -.BR genhtml_nav_offset " =" -.I lines -.IP -Specify the overview navigation line offset as applied when generating HTML -output using the \-\-frames option of -.BR genhtml. -.br - -Clicking a line in the overview image should show the source code view at -a position a bit further up, so that the requested line is not the first -line in the window. This number specifies that offset. -.br - -Default is 10. -.PP - - -.BR genhtml_keep_descriptions " =" -.IR 0 | 1 -.IP -If non\-zero, keep unused test descriptions when generating HTML output using -.BR genhtml . -.br - -This option corresponds to the \-\-keep\-descriptions option of -.BR genhtml . -.br - -Default is 0. -.PP - -.BR genhtml_no_prefix " =" -.IR 0 | 1 -.IP -If non\-zero, do not try to find and remove a common prefix from directory names. -.br - -This option corresponds to the \-\-no\-prefix option of -.BR genhtml . -.br - -Default is 0. -.PP - -.BR genhtml_no_source " =" -.IR 0 | 1 -.IP -If non\-zero, do not create a source code view when generating HTML output using -.BR genhtml . -.br - -This option corresponds to the \-\-no\-source option of -.BR genhtml . -.br - -Default is 0. -.PP - -.BR genhtml_num_spaces " =" -.I num -.IP -Specify the number of spaces to use as replacement for tab characters in the -HTML source code view as generated by -.BR genhtml . -.br - -This option corresponds to the \-\-num\-spaces option of -.BR genthml . -.br - -Default is 8. - -.PP - -.BR genhtml_highlight " =" -.IR 0 | 1 -.IP -If non\-zero, highlight lines with converted\-only data in -HTML output as generated by -.BR genhtml . -.br - -This option corresponds to the \-\-highlight option of -.BR genhtml . -.br - -Default is 0. -.PP - -.BR genhtml_legend " =" -.IR 0 | 1 -.IP -If non\-zero, include a legend explaining the meaning of color coding in the HTML -output as generated by -.BR genhtml . -.br - -This option corresponds to the \-\-legend option of -.BR genhtml . -.br - -Default is 0. -.PP - -.BR genhtml_html_prolog " =" -.I filename -.IP -If set, include the contents of the specified file at the beginning of HTML -output. - -This option corresponds to the \-\-html\-prolog option of -.BR genhtml . -.br - -Default is to use no extra prolog. -.PP - -.BR genhtml_html_epilog " =" -.I filename -.IP -If set, include the contents of the specified file at the end of HTML output. - -This option corresponds to the \-\-html\-epilog option of -.BR genhtml . -.br - -Default is to use no extra epilog. -.PP - -.BR genhtml_html_extension " =" -.I extension -.IP -If set, use the specified string as filename extension for generated HTML files. - -This option corresponds to the \-\-html\-extension option of -.BR genhtml . -.br - -Default extension is "html". -.PP - -.BR genhtml_html_gzip " =" -.IR 0 | 1 -.IP -If set, compress all html files using gzip. - -This option corresponds to the \-\-html\-gzip option of -.BR genhtml . -.br - -Default extension is 0. -.PP - -.BR genhtml_sort " =" -.IR 0 | 1 -.IP -If non\-zero, create overview pages sorted by coverage rates when generating -HTML output using -.BR genhtml . -.br - -This option can be set to 0 by using the \-\-no\-sort option of -.BR genhtml . -.br - -Default is 1. -.PP - -.BR genhtml_function_coverage " =" -.IR 0 | 1 -.IP -If non\-zero, include function coverage data when generating HTML output using -.BR genhtml . -.br - -This option can be set to 0 by using the \-\-no\-function\-coverage option of -.BR genhtml . -.br - -Default is 1. -.PP - -.BR genhtml_branch_coverage " =" -.IR 0 | 1 -.IP -If non\-zero, include branch coverage data when generating HTML output using -.BR genhtml . -.br - -This option can be set to 0 by using the \-\-no\-branch\-coverage option of -.BR genhtml . -.br - -Default is 1. -.PP - -.BR genhtml_charset " =" -.I charset -.IP -Specify the character set of all generated HTML pages. -.br - -Use this option if the source code contains characters which are not -part of the default character set. Note that this option is ignored -when a custom HTML prolog is specified (see also -.BR genhtml_html_prolog ). -.br - -Default is UTF-8. -.PP - -.BR genhtml_desc_html " =" -.IR 0 | 1 -.IP -If non-zero, test case descriptions may contain HTML markup. - -Set this option to one if you want to embed HTML markup (for example to -include links) in test case descriptions. When set to zero, HTML markup -characters will be escaped to show up as plain text on the test case -description page. -.br - -Default is 0. -.PP -. -.BR geninfo_gcov_tool " =" -.I path_to_gcov -.IP -Specify the location of the gcov tool (see -.BR gcov (1)) -which is used to generate coverage information from data files. -.br - -Default is 'gcov'. -.PP - -.BR geninfo_adjust_testname " =" -.IR 0 | 1 -.IP -If non\-zero, adjust test names to include operating system information -when capturing coverage data. -.br - -Default is 0. -.PP - -.BR geninfo_checksum " =" -.IR 0 | 1 -.IP -If non\-zero, generate source code checksums when capturing coverage data. -Checksums are useful to prevent merging coverage data from incompatible -source code versions but checksum generation increases the size of coverage -files and the time used to generate those files. -.br - -This option corresponds to the \-\-checksum and \-\-no\-checksum command line -option of -.BR geninfo . -.br - -Default is 0. -.PP - -.BR geninfo_compat_libtool " =" -.IR 0 | 1 -.IP -If non\-zero, enable libtool compatibility mode. When libtool compatibility -mode is enabled, lcov will assume that the source code relating to a .da file -located in a directory named ".libs" can be found in its parent directory. -.br - -This option corresponds to the \-\-compat\-libtool and \-\-no\-compat\-libtool -command line option of -.BR geninfo . -.br - -Default is 1. -.PP - -.BR geninfo_external " =" -.IR 0 | 1 -.IP -If non\-zero, capture coverage data for external source files. - -External source files are files which are not located in one of the directories -(including sub-directories) -specified by the \-\-directory or \-\-base\-directory options of -.BR lcov / geninfo . - -Default is 1. -.PP - -.BR geninfo_gcov_all_blocks " =" -.IR 0 | 1 -.IP -If non\-zero, call the gcov tool with option --all-blocks. - -Using --all-blocks will produce more detailed branch coverage information for -each line. Set this option to zero if you do not need detailed branch coverage -information to speed up the process of capturing code coverage or to work -around a bug in some versions of gcov which will cause it to endlessly loop -when analysing some files. - -Default is 1. -.PP - -.BR geninfo_compat " =" -.IR mode = value [, mode = value ,...] -.IP -Specify that geninfo should enable one or more compatibility modes -when capturing coverage data. - -This option corresponds to the \-\-compat command line option of -.BR geninfo . - -Default is 'libtool=on, hammer=auto, split_crc=auto'. -.PP - -.BR geninfo_adjust_src_path " =" -.IR pattern " => " replacement -.br -.BR geninfo_adjust_src_path " =" -.I pattern -.IP -Adjust source paths when capturing coverage data. - -Use this option in situations where geninfo cannot find the correct -path to source code files of a project. By providing a -.I pattern -in Perl regular expression format (see -.BR perlre (1)) -and an optional replacement string, you can instruct geninfo to -remove or change parts of the incorrect source path. - -.B Example: -.br - -1. When geninfo reports that it cannot find source file -.br - - /path/to/src/.libs/file.c -.br - -while the file is actually located in -.br - - /path/to/src/file.c -.br - -use the following parameter: -.br - - geninfo_adjust_src_path = /.libs - -This will remove all "/.libs" strings from the path. - -2. When geninfo reports that it cannot find source file -.br - - /tmp/build/file.c -.br - -while the file is actually located in -.br - - /usr/src/file.c -.br - -use the following parameter: -.br - - geninfo_adjust_src_path = /tmp/build => /usr/src -.br - -This will change all "/tmp/build" strings in the path to "/usr/src". -.PP - -.BR geninfo_auto_base " =" -.IR 0 | 1 -.IP -If non\-zero, apply a heuristic to determine the base directory when -collecting coverage data. -.br - -Use this option when using geninfo on projects built with libtool or -similar build environments that work with multiple base directories, -i.e. environments, where the current working directory when invoking the -compiler ist not the same directory in which the source code file is -located, and in addition, is different between files of the same project. -.br - -Default is 1. -.PP - -.BR lcov_gcov_dir " =" -.I path_to_kernel_coverage_data -.IP -Specify the path to the directory where kernel coverage data can be found -or leave undefined for auto-detection. -.br - -Default is auto-detection. -.PP - -.BR lcov_tmp_dir " =" -.I temp -.IP -Specify the location of a directory used for temporary files. -.br - -Default is '/tmp'. -.PP - -.BR lcov_list_full_path " =" -.IR 0 | 1 -.IP -If non-zero, print the full path to source code files during a list operation. -.br - -This option corresponds to the \-\-list\-full\-path option of -.BR lcov . -.br - -Default is 0. -.PP - -.BR lcov_list_max_width " =" -.IR width -.IP -Specify the maximum width for list output. This value is ignored when -lcov_list_full_path is non\-zero. -.br - -Default is 80. -.PP - -.BR lcov_list_truncate_max -.B " =" -.IR percentage -.IP -Specify the maximum percentage of file names which may be truncated when -choosing a directory prefix in list output. This value is ignored when -lcov_list_full_path is non\-zero. -.br - -Default is 20. -.PP - -.BR lcov_function_coverage " =" -.IR 0 | 1 -.IP -Specify whether lcov should handle function coverage data. -.br - -Setting this option to 0 can reduce memory and CPU time consumption -when lcov is collecting and processing coverage data, as well as -reduce the size of the resulting data files. Note that setting -.B genhtml_function_coverage -will override this option for HTML generation. -.br - -Default is 1. -.PP - -.BR lcov_branch_coverage " =" -.IR 0 | 1 -.IP -Specify whether lcov should handle branch coverage data. -.br - -Setting this option to 0 can reduce memory and CPU time consumption -when lcov is collecting and processing coverage data, as well as -reduce the size of the resulting data files. Note that setting -.B genhtml_branch_coverage -will override this option for HTML generation. -.br - -Default is 0. -.PP - -.SH FILES - -.TP -.I /etc/lcovrc -The system\-wide -.B lcov -configuration file. - -.TP -.I ~/.lcovrc -The individual per\-user configuration file. -.PP - -.SH SEE ALSO -.BR lcov (1), -.BR genhtml (1), -.BR geninfo (1), -.BR gcov (1) diff --git a/utils/lcov-1.11/rpm/lcov.spec b/utils/lcov-1.11/rpm/lcov.spec deleted file mode 100755 index 31775205..00000000 --- a/utils/lcov-1.11/rpm/lcov.spec +++ /dev/null @@ -1,51 +0,0 @@ -Summary: A graphical GCOV front-end -Name: lcov -Version: 1.11 -Release: 1 -License: GPL -Group: Development/Tools -URL: http://ltp.sourceforge.net/coverage/lcov.php -Source0: http://downloads.sourceforge.net/ltp/lcov-%{version}.tar.gz -BuildRoot: /var/tmp/%{name}-%{version}-root -BuildArch: noarch -Requires: perl >= 5.8.8 - -%description -LCOV is a graphical front-end for GCC's coverage testing tool gcov. It collects -gcov data for multiple source files and creates HTML pages containing the -source code annotated with coverage information. It also adds overview pages -for easy navigation within the file structure. - -%prep -%setup -q -n lcov-%{version} - -%build -exit 0 - -%install -rm -rf $RPM_BUILD_ROOT -make install PREFIX=$RPM_BUILD_ROOT - -%clean -rm -rf $RPM_BUILD_ROOT - -%files -%defattr(-,root,root) -/usr/bin -/usr/share -/etc - -%changelog -* Mon May 07 2012 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) -- added dependency on perl 5.8.8 for >>& open mode support -* Wed Aug 13 2008 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) -- changed description + summary text -* Mon Aug 20 2007 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) -- fixed "Copyright" tag -* Mon Jul 14 2003 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) -- removed variables for version/release to support source rpm building -- added initial rm command in install section -* Mon Apr 7 2003 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) -- implemented variables for version/release -* Fri Oct 8 2002 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) -- created initial spec file From ed371dcd25c680e073d7e45c0ecb31a8f6ca49dc Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Thu, 8 Oct 2015 20:45:07 -0400 Subject: [PATCH 047/212] push documentation quiet --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 74e4078d..b17f0840 100644 --- a/Makefile.am +++ b/Makefile.am @@ -78,5 +78,5 @@ deploy-docs: docs git config user.name 'Daniel Schauenberg' && git config user.email d@unwiredcouch.com && \ touch . && git add -A . && \ git commit -m "rebuild pages at $(VERSION)" && \ - git push upstream HEAD:gh-pages + git push -q upstream HEAD:gh-pages From e7c32671a72fa977bb54d10eadb67a70cbe2fd7e Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Thu, 8 Oct 2015 20:46:18 -0400 Subject: [PATCH 048/212] update secure env for travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 00d78686..df95ae93 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,4 +18,4 @@ addons: - lcov env: global: - secure: RBqsrKEQwH7g4gFKqIDvMIPctt402mxnW36RYg8X5yRZhAyiiF116m9G514coNDYndbnxtNLhtzMI5Vq+vVcDasXsms52VHedVXWTtJ/GfQo4GrTFaPNblG/WsWhwJqU/kSoldkX1G/rLKz6F+ds0ZCEUPy/4rPFlCF+jUJTR/I= + secure: QIsFsWdOIQiRtaJohAGmFIG5R/HVYxEx3zUnsAQMtiN2xx6mTNwFKSHSMejHLoe3juPXTsh/BhG8KlGZdrbNfYlN1IoCrg3ccnFxUxjojDcOKWEwB1w2+813p3vx2epzeoVUxUhBXMNobEzZKlJIm2lvOTq2tnjzoDDEcn7gLZk= From d48a836df65f9451c2f38efa6993122d33febc0c Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Thu, 8 Oct 2015 20:50:50 -0400 Subject: [PATCH 049/212] add new secure env for travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index df95ae93..03e7b6ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,4 +18,4 @@ addons: - lcov env: global: - secure: QIsFsWdOIQiRtaJohAGmFIG5R/HVYxEx3zUnsAQMtiN2xx6mTNwFKSHSMejHLoe3juPXTsh/BhG8KlGZdrbNfYlN1IoCrg3ccnFxUxjojDcOKWEwB1w2+813p3vx2epzeoVUxUhBXMNobEzZKlJIm2lvOTq2tnjzoDDEcn7gLZk= + - secure: i+h0SxjrHCfvoaXCJ1b+tK0vvNgoLq7Xl/eh34tb3QokacWO+piyLcbSxvz0IcE50ye0x8CyMn2hyyGCgzwHDgaUCmkILS+3y+9E7FC4nYwLvi2mJ2Q9DI1Q5aXhcMXiEYb9b1LjrorUdgs6DcfJVq7ZSU3CawKU/uBtKfC39iQ= From fb928272b7b7c80b6be03fc67140f4374330a380 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Thu, 8 Oct 2015 20:51:14 -0400 Subject: [PATCH 050/212] don't echo the git init commands --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index b17f0840..8e8de71b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -71,7 +71,7 @@ clean-docs: rm -rf ./docs deploy-docs: docs - cd docs && git init && git remote add upstream "https://${GH_TOKEN}@github.com/mrtazz/$(NAME).git" && \ + @cd docs && git init && git remote add upstream "https://${GH_TOKEN}@github.com/mrtazz/$(NAME).git" && \ git submodule add https://github.com/mrtazz/jekyll-layouts.git ./_layouts && \ git submodule update --init && \ git fetch upstream && git reset upstream/gh-pages && \ From a2213b6f7d6c0f56d5fd08f81e9d38c0ef8989fc Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Thu, 8 Oct 2015 21:17:21 -0400 Subject: [PATCH 051/212] download newest lcov instead of using outdated one --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 03e7b6ae..ce6c443f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,8 @@ before_script: - ./utils/build_gtest.sh - gem install coveralls-lcov after_success: +- curl http://ftp.de.debian.org/debian/pool/main/l/lcov/lcov_1.11.orig.tar.gz | tar xz +- export PATH=$PATH:`pwd`/lcov-1.11/bin - make coverage.info - coveralls-lcov coverage.info - test $TRAVIS_PULL_REQUEST == "false" && test $TRAVIS_BRANCH == "master" && make @@ -15,7 +17,6 @@ addons: - build-essential - libcurl4-openssl-dev - doxygen - - lcov env: global: - secure: i+h0SxjrHCfvoaXCJ1b+tK0vvNgoLq7Xl/eh34tb3QokacWO+piyLcbSxvz0IcE50ye0x8CyMn2hyyGCgzwHDgaUCmkILS+3y+9E7FC4nYwLvi2mJ2Q9DI1Q5aXhcMXiEYb9b1LjrorUdgs6DcfJVq7ZSU3CawKU/uBtKfC39iQ= From 3e54e3c2157a5f08825a5e855cba71af118f2b63 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 21 Nov 2015 13:16:16 -0500 Subject: [PATCH 052/212] add MIT license badge fixes #32 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4c415c88..24dcf66c 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ [![Build Status](https://travis-ci.org/mrtazz/restclient-cpp.svg?branch=master)](https://travis-ci.org/mrtazz/restclient-cpp) [![Coverage Status](https://coveralls.io/repos/mrtazz/restclient-cpp/badge.svg?branch=master&service=github)](https://coveralls.io/github/mrtazz/restclient-cpp?branch=master) [![Packagecloud](https://img.shields.io/badge/packagecloud-available-brightgreen.svg)](https://packagecloud.io/mrtazz/restclient-cpp) +[![MIT license](https://img.shields.io/badge/license-MIT-blue.svg)](http://opensource.org/licenses/MIT) + ## About This is a simple REST client for C++. It wraps libcurl for HTTP requests. From 3dd8e023063f8b5b06c88475aea47592f521278a Mon Sep 17 00:00:00 2001 From: Thomas Goetze Date: Fri, 18 Dec 2015 10:14:43 -0800 Subject: [PATCH 053/212] Ensure the built shared library does not have dynamic references to libgtest. See https://github.com/mrtazz/restclient-cpp/issues/34 Since -lgtest is included in the test_program build flags, it is not needed to check for it building the main library. --- configure.ac | 2 -- 1 file changed, 2 deletions(-) diff --git a/configure.ac b/configure.ac index b911afff..4c2d0ee4 100644 --- a/configure.ac +++ b/configure.ac @@ -24,8 +24,6 @@ AS_IF([test "x$restclient_cpp_curl_headers_found" != "xyes"], # Checks for libraries. # FIXME: Replace `main' with a function in `-lcurl': AC_CHECK_LIB([curl], [main]) -# FIXME: Replace `main' with a function in `-lgtest': -AC_CHECK_LIB([gtest], [main]) # Checks for header files. From 73335813b133d80ec0660df78f7f801445244ffd Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 23 Dec 2015 10:21:00 -0500 Subject: [PATCH 054/212] gitignore some generated files in vendor --- .gitignore | 6 + vendor/gtest-1.7.0/build-aux/config.h | 70 - vendor/gtest-1.7.0/build-aux/config.h.in | 69 - vendor/gtest-1.7.0/build-aux/ltmain.sh | 9661 ------------------- vendor/gtest-1.7.0/m4/ltoptions.m4 | 384 - vendor/gtest-1.7.0/m4/ltversion.m4 | 23 - vendor/jsoncpp-0.10.5/dist/.deps/jsoncpp.Po | 545 -- 7 files changed, 6 insertions(+), 10752 deletions(-) delete mode 100644 vendor/gtest-1.7.0/build-aux/config.h delete mode 100644 vendor/gtest-1.7.0/build-aux/config.h.in delete mode 100644 vendor/gtest-1.7.0/build-aux/ltmain.sh delete mode 100644 vendor/gtest-1.7.0/m4/ltoptions.m4 delete mode 100644 vendor/gtest-1.7.0/m4/ltversion.m4 delete mode 100644 vendor/jsoncpp-0.10.5/dist/.deps/jsoncpp.Po diff --git a/.gitignore b/.gitignore index dde92fe0..7c4f2986 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,12 @@ config* *Makefile *Makefile.in vendor/gtest-1.7.0/scripts/gtest-config +vendor/gtest-1.7.0/build-aux/config.h +vendor/gtest-1.7.0/build-aux/config.h.in +vendor/gtest-1.7.0/build-aux/ltmain.sh +vendor/gtest-1.7.0/m4/ltoptions.m4 +vendor/gtest-1.7.0/m4/ltversion.m4 +vendor/jsoncpp-0.10.5/dist/.deps/jsoncpp.Po test-program .libs diff --git a/vendor/gtest-1.7.0/build-aux/config.h b/vendor/gtest-1.7.0/build-aux/config.h deleted file mode 100644 index b43f39b9..00000000 --- a/vendor/gtest-1.7.0/build-aux/config.h +++ /dev/null @@ -1,70 +0,0 @@ -/* build-aux/config.h. Generated from config.h.in by configure. */ -/* build-aux/config.h.in. Generated from configure.ac by autoheader. */ - -/* Define to 1 if you have the header file. */ -#define HAVE_DLFCN_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define if you have POSIX threads libraries and header files. */ -#define HAVE_PTHREAD 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UNISTD_H 1 - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#define LT_OBJDIR ".libs/" - -/* Name of package */ -#define PACKAGE "gtest" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "googletestframework@googlegroups.com" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "Google C++ Testing Framework" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "Google C++ Testing Framework 1.7.0" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "gtest" - -/* Define to the home page for this package. */ -#define PACKAGE_URL "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "1.7.0" - -/* Define to necessary symbol if this constant uses a non-standard name on - your system. */ -/* #undef PTHREAD_CREATE_JOINABLE */ - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Version number of package */ -#define VERSION "1.7.0" diff --git a/vendor/gtest-1.7.0/build-aux/config.h.in b/vendor/gtest-1.7.0/build-aux/config.h.in deleted file mode 100644 index 843b5b10..00000000 --- a/vendor/gtest-1.7.0/build-aux/config.h.in +++ /dev/null @@ -1,69 +0,0 @@ -/* build-aux/config.h.in. Generated from configure.ac by autoheader. */ - -/* Define to 1 if you have the header file. */ -#undef HAVE_DLFCN_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define if you have POSIX threads libraries and header files. */ -#undef HAVE_PTHREAD - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#undef LT_OBJDIR - -/* Name of package */ -#undef PACKAGE - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the home page for this package. */ -#undef PACKAGE_URL - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* Define to necessary symbol if this constant uses a non-standard name on - your system. */ -#undef PTHREAD_CREATE_JOINABLE - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Version number of package */ -#undef VERSION diff --git a/vendor/gtest-1.7.0/build-aux/ltmain.sh b/vendor/gtest-1.7.0/build-aux/ltmain.sh deleted file mode 100644 index c2852d85..00000000 --- a/vendor/gtest-1.7.0/build-aux/ltmain.sh +++ /dev/null @@ -1,9661 +0,0 @@ - -# libtool (GNU libtool) 2.4.2 -# Written by Gordon Matzigkeit , 1996 - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, -# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# GNU Libtool is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, -# or obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -# Usage: $progname [OPTION]... [MODE-ARG]... -# -# Provide generalized library-building support services. -# -# --config show all configuration variables -# --debug enable verbose shell tracing -# -n, --dry-run display commands without modifying any files -# --features display basic configuration information and exit -# --mode=MODE use operation mode MODE -# --preserve-dup-deps don't remove duplicate dependency libraries -# --quiet, --silent don't print informational messages -# --no-quiet, --no-silent -# print informational messages (default) -# --no-warn don't display warning messages -# --tag=TAG use configuration variables from tag TAG -# -v, --verbose print more informational messages than default -# --no-verbose don't print the extra informational messages -# --version print version information -# -h, --help, --help-all print short, long, or detailed help message -# -# MODE must be one of the following: -# -# clean remove files from the build directory -# compile compile a source file into a libtool object -# execute automatically set library path, then run a program -# finish complete the installation of libtool libraries -# install install libraries or executables -# link create a library or an executable -# uninstall remove libraries from an installed directory -# -# MODE-ARGS vary depending on the MODE. When passed as first option, -# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. -# Try `$progname --help --mode=MODE' for a more detailed description of MODE. -# -# When reporting a bug, please describe a test case to reproduce it and -# include the following information: -# -# host-triplet: $host -# shell: $SHELL -# compiler: $LTCC -# compiler flags: $LTCFLAGS -# linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu1 -# automake: $automake_version -# autoconf: $autoconf_version -# -# Report bugs to . -# GNU libtool home page: . -# General help using GNU software: . - -PROGRAM=libtool -PACKAGE=libtool -VERSION="2.4.2 Debian-2.4.2-1ubuntu1" -TIMESTAMP="" -package_revision=1.3337 - -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' -} - -# NLS nuisances: We save the old values to restore during execute mode. -lt_user_locale= -lt_safe_locale= -for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES -do - eval "if test \"\${$lt_var+set}\" = set; then - save_$lt_var=\$$lt_var - $lt_var=C - export $lt_var - lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" - lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" - fi" -done -LC_ALL=C -LANGUAGE=C -export LANGUAGE LC_ALL - -$lt_unset CDPATH - - -# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh -# is ksh but when the shell is invoked as "sh" and the current value of -# the _XPG environment variable is not equal to 1 (one), the special -# positional parameter $0, within a function call, is the name of the -# function. -progpath="$0" - - - -: ${CP="cp -f"} -test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} -: ${MAKE="make"} -: ${MKDIR="mkdir"} -: ${MV="mv -f"} -: ${RM="rm -f"} -: ${SHELL="${CONFIG_SHELL-/bin/sh}"} -: ${Xsed="$SED -e 1s/^X//"} - -# Global variables: -EXIT_SUCCESS=0 -EXIT_FAILURE=1 -EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. -EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. - -exit_status=$EXIT_SUCCESS - -# Make sure IFS has a sensible default -lt_nl=' -' -IFS=" $lt_nl" - -dirname="s,/[^/]*$,," -basename="s,^.*/,," - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi -} # func_dirname may be replaced by extended shell implementation - - -# func_basename file -func_basename () -{ - func_basename_result=`$ECHO "${1}" | $SED "$basename"` -} # func_basename may be replaced by extended shell implementation - - -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi - func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` -} # func_dirname_and_basename may be replaced by extended shell implementation - - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# func_strip_suffix prefix name -func_stripname () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname may be replaced by extended shell implementation - - -# These SED scripts presuppose an absolute path with a trailing slash. -pathcar='s,^/\([^/]*\).*$,\1,' -pathcdr='s,^/[^/]*,,' -removedotparts=':dotsl - s@/\./@/@g - t dotsl - s,/\.$,/,' -collapseslashes='s@/\{1,\}@/@g' -finalslash='s,/*$,/,' - -# func_normal_abspath PATH -# Remove doubled-up and trailing slashes, "." path components, -# and cancel out any ".." path components in PATH after making -# it an absolute path. -# value returned in "$func_normal_abspath_result" -func_normal_abspath () -{ - # Start from root dir and reassemble the path. - func_normal_abspath_result= - func_normal_abspath_tpath=$1 - func_normal_abspath_altnamespace= - case $func_normal_abspath_tpath in - "") - # Empty path, that just means $cwd. - func_stripname '' '/' "`pwd`" - func_normal_abspath_result=$func_stripname_result - return - ;; - # The next three entries are used to spot a run of precisely - # two leading slashes without using negated character classes; - # we take advantage of case's first-match behaviour. - ///*) - # Unusual form of absolute path, do nothing. - ;; - //*) - # Not necessarily an ordinary path; POSIX reserves leading '//' - # and for example Cygwin uses it to access remote file shares - # over CIFS/SMB, so we conserve a leading double slash if found. - func_normal_abspath_altnamespace=/ - ;; - /*) - # Absolute path, do nothing. - ;; - *) - # Relative path, prepend $cwd. - func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath - ;; - esac - # Cancel out all the simple stuff to save iterations. We also want - # the path to end with a slash for ease of parsing, so make sure - # there is one (and only one) here. - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` - while :; do - # Processed it all yet? - if test "$func_normal_abspath_tpath" = / ; then - # If we ascended to the root using ".." the result may be empty now. - if test -z "$func_normal_abspath_result" ; then - func_normal_abspath_result=/ - fi - break - fi - func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$pathcar"` - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$pathcdr"` - # Figure out what to do with it - case $func_normal_abspath_tcomponent in - "") - # Trailing empty path component, ignore it. - ;; - ..) - # Parent dir; strip last assembled component from result. - func_dirname "$func_normal_abspath_result" - func_normal_abspath_result=$func_dirname_result - ;; - *) - # Actual path component, append it. - func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent - ;; - esac - done - # Restore leading double-slash if one was found on entry. - func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result -} - -# func_relative_path SRCDIR DSTDIR -# generates a relative path from SRCDIR to DSTDIR, with a trailing -# slash if non-empty, suitable for immediately appending a filename -# without needing to append a separator. -# value returned in "$func_relative_path_result" -func_relative_path () -{ - func_relative_path_result= - func_normal_abspath "$1" - func_relative_path_tlibdir=$func_normal_abspath_result - func_normal_abspath "$2" - func_relative_path_tbindir=$func_normal_abspath_result - - # Ascend the tree starting from libdir - while :; do - # check if we have found a prefix of bindir - case $func_relative_path_tbindir in - $func_relative_path_tlibdir) - # found an exact match - func_relative_path_tcancelled= - break - ;; - $func_relative_path_tlibdir*) - # found a matching prefix - func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" - func_relative_path_tcancelled=$func_stripname_result - if test -z "$func_relative_path_result"; then - func_relative_path_result=. - fi - break - ;; - *) - func_dirname $func_relative_path_tlibdir - func_relative_path_tlibdir=${func_dirname_result} - if test "x$func_relative_path_tlibdir" = x ; then - # Have to descend all the way to the root! - func_relative_path_result=../$func_relative_path_result - func_relative_path_tcancelled=$func_relative_path_tbindir - break - fi - func_relative_path_result=../$func_relative_path_result - ;; - esac - done - - # Now calculate path; take care to avoid doubling-up slashes. - func_stripname '' '/' "$func_relative_path_result" - func_relative_path_result=$func_stripname_result - func_stripname '/' '/' "$func_relative_path_tcancelled" - if test "x$func_stripname_result" != x ; then - func_relative_path_result=${func_relative_path_result}/${func_stripname_result} - fi - - # Normalisation. If bindir is libdir, return empty string, - # else relative path ending with a slash; either way, target - # file name can be directly appended. - if test ! -z "$func_relative_path_result"; then - func_stripname './' '' "$func_relative_path_result/" - func_relative_path_result=$func_stripname_result - fi -} - -# The name of this program: -func_dirname_and_basename "$progpath" -progname=$func_basename_result - -# Make sure we have an absolute path for reexecution: -case $progpath in - [\\/]*|[A-Za-z]:\\*) ;; - *[\\/]*) - progdir=$func_dirname_result - progdir=`cd "$progdir" && pwd` - progpath="$progdir/$progname" - ;; - *) - save_IFS="$IFS" - IFS=${PATH_SEPARATOR-:} - for progdir in $PATH; do - IFS="$save_IFS" - test -x "$progdir/$progname" && break - done - IFS="$save_IFS" - test -n "$progdir" || progdir=`pwd` - progpath="$progdir/$progname" - ;; -esac - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed="${SED}"' -e 1s/^X//' -sed_quote_subst='s/\([`"$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution that turns a string into a regex matching for the -# string literally. -sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' - -# Sed substitution that converts a w32 file name or path -# which contains forward slashes, into one that contains -# (escaped) backslashes. A very naive implementation. -lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - -# Re-`\' parameter expansions in output of double_quote_subst that were -# `\'-ed in input to the same. If an odd number of `\' preceded a '$' -# in input to double_quote_subst, that '$' was protected from expansion. -# Since each input `\' is now two `\'s, look for any number of runs of -# four `\'s followed by two `\'s and then a '$'. `\' that '$'. -bs='\\' -bs2='\\\\' -bs4='\\\\\\\\' -dollar='\$' -sed_double_backslash="\ - s/$bs4/&\\ -/g - s/^$bs2$dollar/$bs&/ - s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g - s/\n//g" - -# Standard options: -opt_dry_run=false -opt_help=false -opt_quiet=false -opt_verbose=false -opt_warning=: - -# func_echo arg... -# Echo program name prefixed message, along with the current mode -# name if it has been set yet. -func_echo () -{ - $ECHO "$progname: ${opt_mode+$opt_mode: }$*" -} - -# func_verbose arg... -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $opt_verbose && func_echo ${1+"$@"} - - # A bug in bash halts the script if the last line of a function - # fails when set -e is in force, so we need another command to - # work around that: - : -} - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - -# func_error arg... -# Echo program name prefixed message to standard error. -func_error () -{ - $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 -} - -# func_warning arg... -# Echo program name prefixed warning message to standard error. -func_warning () -{ - $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 - - # bash bug again: - : -} - -# func_fatal_error arg... -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () -{ - func_error ${1+"$@"} - exit $EXIT_FAILURE -} - -# func_fatal_help arg... -# Echo program name prefixed message to standard error, followed by -# a help hint, and exit. -func_fatal_help () -{ - func_error ${1+"$@"} - func_fatal_error "$help" -} -help="Try \`$progname --help' for more information." ## default - - -# func_grep expression filename -# Check whether EXPRESSION matches any line of FILENAME, without output. -func_grep () -{ - $GREP "$1" "$2" >/dev/null 2>&1 -} - - -# func_mkdir_p directory-path -# Make sure the entire path to DIRECTORY-PATH is available. -func_mkdir_p () -{ - my_directory_path="$1" - my_dir_list= - - if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then - - # Protect directory names starting with `-' - case $my_directory_path in - -*) my_directory_path="./$my_directory_path" ;; - esac - - # While some portion of DIR does not yet exist... - while test ! -d "$my_directory_path"; do - # ...make a list in topmost first order. Use a colon delimited - # list incase some portion of path contains whitespace. - my_dir_list="$my_directory_path:$my_dir_list" - - # If the last portion added has no slash in it, the list is done - case $my_directory_path in */*) ;; *) break ;; esac - - # ...otherwise throw away the child directory and loop - my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` - done - my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` - - save_mkdir_p_IFS="$IFS"; IFS=':' - for my_dir in $my_dir_list; do - IFS="$save_mkdir_p_IFS" - # mkdir can fail with a `File exist' error if two processes - # try to create one of the directories concurrently. Don't - # stop in that case! - $MKDIR "$my_dir" 2>/dev/null || : - done - IFS="$save_mkdir_p_IFS" - - # Bail out if we (or some other process) failed to create a directory. - test -d "$my_directory_path" || \ - func_fatal_error "Failed to create \`$1'" - fi -} - - -# func_mktempdir [string] -# Make a temporary directory that won't clash with other running -# libtool processes, and avoids race conditions if possible. If -# given, STRING is the basename for that directory. -func_mktempdir () -{ - my_template="${TMPDIR-/tmp}/${1-$progname}" - - if test "$opt_dry_run" = ":"; then - # Return a directory name, but don't create it in dry-run mode - my_tmpdir="${my_template}-$$" - else - - # If mktemp works, use that first and foremost - my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` - - if test ! -d "$my_tmpdir"; then - # Failing that, at least try and use $RANDOM to avoid a race - my_tmpdir="${my_template}-${RANDOM-0}$$" - - save_mktempdir_umask=`umask` - umask 0077 - $MKDIR "$my_tmpdir" - umask $save_mktempdir_umask - fi - - # If we're not in dry-run mode, bomb out on failure - test -d "$my_tmpdir" || \ - func_fatal_error "cannot create temporary directory \`$my_tmpdir'" - fi - - $ECHO "$my_tmpdir" -} - - -# func_quote_for_eval arg -# Aesthetically quote ARG to be evaled later. -# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT -# is double-quoted, suitable for a subsequent eval, whereas -# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters -# which are still active within double quotes backslashified. -func_quote_for_eval () -{ - case $1 in - *[\\\`\"\$]*) - func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; - *) - func_quote_for_eval_unquoted_result="$1" ;; - esac - - case $func_quote_for_eval_unquoted_result in - # Double-quote args containing shell metacharacters to delay - # word splitting, command substitution and and variable - # expansion for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" - ;; - *) - func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" - esac -} - - -# func_quote_for_expand arg -# Aesthetically quote ARG to be evaled later; same as above, -# but do not quote variable references. -func_quote_for_expand () -{ - case $1 in - *[\\\`\"]*) - my_arg=`$ECHO "$1" | $SED \ - -e "$double_quote_subst" -e "$sed_double_backslash"` ;; - *) - my_arg="$1" ;; - esac - - case $my_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting and command substitution for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - my_arg="\"$my_arg\"" - ;; - esac - - func_quote_for_expand_result="$my_arg" -} - - -# func_show_eval cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. -func_show_eval () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$my_cmd" - my_status=$? - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - - -# func_show_eval_locale cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. Use the saved locale for evaluation. -func_show_eval_locale () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$lt_user_locale - $my_cmd" - my_status=$? - eval "$lt_safe_locale" - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - -# func_tr_sh -# Turn $1 into a string suitable for a shell variable name. -# Result is stored in $func_tr_sh_result. All characters -# not in the set a-zA-Z0-9_ are replaced with '_'. Further, -# if $1 begins with a digit, a '_' is prepended as well. -func_tr_sh () -{ - case $1 in - [0-9]* | *[!a-zA-Z0-9_]*) - func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` - ;; - * ) - func_tr_sh_result=$1 - ;; - esac -} - - -# func_version -# Echo version message to standard output and exit. -func_version () -{ - $opt_debug - - $SED -n '/(C)/!b go - :more - /\./!{ - N - s/\n# / / - b more - } - :go - /^# '$PROGRAM' (GNU /,/# warranty; / { - s/^# // - s/^# *$// - s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ - p - }' < "$progpath" - exit $? -} - -# func_usage -# Echo short help message to standard output and exit. -func_usage () -{ - $opt_debug - - $SED -n '/^# Usage:/,/^# *.*--help/ { - s/^# // - s/^# *$// - s/\$progname/'$progname'/ - p - }' < "$progpath" - echo - $ECHO "run \`$progname --help | more' for full usage" - exit $? -} - -# func_help [NOEXIT] -# Echo long help message to standard output and exit, -# unless 'noexit' is passed as argument. -func_help () -{ - $opt_debug - - $SED -n '/^# Usage:/,/# Report bugs to/ { - :print - s/^# // - s/^# *$// - s*\$progname*'$progname'* - s*\$host*'"$host"'* - s*\$SHELL*'"$SHELL"'* - s*\$LTCC*'"$LTCC"'* - s*\$LTCFLAGS*'"$LTCFLAGS"'* - s*\$LD*'"$LD"'* - s/\$with_gnu_ld/'"$with_gnu_ld"'/ - s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ - s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ - p - d - } - /^# .* home page:/b print - /^# General help using/b print - ' < "$progpath" - ret=$? - if test -z "$1"; then - exit $ret - fi -} - -# func_missing_arg argname -# Echo program name prefixed message to standard error and set global -# exit_cmd. -func_missing_arg () -{ - $opt_debug - - func_error "missing argument for $1." - exit_cmd=exit -} - - -# func_split_short_opt shortopt -# Set func_split_short_opt_name and func_split_short_opt_arg shell -# variables after splitting SHORTOPT after the 2nd character. -func_split_short_opt () -{ - my_sed_short_opt='1s/^\(..\).*$/\1/;q' - my_sed_short_rest='1s/^..\(.*\)$/\1/;q' - - func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` - func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` -} # func_split_short_opt may be replaced by extended shell implementation - - -# func_split_long_opt longopt -# Set func_split_long_opt_name and func_split_long_opt_arg shell -# variables after splitting LONGOPT at the `=' sign. -func_split_long_opt () -{ - my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' - my_sed_long_arg='1s/^--[^=]*=//' - - func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` - func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` -} # func_split_long_opt may be replaced by extended shell implementation - -exit_cmd=: - - - - - -magic="%%%MAGIC variable%%%" -magic_exe="%%%MAGIC EXE variable%%%" - -# Global variables. -nonopt= -preserve_args= -lo2o="s/\\.lo\$/.${objext}/" -o2lo="s/\\.${objext}\$/.lo/" -extracted_archives= -extracted_serial=0 - -# If this variable is set in any of the actions, the command in it -# will be execed at the end. This prevents here-documents from being -# left over by shells. -exec_cmd= - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "${1}=\$${1}\${2}" -} # func_append may be replaced by extended shell implementation - -# func_append_quoted var value -# Quote VALUE and append to the end of shell variable VAR, separated -# by a space. -func_append_quoted () -{ - func_quote_for_eval "${2}" - eval "${1}=\$${1}\\ \$func_quote_for_eval_result" -} # func_append_quoted may be replaced by extended shell implementation - - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=`expr "${@}"` -} # func_arith may be replaced by extended shell implementation - - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` -} # func_len may be replaced by extended shell implementation - - -# func_lo2o object -func_lo2o () -{ - func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` -} # func_lo2o may be replaced by extended shell implementation - - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` -} # func_xform may be replaced by extended shell implementation - - -# func_fatal_configuration arg... -# Echo program name prefixed message to standard error, followed by -# a configuration failure hint, and exit. -func_fatal_configuration () -{ - func_error ${1+"$@"} - func_error "See the $PACKAGE documentation for more information." - func_fatal_error "Fatal configuration error." -} - - -# func_config -# Display the configuration for all the tags in this script. -func_config () -{ - re_begincf='^# ### BEGIN LIBTOOL' - re_endcf='^# ### END LIBTOOL' - - # Default configuration. - $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" - - # Now print the configurations for the tags. - for tagname in $taglist; do - $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" - done - - exit $? -} - -# func_features -# Display the features supported by this script. -func_features () -{ - echo "host: $host" - if test "$build_libtool_libs" = yes; then - echo "enable shared libraries" - else - echo "disable shared libraries" - fi - if test "$build_old_libs" = yes; then - echo "enable static libraries" - else - echo "disable static libraries" - fi - - exit $? -} - -# func_enable_tag tagname -# Verify that TAGNAME is valid, and either flag an error and exit, or -# enable the TAGNAME tag. We also add TAGNAME to the global $taglist -# variable here. -func_enable_tag () -{ - # Global variable: - tagname="$1" - - re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" - re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" - sed_extractcf="/$re_begincf/,/$re_endcf/p" - - # Validate tagname. - case $tagname in - *[!-_A-Za-z0-9,/]*) - func_fatal_error "invalid tag name: $tagname" - ;; - esac - - # Don't test for the "default" C tag, as we know it's - # there but not specially marked. - case $tagname in - CC) ;; - *) - if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then - taglist="$taglist $tagname" - - # Evaluate the configuration. Be careful to quote the path - # and the sed script, to avoid splitting on whitespace, but - # also don't use non-portable quotes within backquotes within - # quotes we have to do it in 2 steps: - extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` - eval "$extractedcf" - else - func_error "ignoring unknown tag $tagname" - fi - ;; - esac -} - -# func_check_version_match -# Ensure that we are using m4 macros, and libtool script from the same -# release of libtool. -func_check_version_match () -{ - if test "$package_revision" != "$macro_revision"; then - if test "$VERSION" != "$macro_version"; then - if test -z "$macro_version"; then - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from an older release. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - fi - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, -$progname: but the definition of this LT_INIT comes from revision $macro_revision. -$progname: You should recreate aclocal.m4 with macros from revision $package_revision -$progname: of $PACKAGE $VERSION and run autoconf again. -_LT_EOF - fi - - exit $EXIT_MISMATCH - fi -} - - -# Shorthand for --mode=foo, only valid as the first argument -case $1 in -clean|clea|cle|cl) - shift; set dummy --mode clean ${1+"$@"}; shift - ;; -compile|compil|compi|comp|com|co|c) - shift; set dummy --mode compile ${1+"$@"}; shift - ;; -execute|execut|execu|exec|exe|ex|e) - shift; set dummy --mode execute ${1+"$@"}; shift - ;; -finish|finis|fini|fin|fi|f) - shift; set dummy --mode finish ${1+"$@"}; shift - ;; -install|instal|insta|inst|ins|in|i) - shift; set dummy --mode install ${1+"$@"}; shift - ;; -link|lin|li|l) - shift; set dummy --mode link ${1+"$@"}; shift - ;; -uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) - shift; set dummy --mode uninstall ${1+"$@"}; shift - ;; -esac - - - -# Option defaults: -opt_debug=: -opt_dry_run=false -opt_config=false -opt_preserve_dup_deps=false -opt_features=false -opt_finish=false -opt_help=false -opt_help_all=false -opt_silent=: -opt_warning=: -opt_verbose=: -opt_silent=false -opt_verbose=false - - -# Parse options once, thoroughly. This comes as soon as possible in the -# script to make things like `--version' happen as quickly as we can. -{ - # this just eases exit handling - while test $# -gt 0; do - opt="$1" - shift - case $opt in - --debug|-x) opt_debug='set -x' - func_echo "enabling shell trace mode" - $opt_debug - ;; - --dry-run|--dryrun|-n) - opt_dry_run=: - ;; - --config) - opt_config=: -func_config - ;; - --dlopen|-dlopen) - optarg="$1" - opt_dlopen="${opt_dlopen+$opt_dlopen -}$optarg" - shift - ;; - --preserve-dup-deps) - opt_preserve_dup_deps=: - ;; - --features) - opt_features=: -func_features - ;; - --finish) - opt_finish=: -set dummy --mode finish ${1+"$@"}; shift - ;; - --help) - opt_help=: - ;; - --help-all) - opt_help_all=: -opt_help=': help-all' - ;; - --mode) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_mode="$optarg" -case $optarg in - # Valid mode arguments: - clean|compile|execute|finish|install|link|relink|uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $opt" - exit_cmd=exit - break - ;; -esac - shift - ;; - --no-silent|--no-quiet) - opt_silent=false -func_append preserve_args " $opt" - ;; - --no-warning|--no-warn) - opt_warning=false -func_append preserve_args " $opt" - ;; - --no-verbose) - opt_verbose=false -func_append preserve_args " $opt" - ;; - --silent|--quiet) - opt_silent=: -func_append preserve_args " $opt" - opt_verbose=false - ;; - --verbose|-v) - opt_verbose=: -func_append preserve_args " $opt" -opt_silent=false - ;; - --tag) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_tag="$optarg" -func_append preserve_args " $opt $optarg" -func_enable_tag "$optarg" - shift - ;; - - -\?|-h) func_usage ;; - --help) func_help ;; - --version) func_version ;; - - # Separate optargs to long options: - --*=*) - func_split_long_opt "$opt" - set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} - shift - ;; - - # Separate non-argument short options: - -\?*|-h*|-n*|-v*) - func_split_short_opt "$opt" - set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - --) break ;; - -*) func_fatal_help "unrecognized option \`$opt'" ;; - *) set dummy "$opt" ${1+"$@"}; shift; break ;; - esac - done - - # Validate options: - - # save first non-option argument - if test "$#" -gt 0; then - nonopt="$opt" - shift - fi - - # preserve --debug - test "$opt_debug" = : || func_append preserve_args " --debug" - - case $host in - *cygwin* | *mingw* | *pw32* | *cegcc*) - # don't eliminate duplications in $postdeps and $predeps - opt_duplicate_compiler_generated_deps=: - ;; - *) - opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps - ;; - esac - - $opt_help || { - # Sanity checks first: - func_check_version_match - - if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - func_fatal_configuration "not configured to build any kind of library" - fi - - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$opt_dlopen" && test "$opt_mode" != execute; then - func_error "unrecognized option \`-dlopen'" - $ECHO "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$progname --help --mode=$opt_mode' for more information." - } - - - # Bail if the options were screwed - $exit_cmd $EXIT_FAILURE -} - - - - -## ----------- ## -## Main. ## -## ----------- ## - -# func_lalib_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_lalib_p () -{ - test -f "$1" && - $SED -e 4q "$1" 2>/dev/null \ - | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 -} - -# func_lalib_unsafe_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function implements the same check as func_lalib_p without -# resorting to external programs. To this end, it redirects stdin and -# closes it afterwards, without saving the original file descriptor. -# As a safety measure, use it only where a negative result would be -# fatal anyway. Works if `file' does not exist. -func_lalib_unsafe_p () -{ - lalib_p=no - if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then - for lalib_p_l in 1 2 3 4 - do - read lalib_p_line - case "$lalib_p_line" in - \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; - esac - done - exec 0<&5 5<&- - fi - test "$lalib_p" = yes -} - -# func_ltwrapper_script_p file -# True iff FILE is a libtool wrapper script -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_script_p () -{ - func_lalib_p "$1" -} - -# func_ltwrapper_executable_p file -# True iff FILE is a libtool wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_executable_p () -{ - func_ltwrapper_exec_suffix= - case $1 in - *.exe) ;; - *) func_ltwrapper_exec_suffix=.exe ;; - esac - $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 -} - -# func_ltwrapper_scriptname file -# Assumes file is an ltwrapper_executable -# uses $file to determine the appropriate filename for a -# temporary ltwrapper_script. -func_ltwrapper_scriptname () -{ - func_dirname_and_basename "$1" "" "." - func_stripname '' '.exe' "$func_basename_result" - func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" -} - -# func_ltwrapper_p file -# True iff FILE is a libtool wrapper script or wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_p () -{ - func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" -} - - -# func_execute_cmds commands fail_cmd -# Execute tilde-delimited COMMANDS. -# If FAIL_CMD is given, eval that upon failure. -# FAIL_CMD may read-access the current command in variable CMD! -func_execute_cmds () -{ - $opt_debug - save_ifs=$IFS; IFS='~' - for cmd in $1; do - IFS=$save_ifs - eval cmd=\"$cmd\" - func_show_eval "$cmd" "${2-:}" - done - IFS=$save_ifs -} - - -# func_source file -# Source FILE, adding directory component if necessary. -# Note that it is not necessary on cygwin/mingw to append a dot to -# FILE even if both FILE and FILE.exe exist: automatic-append-.exe -# behavior happens only for exec(3), not for open(2)! Also, sourcing -# `FILE.' does not work on cygwin managed mounts. -func_source () -{ - $opt_debug - case $1 in - */* | *\\*) . "$1" ;; - *) . "./$1" ;; - esac -} - - -# func_resolve_sysroot PATH -# Replace a leading = in PATH with a sysroot. Store the result into -# func_resolve_sysroot_result -func_resolve_sysroot () -{ - func_resolve_sysroot_result=$1 - case $func_resolve_sysroot_result in - =*) - func_stripname '=' '' "$func_resolve_sysroot_result" - func_resolve_sysroot_result=$lt_sysroot$func_stripname_result - ;; - esac -} - -# func_replace_sysroot PATH -# If PATH begins with the sysroot, replace it with = and -# store the result into func_replace_sysroot_result. -func_replace_sysroot () -{ - case "$lt_sysroot:$1" in - ?*:"$lt_sysroot"*) - func_stripname "$lt_sysroot" '' "$1" - func_replace_sysroot_result="=$func_stripname_result" - ;; - *) - # Including no sysroot. - func_replace_sysroot_result=$1 - ;; - esac -} - -# func_infer_tag arg -# Infer tagged configuration to use if any are available and -# if one wasn't chosen via the "--tag" command line option. -# Only attempt this if the compiler in the base compile -# command doesn't match the default compiler. -# arg is usually of the form 'gcc ...' -func_infer_tag () -{ - $opt_debug - if test -n "$available_tags" && test -z "$tagname"; then - CC_quoted= - for arg in $CC; do - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case $@ in - # Blanks in the command may have been stripped by the calling shell, - # but not from the CC environment variable when configure was run. - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; - # Blanks at the start of $base_compile will cause this to fail - # if we don't check for them as well. - *) - for z in $available_tags; do - if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" - CC_quoted= - for arg in $CC; do - # Double-quote args containing other shell metacharacters. - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case "$@ " in - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) - # The compiler in the base compile command matches - # the one in the tagged configuration. - # Assume this is the tagged configuration we want. - tagname=$z - break - ;; - esac - fi - done - # If $tagname still isn't set, then no tagged configuration - # was found and let the user know that the "--tag" command - # line option must be used. - if test -z "$tagname"; then - func_echo "unable to infer tagged configuration" - func_fatal_error "specify a tag with \`--tag'" -# else -# func_verbose "using $tagname tagged configuration" - fi - ;; - esac - fi -} - - - -# func_write_libtool_object output_name pic_name nonpic_name -# Create a libtool object file (analogous to a ".la" file), -# but don't create it if we're doing a dry run. -func_write_libtool_object () -{ - write_libobj=${1} - if test "$build_libtool_libs" = yes; then - write_lobj=\'${2}\' - else - write_lobj=none - fi - - if test "$build_old_libs" = yes; then - write_oldobj=\'${3}\' - else - write_oldobj=none - fi - - $opt_dry_run || { - cat >${write_libobj}T </dev/null` - if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then - func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | - $SED -e "$lt_sed_naive_backslashify"` - else - func_convert_core_file_wine_to_w32_result= - fi - fi -} -# end: func_convert_core_file_wine_to_w32 - - -# func_convert_core_path_wine_to_w32 ARG -# Helper function used by path conversion functions when $build is *nix, and -# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly -# configured wine environment available, with the winepath program in $build's -# $PATH. Assumes ARG has no leading or trailing path separator characters. -# -# ARG is path to be converted from $build format to win32. -# Result is available in $func_convert_core_path_wine_to_w32_result. -# Unconvertible file (directory) names in ARG are skipped; if no directory names -# are convertible, then the result may be empty. -func_convert_core_path_wine_to_w32 () -{ - $opt_debug - # unfortunately, winepath doesn't convert paths, only file names - func_convert_core_path_wine_to_w32_result="" - if test -n "$1"; then - oldIFS=$IFS - IFS=: - for func_convert_core_path_wine_to_w32_f in $1; do - IFS=$oldIFS - func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" - if test -n "$func_convert_core_file_wine_to_w32_result" ; then - if test -z "$func_convert_core_path_wine_to_w32_result"; then - func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" - else - func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" - fi - fi - done - IFS=$oldIFS - fi -} -# end: func_convert_core_path_wine_to_w32 - - -# func_cygpath ARGS... -# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when -# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) -# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or -# (2), returns the Cygwin file name or path in func_cygpath_result (input -# file name or path is assumed to be in w32 format, as previously converted -# from $build's *nix or MSYS format). In case (3), returns the w32 file name -# or path in func_cygpath_result (input file name or path is assumed to be in -# Cygwin format). Returns an empty string on error. -# -# ARGS are passed to cygpath, with the last one being the file name or path to -# be converted. -# -# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH -# environment variable; do not put it in $PATH. -func_cygpath () -{ - $opt_debug - if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then - func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` - if test "$?" -ne 0; then - # on failure, ensure result is empty - func_cygpath_result= - fi - else - func_cygpath_result= - func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" - fi -} -#end: func_cygpath - - -# func_convert_core_msys_to_w32 ARG -# Convert file name or path ARG from MSYS format to w32 format. Return -# result in func_convert_core_msys_to_w32_result. -func_convert_core_msys_to_w32 () -{ - $opt_debug - # awkward: cmd appends spaces to result - func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | - $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` -} -#end: func_convert_core_msys_to_w32 - - -# func_convert_file_check ARG1 ARG2 -# Verify that ARG1 (a file name in $build format) was converted to $host -# format in ARG2. Otherwise, emit an error message, but continue (resetting -# func_to_host_file_result to ARG1). -func_convert_file_check () -{ - $opt_debug - if test -z "$2" && test -n "$1" ; then - func_error "Could not determine host file name corresponding to" - func_error " \`$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback: - func_to_host_file_result="$1" - fi -} -# end func_convert_file_check - - -# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH -# Verify that FROM_PATH (a path in $build format) was converted to $host -# format in TO_PATH. Otherwise, emit an error message, but continue, resetting -# func_to_host_file_result to a simplistic fallback value (see below). -func_convert_path_check () -{ - $opt_debug - if test -z "$4" && test -n "$3"; then - func_error "Could not determine the host path corresponding to" - func_error " \`$3'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback. This is a deliberately simplistic "conversion" and - # should not be "improved". See libtool.info. - if test "x$1" != "x$2"; then - lt_replace_pathsep_chars="s|$1|$2|g" - func_to_host_path_result=`echo "$3" | - $SED -e "$lt_replace_pathsep_chars"` - else - func_to_host_path_result="$3" - fi - fi -} -# end func_convert_path_check - - -# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG -# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT -# and appending REPL if ORIG matches BACKPAT. -func_convert_path_front_back_pathsep () -{ - $opt_debug - case $4 in - $1 ) func_to_host_path_result="$3$func_to_host_path_result" - ;; - esac - case $4 in - $2 ) func_append func_to_host_path_result "$3" - ;; - esac -} -# end func_convert_path_front_back_pathsep - - -################################################## -# $build to $host FILE NAME CONVERSION FUNCTIONS # -################################################## -# invoked via `$to_host_file_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# Result will be available in $func_to_host_file_result. - - -# func_to_host_file ARG -# Converts the file name ARG from $build format to $host format. Return result -# in func_to_host_file_result. -func_to_host_file () -{ - $opt_debug - $to_host_file_cmd "$1" -} -# end func_to_host_file - - -# func_to_tool_file ARG LAZY -# converts the file name ARG from $build format to toolchain format. Return -# result in func_to_tool_file_result. If the conversion in use is listed -# in (the comma separated) LAZY, no conversion takes place. -func_to_tool_file () -{ - $opt_debug - case ,$2, in - *,"$to_tool_file_cmd",*) - func_to_tool_file_result=$1 - ;; - *) - $to_tool_file_cmd "$1" - func_to_tool_file_result=$func_to_host_file_result - ;; - esac -} -# end func_to_tool_file - - -# func_convert_file_noop ARG -# Copy ARG to func_to_host_file_result. -func_convert_file_noop () -{ - func_to_host_file_result="$1" -} -# end func_convert_file_noop - - -# func_convert_file_msys_to_w32 ARG -# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_file_result. -func_convert_file_msys_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_to_host_file_result="$func_convert_core_msys_to_w32_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_w32 - - -# func_convert_file_cygwin_to_w32 ARG -# Convert file name ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_file_cygwin_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - # because $build is cygwin, we call "the" cygpath in $PATH; no need to use - # LT_CYGPATH in this case. - func_to_host_file_result=`cygpath -m "$1"` - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_cygwin_to_w32 - - -# func_convert_file_nix_to_w32 ARG -# Convert file name ARG from *nix to w32 format. Requires a wine environment -# and a working winepath. Returns result in func_to_host_file_result. -func_convert_file_nix_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_file_wine_to_w32 "$1" - func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_w32 - - -# func_convert_file_msys_to_cygwin ARG -# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_file_msys_to_cygwin () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_cygpath -u "$func_convert_core_msys_to_w32_result" - func_to_host_file_result="$func_cygpath_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_cygwin - - -# func_convert_file_nix_to_cygwin ARG -# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed -# in a wine environment, working winepath, and LT_CYGPATH set. Returns result -# in func_to_host_file_result. -func_convert_file_nix_to_cygwin () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. - func_convert_core_file_wine_to_w32 "$1" - func_cygpath -u "$func_convert_core_file_wine_to_w32_result" - func_to_host_file_result="$func_cygpath_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_cygwin - - -############################################# -# $build to $host PATH CONVERSION FUNCTIONS # -############################################# -# invoked via `$to_host_path_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# The result will be available in $func_to_host_path_result. -# -# Path separators are also converted from $build format to $host format. If -# ARG begins or ends with a path separator character, it is preserved (but -# converted to $host format) on output. -# -# All path conversion functions are named using the following convention: -# file name conversion function : func_convert_file_X_to_Y () -# path conversion function : func_convert_path_X_to_Y () -# where, for any given $build/$host combination the 'X_to_Y' value is the -# same. If conversion functions are added for new $build/$host combinations, -# the two new functions must follow this pattern, or func_init_to_host_path_cmd -# will break. - - -# func_init_to_host_path_cmd -# Ensures that function "pointer" variable $to_host_path_cmd is set to the -# appropriate value, based on the value of $to_host_file_cmd. -to_host_path_cmd= -func_init_to_host_path_cmd () -{ - $opt_debug - if test -z "$to_host_path_cmd"; then - func_stripname 'func_convert_file_' '' "$to_host_file_cmd" - to_host_path_cmd="func_convert_path_${func_stripname_result}" - fi -} - - -# func_to_host_path ARG -# Converts the path ARG from $build format to $host format. Return result -# in func_to_host_path_result. -func_to_host_path () -{ - $opt_debug - func_init_to_host_path_cmd - $to_host_path_cmd "$1" -} -# end func_to_host_path - - -# func_convert_path_noop ARG -# Copy ARG to func_to_host_path_result. -func_convert_path_noop () -{ - func_to_host_path_result="$1" -} -# end func_convert_path_noop - - -# func_convert_path_msys_to_w32 ARG -# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_path_result. -func_convert_path_msys_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # Remove leading and trailing path separator characters from ARG. MSYS - # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; - # and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_msys_to_w32_result" - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_msys_to_w32 - - -# func_convert_path_cygwin_to_w32 ARG -# Convert path ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_path_cygwin_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_cygwin_to_w32 - - -# func_convert_path_nix_to_w32 ARG -# Convert path ARG from *nix to w32 format. Requires a wine environment and -# a working winepath. Returns result in func_to_host_file_result. -func_convert_path_nix_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_nix_to_w32 - - -# func_convert_path_msys_to_cygwin ARG -# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_path_msys_to_cygwin () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_msys_to_w32_result" - func_to_host_path_result="$func_cygpath_result" - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_msys_to_cygwin - - -# func_convert_path_nix_to_cygwin ARG -# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a -# a wine environment, working winepath, and LT_CYGPATH set. Returns result in -# func_to_host_file_result. -func_convert_path_nix_to_cygwin () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # Remove leading and trailing path separator characters from - # ARG. msys behavior is inconsistent here, cygpath turns them - # into '.;' and ';.', and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" - func_to_host_path_result="$func_cygpath_result" - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_nix_to_cygwin - - -# func_mode_compile arg... -func_mode_compile () -{ - $opt_debug - # Get the compilation command and the source file. - base_compile= - srcfile="$nonopt" # always keep a non-empty value in "srcfile" - suppress_opt=yes - suppress_output= - arg_mode=normal - libobj= - later= - pie_flag= - - for arg - do - case $arg_mode in - arg ) - # do not "continue". Instead, add this to base_compile - lastarg="$arg" - arg_mode=normal - ;; - - target ) - libobj="$arg" - arg_mode=normal - continue - ;; - - normal ) - # Accept any command-line options. - case $arg in - -o) - test -n "$libobj" && \ - func_fatal_error "you cannot specify \`-o' more than once" - arg_mode=target - continue - ;; - - -pie | -fpie | -fPIE) - func_append pie_flag " $arg" - continue - ;; - - -shared | -static | -prefer-pic | -prefer-non-pic) - func_append later " $arg" - continue - ;; - - -no-suppress) - suppress_opt=no - continue - ;; - - -Xcompiler) - arg_mode=arg # the next one goes into the "base_compile" arg list - continue # The current "srcfile" will either be retained or - ;; # replaced later. I would guess that would be a bug. - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - lastarg= - save_ifs="$IFS"; IFS=',' - for arg in $args; do - IFS="$save_ifs" - func_append_quoted lastarg "$arg" - done - IFS="$save_ifs" - func_stripname ' ' '' "$lastarg" - lastarg=$func_stripname_result - - # Add the arguments to base_compile. - func_append base_compile " $lastarg" - continue - ;; - - *) - # Accept the current argument as the source file. - # The previous "srcfile" becomes the current argument. - # - lastarg="$srcfile" - srcfile="$arg" - ;; - esac # case $arg - ;; - esac # case $arg_mode - - # Aesthetically quote the previous argument. - func_append_quoted base_compile "$lastarg" - done # for arg - - case $arg_mode in - arg) - func_fatal_error "you must specify an argument for -Xcompile" - ;; - target) - func_fatal_error "you must specify a target with \`-o'" - ;; - *) - # Get the name of the library object. - test -z "$libobj" && { - func_basename "$srcfile" - libobj="$func_basename_result" - } - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - case $libobj in - *.[cCFSifmso] | \ - *.ada | *.adb | *.ads | *.asm | \ - *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ - *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) - func_xform "$libobj" - libobj=$func_xform_result - ;; - esac - - case $libobj in - *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; - *) - func_fatal_error "cannot determine name of library object from \`$libobj'" - ;; - esac - - func_infer_tag $base_compile - - for arg in $later; do - case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - continue - ;; - - -static) - build_libtool_libs=no - build_old_libs=yes - continue - ;; - - -prefer-pic) - pic_mode=yes - continue - ;; - - -prefer-non-pic) - pic_mode=no - continue - ;; - esac - done - - func_quote_for_eval "$libobj" - test "X$libobj" != "X$func_quote_for_eval_result" \ - && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ - && func_warning "libobj name \`$libobj' may not contain shell special characters." - func_dirname_and_basename "$obj" "/" "" - objname="$func_basename_result" - xdir="$func_dirname_result" - lobj=${xdir}$objdir/$objname - - test -z "$base_compile" && \ - func_fatal_help "you must specify a compilation command" - - # Delete any leftover library objects. - if test "$build_old_libs" = yes; then - removelist="$obj $lobj $libobj ${libobj}T" - else - removelist="$lobj $libobj ${libobj}T" - fi - - # On Cygwin there's no "real" PIC flag so we must build both object types - case $host_os in - cygwin* | mingw* | pw32* | os2* | cegcc*) - pic_mode=default - ;; - esac - if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then - # non-PIC code in shared libraries is not supported - pic_mode=default - fi - - # Calculate the filename of the output object if compiler does - # not support -o with -c - if test "$compiler_c_o" = no; then - output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} - lockfile="$output_obj.lock" - else - output_obj= - need_locks=no - lockfile= - fi - - # Lock this critical section if it is needed - # We use this script file to make the link, it avoids creating a new file - if test "$need_locks" = yes; then - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - elif test "$need_locks" = warn; then - if test -f "$lockfile"; then - $ECHO "\ -*** ERROR, $lockfile exists and contains: -`cat $lockfile 2>/dev/null` - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - func_append removelist " $output_obj" - $ECHO "$srcfile" > "$lockfile" - fi - - $opt_dry_run || $RM $removelist - func_append removelist " $lockfile" - trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 - - func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 - srcfile=$func_to_tool_file_result - func_quote_for_eval "$srcfile" - qsrcfile=$func_quote_for_eval_result - - # Only build a PIC object if we are building libtool libraries. - if test "$build_libtool_libs" = yes; then - # Without this assignment, base_compile gets emptied. - fbsd_hideous_sh_bug=$base_compile - - if test "$pic_mode" != no; then - command="$base_compile $qsrcfile $pic_flag" - else - # Don't build PIC code - command="$base_compile $qsrcfile" - fi - - func_mkdir_p "$xdir$objdir" - - if test -z "$output_obj"; then - # Place PIC objects in $objdir - func_append command " -o $lobj" - fi - - func_show_eval_locale "$command" \ - 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' - - if test "$need_locks" = warn && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed, then go on to compile the next one - if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then - func_show_eval '$MV "$output_obj" "$lobj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - - # Allow error messages only from the first compilation. - if test "$suppress_opt" = yes; then - suppress_output=' >/dev/null 2>&1' - fi - fi - - # Only build a position-dependent object if we build old libraries. - if test "$build_old_libs" = yes; then - if test "$pic_mode" != yes; then - # Don't build PIC code - command="$base_compile $qsrcfile$pie_flag" - else - command="$base_compile $qsrcfile $pic_flag" - fi - if test "$compiler_c_o" = yes; then - func_append command " -o $obj" - fi - - # Suppress compiler output if we already did a PIC compilation. - func_append command "$suppress_output" - func_show_eval_locale "$command" \ - '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' - - if test "$need_locks" = warn && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed - if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then - func_show_eval '$MV "$output_obj" "$obj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - fi - - $opt_dry_run || { - func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" - - # Unlock the critical section if it was locked - if test "$need_locks" != no; then - removelist=$lockfile - $RM "$lockfile" - fi - } - - exit $EXIT_SUCCESS -} - -$opt_help || { - test "$opt_mode" = compile && func_mode_compile ${1+"$@"} -} - -func_mode_help () -{ - # We need to display help for each of the modes. - case $opt_mode in - "") - # Generic help is extracted from the usage comments - # at the start of this file. - func_help - ;; - - clean) - $ECHO \ -"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... - -Remove files from the build directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, object or program, all the files associated -with it are deleted. Otherwise, only FILE itself is deleted using RM." - ;; - - compile) - $ECHO \ -"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE - -Compile a source file into a libtool library object. - -This mode accepts the following additional options: - - -o OUTPUT-FILE set the output file name to OUTPUT-FILE - -no-suppress do not suppress compiler output for multiple passes - -prefer-pic try to build PIC objects only - -prefer-non-pic try to build non-PIC objects only - -shared do not build a \`.o' file suitable for static linking - -static only build a \`.o' file suitable for static linking - -Wc,FLAG pass FLAG directly to the compiler - -COMPILE-COMMAND is a command to be used in creating a \`standard' object file -from the given SOURCEFILE. - -The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix \`.c' with the -library object suffix, \`.lo'." - ;; - - execute) - $ECHO \ -"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... - -Automatically set library path, then run a program. - -This mode accepts the following additional options: - - -dlopen FILE add the directory containing FILE to the library path - -This mode sets the library path environment variable according to \`-dlopen' -flags. - -If any of the ARGS are libtool executable wrappers, then they are translated -into their corresponding uninstalled binary, and any of their required library -directories are added to the library path. - -Then, COMMAND is executed, with ARGS as arguments." - ;; - - finish) - $ECHO \ -"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... - -Complete the installation of libtool libraries. - -Each LIBDIR is a directory that contains libtool libraries. - -The commands that this mode executes may require superuser privileges. Use -the \`--dry-run' option if you just want to see what would be executed." - ;; - - install) - $ECHO \ -"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... - -Install executables or libraries. - -INSTALL-COMMAND is the installation command. The first component should be -either the \`install' or \`cp' program. - -The following components of INSTALL-COMMAND are treated specially: - - -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - - link) - $ECHO \ -"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... - -Link object files or libraries together to form another library, or to -create an executable program. - -LINK-COMMAND is a command using the C compiler that you would use to create -a program from several object files. - -The following components of LINK-COMMAND are treated specially: - - -all-static do not do any dynamic linking at all - -avoid-version do not add a version suffix if possible - -bindir BINDIR specify path to binaries directory (for systems where - libraries must be found in the PATH setting at runtime) - -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime - -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols - -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) - -export-symbols SYMFILE - try to export only the symbols listed in SYMFILE - -export-symbols-regex REGEX - try to export only the symbols matching REGEX - -LLIBDIR search LIBDIR for required installed libraries - -lNAME OUTPUT-FILE requires the installed library libNAME - -module build a library that can dlopened - -no-fast-install disable the fast-install mode - -no-install link a not-installable executable - -no-undefined declare that a library does not refer to external symbols - -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -objectlist FILE Use a list of object files found in FILE to specify objects - -precious-files-regex REGEX - don't remove output files matching REGEX - -release RELEASE specify package release information - -rpath LIBDIR the created library will eventually be installed in LIBDIR - -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries - -shared only do dynamic linking of libtool libraries - -shrext SUFFIX override the standard shared library file extension - -static do not do any dynamic linking of uninstalled libtool libraries - -static-libtool-libs - do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -weak LIBNAME declare that the target provides the LIBNAME interface - -Wc,FLAG - -Xcompiler FLAG pass linker-specific FLAG directly to the compiler - -Wl,FLAG - -Xlinker FLAG pass linker-specific FLAG directly to the linker - -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) - -All other options (arguments beginning with \`-') are ignored. - -Every other argument is treated as a filename. Files ending in \`.la' are -treated as uninstalled libtool libraries, other files are standard or library -object files. - -If the OUTPUT-FILE ends in \`.la', then a libtool library is created, -only library objects (\`.lo' files) may be specified, and \`-rpath' is -required, except when creating a convenience library. - -If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created -using \`ar' and \`ranlib', or on Windows using \`lib'. - -If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file -is created, otherwise an executable program is created." - ;; - - uninstall) - $ECHO \ -"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... - -Remove libraries from an installation directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, all the files associated with it are deleted. -Otherwise, only FILE itself is deleted using RM." - ;; - - *) - func_fatal_help "invalid operation mode \`$opt_mode'" - ;; - esac - - echo - $ECHO "Try \`$progname --help' for more information about other modes." -} - -# Now that we've collected a possible --mode arg, show help if necessary -if $opt_help; then - if test "$opt_help" = :; then - func_mode_help - else - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - func_mode_help - done - } | sed -n '1p; 2,$s/^Usage:/ or: /p' - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - echo - func_mode_help - done - } | - sed '1d - /^When reporting/,/^Report/{ - H - d - } - $x - /information about other modes/d - /more detailed .*MODE/d - s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' - fi - exit $? -fi - - -# func_mode_execute arg... -func_mode_execute () -{ - $opt_debug - # The first argument is the command name. - cmd="$nonopt" - test -z "$cmd" && \ - func_fatal_help "you must specify a COMMAND" - - # Handle -dlopen flags immediately. - for file in $opt_dlopen; do - test -f "$file" \ - || func_fatal_help "\`$file' is not a file" - - dir= - case $file in - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$lib' is not a valid libtool archive" - - # Read the libtool library. - dlname= - library_names= - func_source "$file" - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && \ - func_warning "\`$file' was not linked with \`-export-dynamic'" - continue - fi - - func_dirname "$file" "" "." - dir="$func_dirname_result" - - if test -f "$dir/$objdir/$dlname"; then - func_append dir "/$objdir" - else - if test ! -f "$dir/$dlname"; then - func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" - fi - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - func_dirname "$file" "" "." - dir="$func_dirname_result" - ;; - - *) - func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" - continue - ;; - esac - - # Get the absolute pathname. - absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir="$absdir" - - # Now add the directory to shlibpath_var. - if eval "test -z \"\$$shlibpath_var\""; then - eval "$shlibpath_var=\"\$dir\"" - else - eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" - fi - done - - # This variable tells wrapper scripts just to set shlibpath_var - # rather than running their programs. - libtool_execute_magic="$magic" - - # Check if any of the arguments is a wrapper script. - args= - for file - do - case $file in - -* | *.la | *.lo ) ;; - *) - # Do a test to see if this is really a libtool program. - if func_ltwrapper_script_p "$file"; then - func_source "$file" - # Transform arg to wrapped name. - file="$progdir/$program" - elif func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - func_source "$func_ltwrapper_scriptname_result" - # Transform arg to wrapped name. - file="$progdir/$program" - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - func_append_quoted args "$file" - done - - if test "X$opt_dry_run" = Xfalse; then - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved environment variables - for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES - do - eval "if test \"\${save_$lt_var+set}\" = set; then - $lt_var=\$save_$lt_var; export $lt_var - else - $lt_unset $lt_var - fi" - done - - # Now prepare to actually exec the command. - exec_cmd="\$cmd$args" - else - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" - echo "export $shlibpath_var" - fi - $ECHO "$cmd$args" - exit $EXIT_SUCCESS - fi -} - -test "$opt_mode" = execute && func_mode_execute ${1+"$@"} - - -# func_mode_finish arg... -func_mode_finish () -{ - $opt_debug - libs= - libdirs= - admincmds= - - for opt in "$nonopt" ${1+"$@"} - do - if test -d "$opt"; then - func_append libdirs " $opt" - - elif test -f "$opt"; then - if func_lalib_unsafe_p "$opt"; then - func_append libs " $opt" - else - func_warning "\`$opt' is not a valid libtool archive" - fi - - else - func_fatal_error "invalid argument \`$opt'" - fi - done - - if test -n "$libs"; then - if test -n "$lt_sysroot"; then - sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` - sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" - else - sysroot_cmd= - fi - - # Remove sysroot references - if $opt_dry_run; then - for lib in $libs; do - echo "removing references to $lt_sysroot and \`=' prefixes from $lib" - done - else - tmpdir=`func_mktempdir` - for lib in $libs; do - sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ - > $tmpdir/tmp-la - mv -f $tmpdir/tmp-la $lib - done - ${RM}r "$tmpdir" - fi - fi - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - func_execute_cmds "$finish_cmds" 'admincmds="$admincmds -'"$cmd"'"' - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $opt_dry_run || eval "$cmds" || func_append admincmds " - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - $opt_silent && exit $EXIT_SUCCESS - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - echo "----------------------------------------------------------------------" - echo "Libraries have been installed in:" - for libdir in $libdirs; do - $ECHO " $libdir" - done - echo - echo "If you ever happen to want to link against installed libraries" - echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use the \`-LLIBDIR'" - echo "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the \`$shlibpath_var' environment variable" - echo " during execution" - fi - if test -n "$runpath_var"; then - echo " - add LIBDIR to the \`$runpath_var' environment variable" - echo " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" - - $ECHO " - use the \`$flag' linker flag" - fi - if test -n "$admincmds"; then - $ECHO " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" - fi - echo - - echo "See any operating system documentation about shared libraries for" - case $host in - solaris2.[6789]|solaris2.1[0-9]) - echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" - echo "pages." - ;; - *) - echo "more information, such as the ld(1) and ld.so(8) manual pages." - ;; - esac - echo "----------------------------------------------------------------------" - fi - exit $EXIT_SUCCESS -} - -test "$opt_mode" = finish && func_mode_finish ${1+"$@"} - - -# func_mode_install arg... -func_mode_install () -{ - $opt_debug - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || - # Allow the use of GNU shtool's install command. - case $nonopt in *shtool*) :;; *) false;; esac; then - # Aesthetically quote it. - func_quote_for_eval "$nonopt" - install_prog="$func_quote_for_eval_result " - arg=$1 - shift - else - install_prog= - arg=$nonopt - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - func_quote_for_eval "$arg" - func_append install_prog "$func_quote_for_eval_result" - install_shared_prog=$install_prog - case " $install_prog " in - *[\\\ /]cp\ *) install_cp=: ;; - *) install_cp=false ;; - esac - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=no - stripme= - no_mode=: - for arg - do - arg2= - if test -n "$dest"; then - func_append files " $dest" - dest=$arg - continue - fi - - case $arg in - -d) isdir=yes ;; - -f) - if $install_cp; then :; else - prev=$arg - fi - ;; - -g | -m | -o) - prev=$arg - ;; - -s) - stripme=" -s" - continue - ;; - -*) - ;; - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - if test "x$prev" = x-m && test -n "$install_override_mode"; then - arg2=$install_override_mode - no_mode=false - fi - prev= - else - dest=$arg - continue - fi - ;; - esac - - # Aesthetically quote the argument. - func_quote_for_eval "$arg" - func_append install_prog " $func_quote_for_eval_result" - if test -n "$arg2"; then - func_quote_for_eval "$arg2" - fi - func_append install_shared_prog " $func_quote_for_eval_result" - done - - test -z "$install_prog" && \ - func_fatal_help "you must specify an install program" - - test -n "$prev" && \ - func_fatal_help "the \`$prev' option requires an argument" - - if test -n "$install_override_mode" && $no_mode; then - if $install_cp; then :; else - func_quote_for_eval "$install_override_mode" - func_append install_shared_prog " -m $func_quote_for_eval_result" - fi - fi - - if test -z "$files"; then - if test -z "$dest"; then - func_fatal_help "no file or destination specified" - else - func_fatal_help "you must specify a destination" - fi - fi - - # Strip any trailing slash from the destination. - func_stripname '' '/' "$dest" - dest=$func_stripname_result - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" - destname= - else - func_dirname_and_basename "$dest" "" "." - destdir="$func_dirname_result" - destname="$func_basename_result" - - # Not a directory, so check to see that there is only one file specified. - set dummy $files; shift - test "$#" -gt 1 && \ - func_fatal_help "\`$dest' is not a directory" - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - func_fatal_help "\`$destdir' must be an absolute directory name" - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case $file in - *.$libext) - # Do the static libraries later. - func_append staticlibs " $file" - ;; - - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$file' is not a valid libtool archive" - - library_names= - old_library= - relink_command= - func_source "$file" - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) func_append current_libdirs " $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) func_append future_libdirs " $libdir" ;; - esac - fi - - func_dirname "$file" "/" "" - dir="$func_dirname_result" - func_append dir "$objdir" - - if test -n "$relink_command"; then - # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that - # are installed to the same prefix. - # At present, this check doesn't affect windows .dll's that - # are installed into $libdir/../bin (currently, that works fine) - # but it's something to keep an eye on. - test "$inst_prefix_dir" = "$destdir" && \ - func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" - - if test -n "$inst_prefix_dir"; then - # Stick the inst_prefix_dir data into the link command. - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` - else - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` - fi - - func_warning "relinking \`$file'" - func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' - fi - - # See the names of the shared library. - set dummy $library_names; shift - if test -n "$1"; then - realname="$1" - shift - - srcname="$realname" - test -n "$relink_command" && srcname="$realname"T - - # Install the shared library and build the symlinks. - func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ - 'exit $?' - tstripme="$stripme" - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - case $realname in - *.dll.a) - tstripme="" - ;; - esac - ;; - esac - if test -n "$tstripme" && test -n "$striplib"; then - func_show_eval "$striplib $destdir/$realname" 'exit $?' - fi - - if test "$#" -gt 0; then - # Delete the old symlinks, and create new ones. - # Try `ln -sf' first, because the `ln' binary might depend on - # the symlink we replace! Solaris /bin/ln does not understand -f, - # so we also need to try rm && ln -s. - for linkname - do - test "$linkname" != "$realname" \ - && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" - done - fi - - # Do each command in the postinstall commands. - lib="$destdir/$realname" - func_execute_cmds "$postinstall_cmds" 'exit $?' - fi - - # Install the pseudo-library for information purposes. - func_basename "$file" - name="$func_basename_result" - instname="$dir/$name"i - func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' - - # Maybe install the static library, too. - test -n "$old_library" && func_append staticlibs " $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - func_lo2o "$destfile" - staticdest=$func_lo2o_result - ;; - *.$objext) - staticdest="$destfile" - destfile= - ;; - *) - func_fatal_help "cannot copy a libtool object to \`$destfile'" - ;; - esac - - # Install the libtool object if requested. - test -n "$destfile" && \ - func_show_eval "$install_prog $file $destfile" 'exit $?' - - # Install the old object if enabled. - if test "$build_old_libs" = yes; then - # Deduce the name of the old-style object file. - func_lo2o "$file" - staticobj=$func_lo2o_result - func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' - fi - exit $EXIT_SUCCESS - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" - fi - - # If the file is missing, and there is a .exe on the end, strip it - # because it is most likely a libtool script we actually want to - # install - stripped_ext="" - case $file in - *.exe) - if test ! -f "$file"; then - func_stripname '' '.exe' "$file" - file=$func_stripname_result - stripped_ext=".exe" - fi - ;; - esac - - # Do a test to see if this is really a libtool program. - case $host in - *cygwin* | *mingw*) - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - wrapper=$func_ltwrapper_scriptname_result - else - func_stripname '' '.exe' "$file" - wrapper=$func_stripname_result - fi - ;; - *) - wrapper=$file - ;; - esac - if func_ltwrapper_script_p "$wrapper"; then - notinst_deplibs= - relink_command= - - func_source "$wrapper" - - # Check the variables that should have been set. - test -z "$generated_by_libtool_version" && \ - func_fatal_error "invalid libtool wrapper script \`$wrapper'" - - finalize=yes - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - func_source "$lib" - fi - libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test - if test -n "$libdir" && test ! -f "$libfile"; then - func_warning "\`$lib' has not been installed in \`$libdir'" - finalize=no - fi - done - - relink_command= - func_source "$wrapper" - - outputname= - if test "$fast_install" = no && test -n "$relink_command"; then - $opt_dry_run || { - if test "$finalize" = yes; then - tmpdir=`func_mktempdir` - func_basename "$file$stripped_ext" - file="$func_basename_result" - outputname="$tmpdir/$file" - # Replace the output file specification. - relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` - - $opt_silent || { - func_quote_for_expand "$relink_command" - eval "func_echo $func_quote_for_expand_result" - } - if eval "$relink_command"; then : - else - func_error "error: relink \`$file' with the above command before installing it" - $opt_dry_run || ${RM}r "$tmpdir" - continue - fi - file="$outputname" - else - func_warning "cannot relink \`$file'" - fi - } - else - # Install the binary that we compiled earlier. - file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` - fi - fi - - # remove .exe since cygwin /usr/bin/install will append another - # one anyway - case $install_prog,$host in - */usr/bin/install*,*cygwin*) - case $file:$destfile in - *.exe:*.exe) - # this is ok - ;; - *.exe:*) - destfile=$destfile.exe - ;; - *:*.exe) - func_stripname '' '.exe' "$destfile" - destfile=$func_stripname_result - ;; - esac - ;; - esac - func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' - $opt_dry_run || if test -n "$outputname"; then - ${RM}r "$tmpdir" - fi - ;; - esac - done - - for file in $staticlibs; do - func_basename "$file" - name="$func_basename_result" - - # Set up the ranlib parameters. - oldlib="$destdir/$name" - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - - func_show_eval "$install_prog \$file \$oldlib" 'exit $?' - - if test -n "$stripme" && test -n "$old_striplib"; then - func_show_eval "$old_striplib $tool_oldlib" 'exit $?' - fi - - # Do each command in the postinstall commands. - func_execute_cmds "$old_postinstall_cmds" 'exit $?' - done - - test -n "$future_libdirs" && \ - func_warning "remember to run \`$progname --finish$future_libdirs'" - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - $opt_dry_run && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' - else - exit $EXIT_SUCCESS - fi -} - -test "$opt_mode" = install && func_mode_install ${1+"$@"} - - -# func_generate_dlsyms outputname originator pic_p -# Extract symbols from dlprefiles and create ${outputname}S.o with -# a dlpreopen symbol table. -func_generate_dlsyms () -{ - $opt_debug - my_outputname="$1" - my_originator="$2" - my_pic_p="${3-no}" - my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` - my_dlsyms= - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - my_dlsyms="${my_outputname}S.c" - else - func_error "not configured to extract global symbols from dlpreopened files" - fi - fi - - if test -n "$my_dlsyms"; then - case $my_dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${my_outputname}.nm" - - func_show_eval "$RM $nlist ${nlist}S ${nlist}T" - - # Parse the name list into a source file. - func_verbose "creating $output_objdir/$my_dlsyms" - - $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ -/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ -/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) -#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" -#endif - -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -/* External symbol declarations for the compiler. */\ -" - - if test "$dlself" = yes; then - func_verbose "generating symbol list for \`$output'" - - $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` - for progfile in $progfiles; do - func_to_tool_file "$progfile" func_convert_file_msys_to_w32 - func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" - $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $opt_dry_run || { - eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - if test -n "$export_symbols_regex"; then - $opt_dry_run || { - eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols="$output_objdir/$outputname.exp" - $opt_dry_run || { - $RM $export_symbols - eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' - ;; - esac - } - else - $opt_dry_run || { - eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' - eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' - ;; - esac - } - fi - fi - - for dlprefile in $dlprefiles; do - func_verbose "extracting global C symbols from \`$dlprefile'" - func_basename "$dlprefile" - name="$func_basename_result" - case $host in - *cygwin* | *mingw* | *cegcc* ) - # if an import library, we need to obtain dlname - if func_win32_import_lib_p "$dlprefile"; then - func_tr_sh "$dlprefile" - eval "curr_lafile=\$libfile_$func_tr_sh_result" - dlprefile_dlbasename="" - if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then - # Use subshell, to avoid clobbering current variable values - dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` - if test -n "$dlprefile_dlname" ; then - func_basename "$dlprefile_dlname" - dlprefile_dlbasename="$func_basename_result" - else - # no lafile. user explicitly requested -dlpreopen . - $sharedlib_from_linklib_cmd "$dlprefile" - dlprefile_dlbasename=$sharedlib_from_linklib_result - fi - fi - $opt_dry_run || { - if test -n "$dlprefile_dlbasename" ; then - eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' - else - func_warning "Could not compute DLL name from $name" - eval '$ECHO ": $name " >> "$nlist"' - fi - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | - $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" - } - else # not an import lib - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - fi - ;; - *) - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - ;; - esac - done - - $opt_dry_run || { - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $MV "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if $GREP -v "^: " < "$nlist" | - if sort -k 3 /dev/null 2>&1; then - sort -k 3 - else - sort +2 - fi | - uniq > "$nlist"S; then - : - else - $GREP -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' - else - echo '/* NONE */' >> "$output_objdir/$my_dlsyms" - fi - - echo >> "$output_objdir/$my_dlsyms" "\ - -/* The mapping between symbol names and symbols. */ -typedef struct { - const char *name; - void *address; -} lt_dlsymlist; -extern LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[]; -LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[] = -{\ - { \"$my_originator\", (void *) 0 }," - - case $need_lib_prefix in - no) - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - *) - eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - esac - echo >> "$output_objdir/$my_dlsyms" "\ - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_${my_prefix}_LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - } # !$opt_dry_run - - pic_flag_for_symtable= - case "$compile_command " in - *" -static "*) ;; - *) - case $host in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; - *-*-hpux*) - pic_flag_for_symtable=" $pic_flag" ;; - *) - if test "X$my_pic_p" != Xno; then - pic_flag_for_symtable=" $pic_flag" - fi - ;; - esac - ;; - esac - symtab_cflags= - for arg in $LTCFLAGS; do - case $arg in - -pie | -fpie | -fPIE) ;; - *) func_append symtab_cflags " $arg" ;; - esac - done - - # Now compile the dynamic symbol file. - func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' - - # Clean up the generated files. - func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' - - # Transform the symbol file into the correct name. - symfileobj="$output_objdir/${my_outputname}S.$objext" - case $host in - *cygwin* | *mingw* | *cegcc* ) - if test -f "$output_objdir/$my_outputname.def"; then - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - else - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - fi - ;; - *) - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - ;; - esac - ;; - *) - func_fatal_error "unknown suffix for \`$my_dlsyms'" - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` - fi -} - -# func_win32_libid arg -# return the library type of file 'arg' -# -# Need a lot of goo to handle *both* DLLs and import libs -# Has to be a shell function in order to 'eat' the argument -# that is supplied when $file_magic_command is called. -# Despite the name, also deal with 64 bit binaries. -func_win32_libid () -{ - $opt_debug - win32_libid_type="unknown" - win32_fileres=`file -L $1 2>/dev/null` - case $win32_fileres in - *ar\ archive\ import\ library*) # definitely import - win32_libid_type="x86 archive import" - ;; - *ar\ archive*) # could be an import, or static - # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. - if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | - $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then - func_to_tool_file "$1" func_convert_file_msys_to_w32 - win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | - $SED -n -e ' - 1,100{ - / I /{ - s,.*,import, - p - q - } - }'` - case $win32_nmres in - import*) win32_libid_type="x86 archive import";; - *) win32_libid_type="x86 archive static";; - esac - fi - ;; - *DLL*) - win32_libid_type="x86 DLL" - ;; - *executable*) # but shell scripts are "executable" too... - case $win32_fileres in - *MS\ Windows\ PE\ Intel*) - win32_libid_type="x86 DLL" - ;; - esac - ;; - esac - $ECHO "$win32_libid_type" -} - -# func_cygming_dll_for_implib ARG -# -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib () -{ - $opt_debug - sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` -} - -# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs -# -# The is the core of a fallback implementation of a -# platform-specific function to extract the name of the -# DLL associated with the specified import library LIBNAME. -# -# SECTION_NAME is either .idata$6 or .idata$7, depending -# on the platform and compiler that created the implib. -# -# Echos the name of the DLL associated with the -# specified import library. -func_cygming_dll_for_implib_fallback_core () -{ - $opt_debug - match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` - $OBJDUMP -s --section "$1" "$2" 2>/dev/null | - $SED '/^Contents of section '"$match_literal"':/{ - # Place marker at beginning of archive member dllname section - s/.*/====MARK====/ - p - d - } - # These lines can sometimes be longer than 43 characters, but - # are always uninteresting - /:[ ]*file format pe[i]\{,1\}-/d - /^In archive [^:]*:/d - # Ensure marker is printed - /^====MARK====/p - # Remove all lines with less than 43 characters - /^.\{43\}/!d - # From remaining lines, remove first 43 characters - s/^.\{43\}//' | - $SED -n ' - # Join marker and all lines until next marker into a single line - /^====MARK====/ b para - H - $ b para - b - :para - x - s/\n//g - # Remove the marker - s/^====MARK====// - # Remove trailing dots and whitespace - s/[\. \t]*$// - # Print - /./p' | - # we now have a list, one entry per line, of the stringified - # contents of the appropriate section of all members of the - # archive which possess that section. Heuristic: eliminate - # all those which have a first or second character that is - # a '.' (that is, objdump's representation of an unprintable - # character.) This should work for all archives with less than - # 0x302f exports -- but will fail for DLLs whose name actually - # begins with a literal '.' or a single character followed by - # a '.'. - # - # Of those that remain, print the first one. - $SED -e '/^\./d;/^.\./d;q' -} - -# func_cygming_gnu_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is a GNU/binutils-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_gnu_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` - test -n "$func_cygming_gnu_implib_tmp" -} - -# func_cygming_ms_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is an MS-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_ms_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` - test -n "$func_cygming_ms_implib_tmp" -} - -# func_cygming_dll_for_implib_fallback ARG -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# -# This fallback implementation is for use when $DLLTOOL -# does not support the --identify-strict option. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib_fallback () -{ - $opt_debug - if func_cygming_gnu_implib_p "$1" ; then - # binutils import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` - elif func_cygming_ms_implib_p "$1" ; then - # ms-generated import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` - else - # unknown - sharedlib_from_linklib_result="" - fi -} - - -# func_extract_an_archive dir oldlib -func_extract_an_archive () -{ - $opt_debug - f_ex_an_ar_dir="$1"; shift - f_ex_an_ar_oldlib="$1" - if test "$lock_old_archive_extraction" = yes; then - lockfile=$f_ex_an_ar_oldlib.lock - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - fi - func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ - 'stat=$?; rm -f "$lockfile"; exit $stat' - if test "$lock_old_archive_extraction" = yes; then - $opt_dry_run || rm -f "$lockfile" - fi - if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then - : - else - func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" - fi -} - - -# func_extract_archives gentop oldlib ... -func_extract_archives () -{ - $opt_debug - my_gentop="$1"; shift - my_oldlibs=${1+"$@"} - my_oldobjs="" - my_xlib="" - my_xabs="" - my_xdir="" - - for my_xlib in $my_oldlibs; do - # Extract the objects. - case $my_xlib in - [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; - *) my_xabs=`pwd`"/$my_xlib" ;; - esac - func_basename "$my_xlib" - my_xlib="$func_basename_result" - my_xlib_u=$my_xlib - while :; do - case " $extracted_archives " in - *" $my_xlib_u "*) - func_arith $extracted_serial + 1 - extracted_serial=$func_arith_result - my_xlib_u=lt$extracted_serial-$my_xlib ;; - *) break ;; - esac - done - extracted_archives="$extracted_archives $my_xlib_u" - my_xdir="$my_gentop/$my_xlib_u" - - func_mkdir_p "$my_xdir" - - case $host in - *-darwin*) - func_verbose "Extracting $my_xabs" - # Do not bother doing anything if just a dry run - $opt_dry_run || { - darwin_orig_dir=`pwd` - cd $my_xdir || exit $? - darwin_archive=$my_xabs - darwin_curdir=`pwd` - darwin_base_archive=`basename "$darwin_archive"` - darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` - if test -n "$darwin_arches"; then - darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` - darwin_arch= - func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" - for darwin_arch in $darwin_arches ; do - func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" - $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" - cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" - func_extract_an_archive "`pwd`" "${darwin_base_archive}" - cd "$darwin_curdir" - $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" - done # $darwin_arches - ## Okay now we've a bunch of thin objects, gotta fatten them up :) - darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` - darwin_file= - darwin_files= - for darwin_file in $darwin_filelist; do - darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` - $LIPO -create -output "$darwin_file" $darwin_files - done # $darwin_filelist - $RM -rf unfat-$$ - cd "$darwin_orig_dir" - else - cd $darwin_orig_dir - func_extract_an_archive "$my_xdir" "$my_xabs" - fi # $darwin_arches - } # !$opt_dry_run - ;; - *) - func_extract_an_archive "$my_xdir" "$my_xabs" - ;; - esac - my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` - done - - func_extract_archives_result="$my_oldobjs" -} - - -# func_emit_wrapper [arg=no] -# -# Emit a libtool wrapper script on stdout. -# Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw -# wrapper executable. Must ONLY be called from within -# func_mode_link because it depends on a number of variables -# set therein. -# -# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR -# variable will take. If 'yes', then the emitted script -# will assume that the directory in which it is stored is -# the $objdir directory. This is a cygwin/mingw-specific -# behavior. -func_emit_wrapper () -{ - func_emit_wrapper_arg1=${1-no} - - $ECHO "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='$sed_quote_subst' - -# Be Bourne compatible -if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -relink_command=\"$relink_command\" - -# This environment variable determines our operation mode. -if test \"\$libtool_install_magic\" = \"$magic\"; then - # install mode needs the following variables: - generated_by_libtool_version='$macro_version' - notinst_deplibs='$notinst_deplibs' -else - # When we are sourced in execute mode, \$file and \$ECHO are already set. - if test \"\$libtool_execute_magic\" != \"$magic\"; then - file=\"\$0\"" - - qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` - $ECHO "\ - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - ECHO=\"$qECHO\" - fi - -# Very basic option parsing. These options are (a) specific to -# the libtool wrapper, (b) are identical between the wrapper -# /script/ and the wrapper /executable/ which is used only on -# windows platforms, and (c) all begin with the string "--lt-" -# (application programs are unlikely to have options which match -# this pattern). -# -# There are only two supported options: --lt-debug and -# --lt-dump-script. There is, deliberately, no --lt-help. -# -# The first argument to this parsing function should be the -# script's $0 value, followed by "$@". -lt_option_debug= -func_parse_lt_options () -{ - lt_script_arg0=\$0 - shift - for lt_opt - do - case \"\$lt_opt\" in - --lt-debug) lt_option_debug=1 ;; - --lt-dump-script) - lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` - test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. - lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` - cat \"\$lt_dump_D/\$lt_dump_F\" - exit 0 - ;; - --lt-*) - \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 - exit 1 - ;; - esac - done - - # Print the debug banner immediately: - if test -n \"\$lt_option_debug\"; then - echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 - fi -} - -# Used when --lt-debug. Prints its arguments to stdout -# (redirection is the responsibility of the caller) -func_lt_dump_args () -{ - lt_dump_args_N=1; - for lt_arg - do - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" - lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` - done -} - -# Core function for launching the target application -func_exec_program_core () -{ -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" - ;; - - *) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 - exit 1 -} - -# A function to encapsulate launching the target application -# Strips options in the --lt-* namespace from \$@ and -# launches target application with the remaining arguments. -func_exec_program () -{ - case \" \$* \" in - *\\ --lt-*) - for lt_wr_arg - do - case \$lt_wr_arg in - --lt-*) ;; - *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; - esac - shift - done ;; - esac - func_exec_program_core \${1+\"\$@\"} -} - - # Parse options - func_parse_lt_options \"\$0\" \${1+\"\$@\"} - - # Find the directory that this script lives in. - thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` - test \"x\$thisdir\" = \"x\$file\" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` - while test -n \"\$file\"; do - destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` - - # If there was a directory component, then change thisdir. - if test \"x\$destdir\" != \"x\$file\"; then - case \"\$destdir\" in - [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; - *) thisdir=\"\$thisdir/\$destdir\" ;; - esac - fi - - file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` - done - - # Usually 'no', except on cygwin/mingw when embedded into - # the cwrapper. - WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 - if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then - # special case for '.' - if test \"\$thisdir\" = \".\"; then - thisdir=\`pwd\` - fi - # remove .libs from thisdir - case \"\$thisdir\" in - *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; - $objdir ) thisdir=. ;; - esac - fi - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test "$fast_install" = yes; then - $ECHO "\ - program=lt-'$outputname'$exeext - progdir=\"\$thisdir/$objdir\" - - if test ! -f \"\$progdir/\$program\" || - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ - test \"X\$file\" != \"X\$progdir/\$program\"; }; then - - file=\"\$\$-\$program\" - - if test ! -d \"\$progdir\"; then - $MKDIR \"\$progdir\" - else - $RM \"\$progdir/\$file\" - fi" - - $ECHO "\ - - # relink executable if necessary - if test -n \"\$relink_command\"; then - if relink_command_output=\`eval \$relink_command 2>&1\`; then : - else - $ECHO \"\$relink_command_output\" >&2 - $RM \"\$progdir/\$file\" - exit 1 - fi - fi - - $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $RM \"\$progdir/\$program\"; - $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $RM \"\$progdir/\$file\" - fi" - else - $ECHO "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - $ECHO "\ - - if test -f \"\$progdir/\$program\"; then" - - # fixup the dll searchpath if we need to. - # - # Fix the DLL searchpath if we need to. Do this before prepending - # to shlibpath, because on Windows, both are PATH and uninstalled - # libraries must come first. - if test -n "$dllsearchpath"; then - $ECHO "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $ECHO "\ - # Add our own library path to $shlibpath_var - $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` - - export $shlibpath_var -" - fi - - $ECHO "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. - func_exec_program \${1+\"\$@\"} - fi - else - # The program doesn't exist. - \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 - \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 - \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 - exit 1 - fi -fi\ -" -} - - -# func_emit_cwrapperexe_src -# emit the source code for a wrapper executable on stdout -# Must ONLY be called from within func_mode_link because -# it depends on a number of variable set therein. -func_emit_cwrapperexe_src () -{ - cat < -#include -#ifdef _MSC_VER -# include -# include -# include -#else -# include -# include -# ifdef __CYGWIN__ -# include -# endif -#endif -#include -#include -#include -#include -#include -#include -#include -#include - -/* declarations of non-ANSI functions */ -#if defined(__MINGW32__) -# ifdef __STRICT_ANSI__ -int _putenv (const char *); -# endif -#elif defined(__CYGWIN__) -# ifdef __STRICT_ANSI__ -char *realpath (const char *, char *); -int putenv (char *); -int setenv (const char *, const char *, int); -# endif -/* #elif defined (other platforms) ... */ -#endif - -/* portability defines, excluding path handling macros */ -#if defined(_MSC_VER) -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -# define S_IXUSR _S_IEXEC -# ifndef _INTPTR_T_DEFINED -# define _INTPTR_T_DEFINED -# define intptr_t int -# endif -#elif defined(__MINGW32__) -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -#elif defined(__CYGWIN__) -# define HAVE_SETENV -# define FOPEN_WB "wb" -/* #elif defined (other platforms) ... */ -#endif - -#if defined(PATH_MAX) -# define LT_PATHMAX PATH_MAX -#elif defined(MAXPATHLEN) -# define LT_PATHMAX MAXPATHLEN -#else -# define LT_PATHMAX 1024 -#endif - -#ifndef S_IXOTH -# define S_IXOTH 0 -#endif -#ifndef S_IXGRP -# define S_IXGRP 0 -#endif - -/* path handling portability macros */ -#ifndef DIR_SEPARATOR -# define DIR_SEPARATOR '/' -# define PATH_SEPARATOR ':' -#endif - -#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ - defined (__OS2__) -# define HAVE_DOS_BASED_FILE_SYSTEM -# define FOPEN_WB "wb" -# ifndef DIR_SEPARATOR_2 -# define DIR_SEPARATOR_2 '\\' -# endif -# ifndef PATH_SEPARATOR_2 -# define PATH_SEPARATOR_2 ';' -# endif -#endif - -#ifndef DIR_SEPARATOR_2 -# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) -#else /* DIR_SEPARATOR_2 */ -# define IS_DIR_SEPARATOR(ch) \ - (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) -#endif /* DIR_SEPARATOR_2 */ - -#ifndef PATH_SEPARATOR_2 -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) -#else /* PATH_SEPARATOR_2 */ -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) -#endif /* PATH_SEPARATOR_2 */ - -#ifndef FOPEN_WB -# define FOPEN_WB "w" -#endif -#ifndef _O_BINARY -# define _O_BINARY 0 -#endif - -#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -#define XFREE(stale) do { \ - if (stale) { free ((void *) stale); stale = 0; } \ -} while (0) - -#if defined(LT_DEBUGWRAPPER) -static int lt_debug = 1; -#else -static int lt_debug = 0; -#endif - -const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ - -void *xmalloc (size_t num); -char *xstrdup (const char *string); -const char *base_name (const char *name); -char *find_executable (const char *wrapper); -char *chase_symlinks (const char *pathspec); -int make_executable (const char *path); -int check_executable (const char *path); -char *strendzap (char *str, const char *pat); -void lt_debugprintf (const char *file, int line, const char *fmt, ...); -void lt_fatal (const char *file, int line, const char *message, ...); -static const char *nonnull (const char *s); -static const char *nonempty (const char *s); -void lt_setenv (const char *name, const char *value); -char *lt_extend_str (const char *orig_value, const char *add, int to_end); -void lt_update_exe_path (const char *name, const char *value); -void lt_update_lib_path (const char *name, const char *value); -char **prepare_spawn (char **argv); -void lt_dump_script (FILE *f); -EOF - - cat <= 0) - && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) - return 1; - else - return 0; -} - -int -make_executable (const char *path) -{ - int rval = 0; - struct stat st; - - lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", - nonempty (path)); - if ((!path) || (!*path)) - return 0; - - if (stat (path, &st) >= 0) - { - rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); - } - return rval; -} - -/* Searches for the full path of the wrapper. Returns - newly allocated full path name if found, NULL otherwise - Does not chase symlinks, even on platforms that support them. -*/ -char * -find_executable (const char *wrapper) -{ - int has_slash = 0; - const char *p; - const char *p_next; - /* static buffer for getcwd */ - char tmp[LT_PATHMAX + 1]; - int tmp_len; - char *concat_name; - - lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", - nonempty (wrapper)); - - if ((wrapper == NULL) || (*wrapper == '\0')) - return NULL; - - /* Absolute path? */ -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - else - { -#endif - if (IS_DIR_SEPARATOR (wrapper[0])) - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - } -#endif - - for (p = wrapper; *p; p++) - if (*p == '/') - { - has_slash = 1; - break; - } - if (!has_slash) - { - /* no slashes; search PATH */ - const char *path = getenv ("PATH"); - if (path != NULL) - { - for (p = path; *p; p = p_next) - { - const char *q; - size_t p_len; - for (q = p; *q; q++) - if (IS_PATH_SEPARATOR (*q)) - break; - p_len = q - p; - p_next = (*q == '\0' ? q : q + 1); - if (p_len == 0) - { - /* empty path: current directory */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = - XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - } - else - { - concat_name = - XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, p, p_len); - concat_name[p_len] = '/'; - strcpy (concat_name + p_len + 1, wrapper); - } - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - } - /* not found in PATH; assume curdir */ - } - /* Relative path | not found in path: prepend cwd */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - return NULL; -} - -char * -chase_symlinks (const char *pathspec) -{ -#ifndef S_ISLNK - return xstrdup (pathspec); -#else - char buf[LT_PATHMAX]; - struct stat s; - char *tmp_pathspec = xstrdup (pathspec); - char *p; - int has_symlinks = 0; - while (strlen (tmp_pathspec) && !has_symlinks) - { - lt_debugprintf (__FILE__, __LINE__, - "checking path component for symlinks: %s\n", - tmp_pathspec); - if (lstat (tmp_pathspec, &s) == 0) - { - if (S_ISLNK (s.st_mode) != 0) - { - has_symlinks = 1; - break; - } - - /* search backwards for last DIR_SEPARATOR */ - p = tmp_pathspec + strlen (tmp_pathspec) - 1; - while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - p--; - if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - { - /* no more DIR_SEPARATORS left */ - break; - } - *p = '\0'; - } - else - { - lt_fatal (__FILE__, __LINE__, - "error accessing file \"%s\": %s", - tmp_pathspec, nonnull (strerror (errno))); - } - } - XFREE (tmp_pathspec); - - if (!has_symlinks) - { - return xstrdup (pathspec); - } - - tmp_pathspec = realpath (pathspec, buf); - if (tmp_pathspec == 0) - { - lt_fatal (__FILE__, __LINE__, - "could not follow symlinks for %s", pathspec); - } - return xstrdup (tmp_pathspec); -#endif -} - -char * -strendzap (char *str, const char *pat) -{ - size_t len, patlen; - - assert (str != NULL); - assert (pat != NULL); - - len = strlen (str); - patlen = strlen (pat); - - if (patlen <= len) - { - str += len - patlen; - if (strcmp (str, pat) == 0) - *str = '\0'; - } - return str; -} - -void -lt_debugprintf (const char *file, int line, const char *fmt, ...) -{ - va_list args; - if (lt_debug) - { - (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); - va_start (args, fmt); - (void) vfprintf (stderr, fmt, args); - va_end (args); - } -} - -static void -lt_error_core (int exit_status, const char *file, - int line, const char *mode, - const char *message, va_list ap) -{ - fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); - vfprintf (stderr, message, ap); - fprintf (stderr, ".\n"); - - if (exit_status >= 0) - exit (exit_status); -} - -void -lt_fatal (const char *file, int line, const char *message, ...) -{ - va_list ap; - va_start (ap, message); - lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); - va_end (ap); -} - -static const char * -nonnull (const char *s) -{ - return s ? s : "(null)"; -} - -static const char * -nonempty (const char *s) -{ - return (s && !*s) ? "(empty)" : nonnull (s); -} - -void -lt_setenv (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_setenv) setting '%s' to '%s'\n", - nonnull (name), nonnull (value)); - { -#ifdef HAVE_SETENV - /* always make a copy, for consistency with !HAVE_SETENV */ - char *str = xstrdup (value); - setenv (name, str, 1); -#else - int len = strlen (name) + 1 + strlen (value) + 1; - char *str = XMALLOC (char, len); - sprintf (str, "%s=%s", name, value); - if (putenv (str) != EXIT_SUCCESS) - { - XFREE (str); - } -#endif - } -} - -char * -lt_extend_str (const char *orig_value, const char *add, int to_end) -{ - char *new_value; - if (orig_value && *orig_value) - { - int orig_value_len = strlen (orig_value); - int add_len = strlen (add); - new_value = XMALLOC (char, add_len + orig_value_len + 1); - if (to_end) - { - strcpy (new_value, orig_value); - strcpy (new_value + orig_value_len, add); - } - else - { - strcpy (new_value, add); - strcpy (new_value + add_len, orig_value); - } - } - else - { - new_value = xstrdup (add); - } - return new_value; -} - -void -lt_update_exe_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - /* some systems can't cope with a ':'-terminated path #' */ - int len = strlen (new_value); - while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) - { - new_value[len-1] = '\0'; - } - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -void -lt_update_lib_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -EOF - case $host_os in - mingw*) - cat <<"EOF" - -/* Prepares an argument vector before calling spawn(). - Note that spawn() does not by itself call the command interpreter - (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : - ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&v); - v.dwPlatformId == VER_PLATFORM_WIN32_NT; - }) ? "cmd.exe" : "command.com"). - Instead it simply concatenates the arguments, separated by ' ', and calls - CreateProcess(). We must quote the arguments since Win32 CreateProcess() - interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a - special way: - - Space and tab are interpreted as delimiters. They are not treated as - delimiters if they are surrounded by double quotes: "...". - - Unescaped double quotes are removed from the input. Their only effect is - that within double quotes, space and tab are treated like normal - characters. - - Backslashes not followed by double quotes are not special. - - But 2*n+1 backslashes followed by a double quote become - n backslashes followed by a double quote (n >= 0): - \" -> " - \\\" -> \" - \\\\\" -> \\" - */ -#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -char ** -prepare_spawn (char **argv) -{ - size_t argc; - char **new_argv; - size_t i; - - /* Count number of arguments. */ - for (argc = 0; argv[argc] != NULL; argc++) - ; - - /* Allocate new argument vector. */ - new_argv = XMALLOC (char *, argc + 1); - - /* Put quoted arguments into the new argument vector. */ - for (i = 0; i < argc; i++) - { - const char *string = argv[i]; - - if (string[0] == '\0') - new_argv[i] = xstrdup ("\"\""); - else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) - { - int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); - size_t length; - unsigned int backslashes; - const char *s; - char *quoted_string; - char *p; - - length = 0; - backslashes = 0; - if (quote_around) - length++; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - length += backslashes + 1; - length++; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - length += backslashes + 1; - - quoted_string = XMALLOC (char, length + 1); - - p = quoted_string; - backslashes = 0; - if (quote_around) - *p++ = '"'; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - { - unsigned int j; - for (j = backslashes + 1; j > 0; j--) - *p++ = '\\'; - } - *p++ = c; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - { - unsigned int j; - for (j = backslashes; j > 0; j--) - *p++ = '\\'; - *p++ = '"'; - } - *p = '\0'; - - new_argv[i] = quoted_string; - } - else - new_argv[i] = (char *) string; - } - new_argv[argc] = NULL; - - return new_argv; -} -EOF - ;; - esac - - cat <<"EOF" -void lt_dump_script (FILE* f) -{ -EOF - func_emit_wrapper yes | - $SED -n -e ' -s/^\(.\{79\}\)\(..*\)/\1\ -\2/ -h -s/\([\\"]\)/\\\1/g -s/$/\\n/ -s/\([^\n]*\).*/ fputs ("\1", f);/p -g -D' - cat <<"EOF" -} -EOF -} -# end: func_emit_cwrapperexe_src - -# func_win32_import_lib_p ARG -# True if ARG is an import lib, as indicated by $file_magic_cmd -func_win32_import_lib_p () -{ - $opt_debug - case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in - *import*) : ;; - *) false ;; - esac -} - -# func_mode_link arg... -func_mode_link () -{ - $opt_debug - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - # It is impossible to link a dll without this setting, and - # we shouldn't force the makefile maintainer to figure out - # which system we are compiling for in order to pass an extra - # flag for every libtool invocation. - # allow_undefined=no - - # FIXME: Unfortunately, there are problems with the above when trying - # to make a dll which has undefined symbols, in which case not - # even a static library is built. For now, we need to specify - # -no-undefined on the libtool link line when we can be certain - # that all symbols are satisfied, otherwise we get a static library. - allow_undefined=yes - ;; - *) - allow_undefined=yes - ;; - esac - libtool_args=$nonopt - base_compile="$nonopt $@" - compile_command=$nonopt - finalize_command=$nonopt - - compile_rpath= - finalize_rpath= - compile_shlibpath= - finalize_shlibpath= - convenience= - old_convenience= - deplibs= - old_deplibs= - compiler_flags= - linker_flags= - dllsearchpath= - lib_search_path=`pwd` - inst_prefix_dir= - new_inherited_linker_flags= - - avoid_version=no - bindir= - dlfiles= - dlprefiles= - dlself=no - export_dynamic=no - export_symbols= - export_symbols_regex= - generated= - libobjs= - ltlibs= - module=no - no_install=no - objs= - non_pic_objects= - precious_files_regex= - prefer_static_libs=no - preload=no - prev= - prevarg= - release= - rpath= - xrpath= - perm_rpath= - temp_rpath= - thread_safe=no - vinfo= - vinfo_number=no - weak_libs= - single_module="${wl}-single_module" - func_infer_tag $base_compile - - # We need to know -static, to get the right output filenames. - for arg - do - case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - break - ;; - -all-static | -static | -static-libtool-libs) - case $arg in - -all-static) - if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then - func_warning "complete static linking is impossible in this configuration" - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - -static) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=built - ;; - -static-libtool-libs) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - esac - build_libtool_libs=no - build_old_libs=yes - break - ;; - esac - done - - # See if our shared archives depend on static archives. - test -n "$old_archive_from_new_cmds" && build_old_libs=yes - - # Go through the arguments, transforming them on the way. - while test "$#" -gt 0; do - arg="$1" - shift - func_quote_for_eval "$arg" - qarg=$func_quote_for_eval_unquoted_result - func_append libtool_args " $func_quote_for_eval_result" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - output) - func_append compile_command " @OUTPUT@" - func_append finalize_command " @OUTPUT@" - ;; - esac - - case $prev in - bindir) - bindir="$arg" - prev= - continue - ;; - dlfiles|dlprefiles) - if test "$preload" = no; then - # Add the symbol object into the linking commands. - func_append compile_command " @SYMFILE@" - func_append finalize_command " @SYMFILE@" - preload=yes - fi - case $arg in - *.la | *.lo) ;; # We handle these cases below. - force) - if test "$dlself" = no; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test "$prev" = dlprefiles; then - dlself=yes - elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test "$prev" = dlfiles; then - func_append dlfiles " $arg" - else - func_append dlprefiles " $arg" - fi - prev= - continue - ;; - esac - ;; - expsyms) - export_symbols="$arg" - test -f "$arg" \ - || func_fatal_error "symbol file \`$arg' does not exist" - prev= - continue - ;; - expsyms_regex) - export_symbols_regex="$arg" - prev= - continue - ;; - framework) - case $host in - *-*-darwin*) - case "$deplibs " in - *" $qarg.ltframework "*) ;; - *) func_append deplibs " $qarg.ltframework" # this is fixed later - ;; - esac - ;; - esac - prev= - continue - ;; - inst_prefix) - inst_prefix_dir="$arg" - prev= - continue - ;; - objectlist) - if test -f "$arg"; then - save_arg=$arg - moreargs= - for fil in `cat "$save_arg"` - do -# func_append moreargs " $fil" - arg=$fil - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool object" - fi - fi - done - else - func_fatal_error "link input file \`$arg' does not exist" - fi - arg=$save_arg - prev= - continue - ;; - precious_regex) - precious_files_regex="$arg" - prev= - continue - ;; - release) - release="-$arg" - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case $arg in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - if test "$prev" = rpath; then - case "$rpath " in - *" $arg "*) ;; - *) func_append rpath " $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) func_append xrpath " $arg" ;; - esac - fi - prev= - continue - ;; - shrext) - shrext_cmds="$arg" - prev= - continue - ;; - weak) - func_append weak_libs " $arg" - prev= - continue - ;; - xcclinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xcompiler) - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xlinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $wl$qarg" - prev= - func_append compile_command " $wl$qarg" - func_append finalize_command " $wl$qarg" - continue - ;; - *) - eval "$prev=\"\$arg\"" - prev= - continue - ;; - esac - fi # test -n "$prev" - - prevarg="$arg" - - case $arg in - -all-static) - if test -n "$link_static_flag"; then - # See comment for -static flag below, for more details. - func_append compile_command " $link_static_flag" - func_append finalize_command " $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - func_fatal_error "\`-allow-undefined' must not be used because it is the default" - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -bindir) - prev=bindir - continue - ;; - - -dlopen) - prev=dlfiles - continue - ;; - - -dlpreopen) - prev=dlprefiles - continue - ;; - - -export-dynamic) - export_dynamic=yes - continue - ;; - - -export-symbols | -export-symbols-regex) - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - func_fatal_error "more than one -exported-symbols argument is not allowed" - fi - if test "X$arg" = "X-export-symbols"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -framework) - prev=framework - continue - ;; - - -inst-prefix-dir) - prev=inst_prefix - continue - ;; - - # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* - # so, if we see these flags be careful not to treat them like -L - -L[A-Z][A-Z]*:*) - case $with_gcc/$host in - no/*-*-irix* | /*-*-irix*) - func_append compile_command " $arg" - func_append finalize_command " $arg" - ;; - esac - continue - ;; - - -L*) - func_stripname "-L" '' "$arg" - if test -z "$func_stripname_result"; then - if test "$#" -gt 0; then - func_fatal_error "require no space between \`-L' and \`$1'" - else - func_fatal_error "need path for \`-L' option" - fi - fi - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - test -z "$absdir" && \ - func_fatal_error "cannot determine absolute directory name of \`$dir'" - dir="$absdir" - ;; - esac - case "$deplibs " in - *" -L$dir "* | *" $arg "*) - # Will only happen for absolute or sysroot arguments - ;; - *) - # Preserve sysroot, but never include relative directories - case $dir in - [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; - *) func_append deplibs " -L$dir" ;; - esac - func_append lib_search_path " $dir" - ;; - esac - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$dir:"*) ;; - ::) dllsearchpath=$dir;; - *) func_append dllsearchpath ":$dir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; - esac - ;; - esac - continue - ;; - - -l*) - if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) - # These systems don't actually have a C or math library (as such) - continue - ;; - *-*-os2*) - # These systems don't actually have a C library (as such) - test "X$arg" = "X-lc" && continue - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - test "X$arg" = "X-lc" && continue - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C and math libraries are in the System framework - func_append deplibs " System.ltframework" - continue - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - test "X$arg" = "X-lc" && continue - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - test "X$arg" = "X-lc" && continue - ;; - esac - elif test "X$arg" = "X-lc_r"; then - case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc_r directly, use -pthread flag. - continue - ;; - esac - fi - func_append deplibs " $arg" - continue - ;; - - -module) - module=yes - continue - ;; - - # Tru64 UNIX uses -model [arg] to determine the layout of C++ - # classes, name mangling, and exception handling. - # Darwin uses the -arch flag to determine output architecture. - -model|-arch|-isysroot|--sysroot) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - prev=xcompiler - continue - ;; - - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - case "$new_inherited_linker_flags " in - *" $arg "*) ;; - * ) func_append new_inherited_linker_flags " $arg" ;; - esac - continue - ;; - - -multi_module) - single_module="${wl}-multi_module" - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) - # The PATH hackery in wrapper scripts is required on Windows - # and Darwin in order for the loader to find any dlls it needs. - func_warning "\`-no-install' is ignored for $host" - func_warning "assuming \`-no-fast-install' instead" - fast_install=no - ;; - *) no_install=yes ;; - esac - continue - ;; - - -no-undefined) - allow_undefined=no - continue - ;; - - -objectlist) - prev=objectlist - continue - ;; - - -o) prev=output ;; - - -precious-files-regex) - prev=precious_regex - continue - ;; - - -release) - prev=release - continue - ;; - - -rpath) - prev=rpath - continue - ;; - - -R) - prev=xrpath - continue - ;; - - -R*) - func_stripname '-R' '' "$arg" - dir=$func_stripname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - =*) - func_stripname '=' '' "$dir" - dir=$lt_sysroot$func_stripname_result - ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - continue - ;; - - -shared) - # The effects of -shared are defined in a previous loop. - continue - ;; - - -shrext) - prev=shrext - continue - ;; - - -static | -static-libtool-libs) - # The effects of -static are defined in a previous loop. - # We used to do the same as -all-static on platforms that - # didn't have a PIC flag, but the assumption that the effects - # would be equivalent was wrong. It would break on at least - # Digital Unix and AIX. - continue - ;; - - -thread-safe) - thread_safe=yes - continue - ;; - - -version-info) - prev=vinfo - continue - ;; - - -version-number) - prev=vinfo - vinfo_number=yes - continue - ;; - - -weak) - prev=weak - continue - ;; - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - func_quote_for_eval "$flag" - func_append arg " $func_quote_for_eval_result" - func_append compiler_flags " $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Wl,*) - func_stripname '-Wl,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - func_quote_for_eval "$flag" - func_append arg " $wl$func_quote_for_eval_result" - func_append compiler_flags " $wl$func_quote_for_eval_result" - func_append linker_flags " $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - -XCClinker) - prev=xcclinker - continue - ;; - - # -msg_* for osf cc - -msg_*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - # Flags to be passed through unchanged, with rationale: - # -64, -mips[0-9] enable 64-bit mode for the SGI compiler - # -r[0-9][0-9]* specify processor for the SGI compiler - # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler - # +DA*, +DD* enable 64-bit mode for the HP compiler - # -q* compiler args for the IBM compiler - # -m*, -t[45]*, -txscale* architecture-specific flags for GCC - # -F/path path to uninstalled frameworks, gcc on darwin - # -p, -pg, --coverage, -fprofile-* profiling flags for GCC - # @file GCC response files - # -tp=* Portland pgcc target processor selection - # --sysroot=* for sysroot support - # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization - -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ - -O*|-flto*|-fwhopr*|-fuse-linker-plugin) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - func_append compile_command " $arg" - func_append finalize_command " $arg" - func_append compiler_flags " $arg" - continue - ;; - - # Some other compiler flag. - -* | +*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - *.$objext) - # A standard object. - func_append objs " $arg" - ;; - - *.lo) - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool object" - fi - fi - ;; - - *.$libext) - # An archive. - func_append deplibs " $arg" - func_append old_deplibs " $arg" - continue - ;; - - *.la) - # A libtool-controlled library. - - func_resolve_sysroot "$arg" - if test "$prev" = dlfiles; then - # This library was specified with -dlopen. - func_append dlfiles " $func_resolve_sysroot_result" - prev= - elif test "$prev" = dlprefiles; then - # The library was specified with -dlpreopen. - func_append dlprefiles " $func_resolve_sysroot_result" - prev= - else - func_append deplibs " $func_resolve_sysroot_result" - fi - continue - ;; - - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - esac # arg - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - done # argument parsing loop - - test -n "$prev" && \ - func_fatal_help "the \`$prevarg' option requires an argument" - - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - func_basename "$output" - outputname="$func_basename_result" - libobjs_save="$libobjs" - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` - else - shlib_search_path= - fi - eval sys_lib_search_path=\"$sys_lib_search_path_spec\" - eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" - - func_dirname "$output" "/" "" - output_objdir="$func_dirname_result$objdir" - func_to_tool_file "$output_objdir/" - tool_output_objdir=$func_to_tool_file_result - # Create the object directory. - func_mkdir_p "$output_objdir" - - # Determine the type of output - case $output in - "") - func_fatal_help "you must specify an output file" - ;; - *.$libext) linkmode=oldlib ;; - *.lo | *.$objext) linkmode=obj ;; - *.la) linkmode=lib ;; - *) linkmode=prog ;; # Anything else should be a program. - esac - - specialdeplibs= - - libs= - # Find all interdependent deplibs by searching for libraries - # that are linked more than once (e.g. -la -lb -la) - for deplib in $deplibs; do - if $opt_preserve_dup_deps ; then - case "$libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append libs " $deplib" - done - - if test "$linkmode" = lib; then - libs="$predeps $libs $compiler_lib_search_path $postdeps" - - # Compute libraries that are listed more than once in $predeps - # $postdeps and mark them as special (i.e., whose duplicates are - # not to be eliminated). - pre_post_deps= - if $opt_duplicate_compiler_generated_deps; then - for pre_post_dep in $predeps $postdeps; do - case "$pre_post_deps " in - *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; - esac - func_append pre_post_deps " $pre_post_dep" - done - fi - pre_post_deps= - fi - - deplibs= - newdependency_libs= - newlib_search_path= - need_relink=no # whether we're linking any uninstalled libtool libraries - notinst_deplibs= # not-installed libtool libraries - notinst_path= # paths that contain not-installed libtool libraries - - case $linkmode in - lib) - passes="conv dlpreopen link" - for file in $dlfiles $dlprefiles; do - case $file in - *.la) ;; - *) - func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" - ;; - esac - done - ;; - prog) - compile_deplibs= - finalize_deplibs= - alldeplibs=no - newdlfiles= - newdlprefiles= - passes="conv scan dlopen dlpreopen link" - ;; - *) passes="conv" - ;; - esac - - for pass in $passes; do - # The preopen pass in lib mode reverses $deplibs; put it back here - # so that -L comes before libs that need it for instance... - if test "$linkmode,$pass" = "lib,link"; then - ## FIXME: Find the place where the list is rebuilt in the wrong - ## order, and fix it there properly - tmp_deplibs= - for deplib in $deplibs; do - tmp_deplibs="$deplib $tmp_deplibs" - done - deplibs="$tmp_deplibs" - fi - - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan"; then - libs="$deplibs" - deplibs= - fi - if test "$linkmode" = prog; then - case $pass in - dlopen) libs="$dlfiles" ;; - dlpreopen) libs="$dlprefiles" ;; - link) - libs="$deplibs %DEPLIBS%" - test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" - ;; - esac - fi - if test "$linkmode,$pass" = "lib,dlpreopen"; then - # Collect and forward deplibs of preopened libtool libs - for lib in $dlprefiles; do - # Ignore non-libtool-libs - dependency_libs= - func_resolve_sysroot "$lib" - case $lib in - *.la) func_source "$func_resolve_sysroot_result" ;; - esac - - # Collect preopened libtool deplibs, except any this library - # has declared as weak libs - for deplib in $dependency_libs; do - func_basename "$deplib" - deplib_base=$func_basename_result - case " $weak_libs " in - *" $deplib_base "*) ;; - *) func_append deplibs " $deplib" ;; - esac - done - done - libs="$dlprefiles" - fi - if test "$pass" = dlopen; then - # Collect dlpreopened libraries - save_deplibs="$deplibs" - deplibs= - fi - - for deplib in $libs; do - lib= - found=no - case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append compiler_flags " $deplib" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -l*) - if test "$linkmode" != lib && test "$linkmode" != prog; then - func_warning "\`-l' is ignored for archives/objects" - continue - fi - func_stripname '-l' '' "$deplib" - name=$func_stripname_result - if test "$linkmode" = lib; then - searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" - else - searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" - fi - for searchdir in $searchdirs; do - for search_ext in .la $std_shrext .so .a; do - # Search the libtool library - lib="$searchdir/lib${name}${search_ext}" - if test -f "$lib"; then - if test "$search_ext" = ".la"; then - found=yes - else - found=no - fi - break 2 - fi - done - done - if test "$found" != yes; then - # deplib doesn't seem to be a libtool library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - else # deplib is a libtool library - # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, - # We need to do some special things here, and not later. - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $deplib "*) - if func_lalib_p "$lib"; then - library_names= - old_library= - func_source "$lib" - for l in $old_library $library_names; do - ll="$l" - done - if test "X$ll" = "X$old_library" ; then # only static version available - found=no - func_dirname "$lib" "" "." - ladir="$func_dirname_result" - lib=$ladir/$old_library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - fi - ;; - *) ;; - esac - fi - fi - ;; # -l - *.ltframework) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - test "$pass" = conv && continue - newdependency_libs="$deplib $newdependency_libs" - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - prog) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - if test "$pass" = scan; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - *) - func_warning "\`-L' is ignored for archives/objects" - ;; - esac # linkmode - continue - ;; # -L - -R*) - if test "$pass" = link; then - func_stripname '-R' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # Make sure the xrpath contains only unique directories. - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - fi - deplibs="$deplib $deplibs" - continue - ;; - *.la) - func_resolve_sysroot "$deplib" - lib=$func_resolve_sysroot_result - ;; - *.$libext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - case $linkmode in - lib) - # Linking convenience modules into shared libraries is allowed, - # but linking other static libraries is non-portable. - case " $dlpreconveniencelibs " in - *" $deplib "*) ;; - *) - valid_a_lib=no - case $deplibs_check_method in - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ - | $EGREP "$match_pattern_regex" > /dev/null; then - valid_a_lib=yes - fi - ;; - pass_all) - valid_a_lib=yes - ;; - esac - if test "$valid_a_lib" != yes; then - echo - $ECHO "*** Warning: Trying to link with static lib archive $deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because the file extensions .$libext of this argument makes me believe" - echo "*** that it is just a static archive that I should not use here." - else - echo - $ECHO "*** Warning: Linking the shared library $output against the" - $ECHO "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - fi - ;; - esac - continue - ;; - prog) - if test "$pass" != link; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - continue - ;; - esac # linkmode - ;; # *.$libext - *.lo | *.$objext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - elif test "$linkmode" = prog; then - if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - func_append newdlprefiles " $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append newdlfiles " $deplib" - fi - fi - continue - ;; - %DEPLIBS%) - alldeplibs=yes - continue - ;; - esac # case $deplib - - if test "$found" = yes || test -f "$lib"; then : - else - func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" - fi - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$lib" \ - || func_fatal_error "\`$lib' is not a valid libtool archive" - - func_dirname "$lib" "" "." - ladir="$func_dirname_result" - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - inherited_linker_flags= - # If the library was installed with an old release of libtool, - # it will not redefine variables installed, or shouldnotlink - installed=yes - shouldnotlink=no - avoidtemprpath= - - - # Read the .la file - func_source "$lib" - - # Convert "-framework foo" to "foo.ltframework" - if test -n "$inherited_linker_flags"; then - tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` - for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do - case " $new_inherited_linker_flags " in - *" $tmp_inherited_linker_flag "*) ;; - *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; - esac - done - fi - dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan" || - { test "$linkmode" != prog && test "$linkmode" != lib; }; then - test -n "$dlopen" && func_append dlfiles " $dlopen" - test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" - fi - - if test "$pass" = conv; then - # Only check for convenience libraries - deplibs="$lib $deplibs" - if test -z "$libdir"; then - if test -z "$old_library"; then - func_fatal_error "cannot find name of link library for \`$lib'" - fi - # It is a libtool convenience library, so add in its objects. - func_append convenience " $ladir/$objdir/$old_library" - func_append old_convenience " $ladir/$objdir/$old_library" - tmp_libs= - for deplib in $dependency_libs; do - deplibs="$deplib $deplibs" - if $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done - elif test "$linkmode" != prog && test "$linkmode" != lib; then - func_fatal_error "\`$lib' is not a convenience library" - fi - continue - fi # $pass = conv - - - # Get the name of the library we link against. - linklib= - if test -n "$old_library" && - { test "$prefer_static_libs" = yes || - test "$prefer_static_libs,$installed" = "built,no"; }; then - linklib=$old_library - else - for l in $old_library $library_names; do - linklib="$l" - done - fi - if test -z "$linklib"; then - func_fatal_error "cannot find name of link library for \`$lib'" - fi - - # This library was specified with -dlopen. - if test "$pass" = dlopen; then - if test -z "$libdir"; then - func_fatal_error "cannot -dlopen a convenience library: \`$lib'" - fi - if test -z "$dlname" || - test "$dlopen_support" != yes || - test "$build_libtool_libs" = no; then - # If there is no dlname, no dlopen support or we're linking - # statically, we need to preload. We also need to preload any - # dependent libraries so libltdl's deplib preloader doesn't - # bomb out in the load deplibs phase. - func_append dlprefiles " $lib $dependency_libs" - else - func_append newdlfiles " $lib" - fi - continue - fi # $pass = dlopen - - # We need an absolute path. - case $ladir in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; - *) - abs_ladir=`cd "$ladir" && pwd` - if test -z "$abs_ladir"; then - func_warning "cannot determine absolute directory name of \`$ladir'" - func_warning "passing it literally to the linker, although it might fail" - abs_ladir="$ladir" - fi - ;; - esac - func_basename "$lib" - laname="$func_basename_result" - - # Find the relevant object directory and library name. - if test "X$installed" = Xyes; then - if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - func_warning "library \`$lib' was moved." - dir="$ladir" - absdir="$abs_ladir" - libdir="$abs_ladir" - else - dir="$lt_sysroot$libdir" - absdir="$lt_sysroot$libdir" - fi - test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes - else - if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then - dir="$ladir" - absdir="$abs_ladir" - # Remove this search path later - func_append notinst_path " $abs_ladir" - else - dir="$ladir/$objdir" - absdir="$abs_ladir/$objdir" - # Remove this search path later - func_append notinst_path " $abs_ladir" - fi - fi # $installed = yes - func_stripname 'lib' '.la' "$laname" - name=$func_stripname_result - - # This library was specified with -dlpreopen. - if test "$pass" = dlpreopen; then - if test -z "$libdir" && test "$linkmode" = prog; then - func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" - fi - case "$host" in - # special handling for platforms with PE-DLLs. - *cygwin* | *mingw* | *cegcc* ) - # Linker will automatically link against shared library if both - # static and shared are present. Therefore, ensure we extract - # symbols from the import library if a shared library is present - # (otherwise, the dlopen module name will be incorrect). We do - # this by putting the import library name into $newdlprefiles. - # We recover the dlopen module name by 'saving' the la file - # name in a special purpose variable, and (later) extracting the - # dlname from the la file. - if test -n "$dlname"; then - func_tr_sh "$dir/$linklib" - eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" - func_append newdlprefiles " $dir/$linklib" - else - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - fi - ;; - * ) - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - func_append newdlprefiles " $dir/$dlname" - else - func_append newdlprefiles " $dir/$linklib" - fi - ;; - esac - fi # $pass = dlpreopen - - if test -z "$libdir"; then - # Link the convenience library - if test "$linkmode" = lib; then - deplibs="$dir/$old_library $deplibs" - elif test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$dir/$old_library $compile_deplibs" - finalize_deplibs="$dir/$old_library $finalize_deplibs" - else - deplibs="$lib $deplibs" # used for prog,scan pass - fi - continue - fi - - - if test "$linkmode" = prog && test "$pass" != link; then - func_append newlib_search_path " $ladir" - deplibs="$lib $deplibs" - - linkalldeplibs=no - if test "$link_all_deplibs" != no || test -z "$library_names" || - test "$build_libtool_libs" = no; then - linkalldeplibs=yes - fi - - tmp_libs= - for deplib in $dependency_libs; do - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - esac - # Need to link against all dependency_libs? - if test "$linkalldeplibs" = yes; then - deplibs="$deplib $deplibs" - else - # Need to hardcode shared library paths - # or/and link against static libraries - newdependency_libs="$deplib $newdependency_libs" - fi - if $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done # for deplib - continue - fi # $linkmode = prog... - - if test "$linkmode,$pass" = "prog,link"; then - if test -n "$library_names" && - { { test "$prefer_static_libs" = no || - test "$prefer_static_libs,$installed" = "built,yes"; } || - test -z "$old_library"; }; then - # We need to hardcode the library path - if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then - # Make sure the rpath contains only unique directories. - case "$temp_rpath:" in - *"$absdir:"*) ;; - *) func_append temp_rpath "$absdir:" ;; - esac - fi - - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi # $linkmode,$pass = prog,link... - - if test "$alldeplibs" = yes && - { test "$deplibs_check_method" = pass_all || - { test "$build_libtool_libs" = yes && - test -n "$library_names"; }; }; then - # We only need to search for static libraries - continue - fi - fi - - link_static=no # Whether the deplib will be linked statically - use_static_libs=$prefer_static_libs - if test "$use_static_libs" = built && test "$installed" = yes; then - use_static_libs=no - fi - if test -n "$library_names" && - { test "$use_static_libs" = no || test -z "$old_library"; }; then - case $host in - *cygwin* | *mingw* | *cegcc*) - # No point in relinking DLLs because paths are not encoded - func_append notinst_deplibs " $lib" - need_relink=no - ;; - *) - if test "$installed" = no; then - func_append notinst_deplibs " $lib" - need_relink=yes - fi - ;; - esac - # This is a shared library - - # Warn about portability, can't link against -module's on some - # systems (darwin). Don't bleat about dlopened modules though! - dlopenmodule="" - for dlpremoduletest in $dlprefiles; do - if test "X$dlpremoduletest" = "X$lib"; then - dlopenmodule="$dlpremoduletest" - break - fi - done - if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then - echo - if test "$linkmode" = prog; then - $ECHO "*** Warning: Linking the executable $output against the loadable module" - else - $ECHO "*** Warning: Linking the shared library $output against the loadable module" - fi - $ECHO "*** $linklib is not portable!" - fi - if test "$linkmode" = lib && - test "$hardcode_into_libs" = yes; then - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi - - if test -n "$old_archive_from_expsyms_cmds"; then - # figure out the soname - set dummy $library_names - shift - realname="$1" - shift - libname=`eval "\\$ECHO \"$libname_spec\""` - # use dlname if we got it. it's perfectly good, no? - if test -n "$dlname"; then - soname="$dlname" - elif test -n "$soname_spec"; then - # bleh windows - case $host in - *cygwin* | mingw* | *cegcc*) - func_arith $current - $age - major=$func_arith_result - versuffix="-$major" - ;; - esac - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - - # Make a new name for the extract_expsyms_cmds to use - soroot="$soname" - func_basename "$soroot" - soname="$func_basename_result" - func_stripname 'lib' '.dll' "$soname" - newlib=libimp-$func_stripname_result.a - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - func_verbose "extracting exported symbol list from \`$soname'" - func_execute_cmds "$extract_expsyms_cmds" 'exit $?' - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - func_verbose "generating import library for \`$soname'" - func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' - fi - # make sure the library variables are pointing to the new library - dir=$output_objdir - linklib=$newlib - fi # test -n "$old_archive_from_expsyms_cmds" - - if test "$linkmode" = prog || test "$opt_mode" != relink; then - add_shlibpath= - add_dir= - add= - lib_linked=yes - case $hardcode_action in - immediate | unsupported) - if test "$hardcode_direct" = no; then - add="$dir/$linklib" - case $host in - *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; - *-*-sysv4*uw2*) add_dir="-L$dir" ;; - *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ - *-*-unixware7*) add_dir="-L$dir" ;; - *-*-darwin* ) - # if the lib is a (non-dlopened) module then we can not - # link against it, someone is ignoring the earlier warnings - if /usr/bin/file -L $add 2> /dev/null | - $GREP ": [^:]* bundle" >/dev/null ; then - if test "X$dlopenmodule" != "X$lib"; then - $ECHO "*** Warning: lib $linklib is a module, not a shared library" - if test -z "$old_library" ; then - echo - echo "*** And there doesn't seem to be a static archive available" - echo "*** The link will probably fail, sorry" - else - add="$dir/$old_library" - fi - elif test -n "$old_library"; then - add="$dir/$old_library" - fi - fi - esac - elif test "$hardcode_minus_L" = no; then - case $host in - *-*-sunos*) add_shlibpath="$dir" ;; - esac - add_dir="-L$dir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = no; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - relink) - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; then - add="$dir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$absdir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" - ;; - esac - fi - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - *) lib_linked=no ;; - esac - - if test "$lib_linked" != yes; then - func_fatal_configuration "unsupported hardcode properties" - fi - - if test -n "$add_shlibpath"; then - case :$compile_shlibpath: in - *":$add_shlibpath:"*) ;; - *) func_append compile_shlibpath "$add_shlibpath:" ;; - esac - fi - if test "$linkmode" = prog; then - test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" - test -n "$add" && compile_deplibs="$add $compile_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - if test "$hardcode_direct" != yes && - test "$hardcode_minus_L" != yes && - test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - fi - fi - fi - - if test "$linkmode" = prog || test "$opt_mode" = relink; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; then - add="$libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$libdir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - add="-l$name" - elif test "$hardcode_automatic" = yes; then - if test -n "$inst_prefix_dir" && - test -f "$inst_prefix_dir$libdir/$linklib" ; then - add="$inst_prefix_dir$libdir/$linklib" - else - add="$libdir/$linklib" - fi - else - # We cannot seem to hardcode it, guess we'll fake it. - add_dir="-L$libdir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" - ;; - esac - fi - add="-l$name" - fi - - if test "$linkmode" = prog; then - test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" - test -n "$add" && finalize_deplibs="$add $finalize_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - fi - fi - elif test "$linkmode" = prog; then - # Here we assume that one of hardcode_direct or hardcode_minus_L - # is not unsupported. This is valid on all known static and - # shared platforms. - if test "$hardcode_direct" != unsupported; then - test -n "$old_library" && linklib="$old_library" - compile_deplibs="$dir/$linklib $compile_deplibs" - finalize_deplibs="$dir/$linklib $finalize_deplibs" - else - compile_deplibs="-l$name -L$dir $compile_deplibs" - finalize_deplibs="-l$name -L$dir $finalize_deplibs" - fi - elif test "$build_libtool_libs" = yes; then - # Not a shared library - if test "$deplibs_check_method" != pass_all; then - # We're trying link a shared library against a static one - # but the system doesn't support it. - - # Just print a warning and add the library to dependency_libs so - # that the program can be linked against the static library. - echo - $ECHO "*** Warning: This system can not link to static lib archive $lib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - if test "$module" = yes; then - echo "*** But as you try to build a module library, libtool will still create " - echo "*** a static module, that should work as long as the dlopening application" - echo "*** is linked with the -dlopen flag to resolve symbols at runtime." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - else - deplibs="$dir/$old_library $deplibs" - link_static=yes - fi - fi # link shared/static library? - - if test "$linkmode" = lib; then - if test -n "$dependency_libs" && - { test "$hardcode_into_libs" != yes || - test "$build_old_libs" = yes || - test "$link_static" = yes; }; then - # Extract -R from dependency_libs - temp_deplibs= - for libdir in $dependency_libs; do - case $libdir in - -R*) func_stripname '-R' '' "$libdir" - temp_xrpath=$func_stripname_result - case " $xrpath " in - *" $temp_xrpath "*) ;; - *) func_append xrpath " $temp_xrpath";; - esac;; - *) func_append temp_deplibs " $libdir";; - esac - done - dependency_libs="$temp_deplibs" - fi - - func_append newlib_search_path " $absdir" - # Link against this library - test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" - # ... and its dependency_libs - tmp_libs= - for deplib in $dependency_libs; do - newdependency_libs="$deplib $newdependency_libs" - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result";; - *) func_resolve_sysroot "$deplib" ;; - esac - if $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $func_resolve_sysroot_result "*) - func_append specialdeplibs " $func_resolve_sysroot_result" ;; - esac - fi - func_append tmp_libs " $func_resolve_sysroot_result" - done - - if test "$link_all_deplibs" != no; then - # Add the search paths of all dependency libraries - for deplib in $dependency_libs; do - path= - case $deplib in - -L*) path="$deplib" ;; - *.la) - func_resolve_sysroot "$deplib" - deplib=$func_resolve_sysroot_result - func_dirname "$deplib" "" "." - dir=$func_dirname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - func_warning "cannot determine absolute directory name of \`$dir'" - absdir="$dir" - fi - ;; - esac - if $GREP "^installed=no" $deplib > /dev/null; then - case $host in - *-*-darwin*) - depdepl= - eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` - if test -n "$deplibrary_names" ; then - for tmp in $deplibrary_names ; do - depdepl=$tmp - done - if test -f "$absdir/$objdir/$depdepl" ; then - depdepl="$absdir/$objdir/$depdepl" - darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - if test -z "$darwin_install_name"; then - darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - fi - func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" - func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" - path= - fi - fi - ;; - *) - path="-L$absdir/$objdir" - ;; - esac - else - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - test "$absdir" != "$libdir" && \ - func_warning "\`$deplib' seems to be moved" - - path="-L$absdir" - fi - ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$path $deplibs" ;; - esac - done - fi # link_all_deplibs != no - fi # linkmode = lib - done # for deplib in $libs - if test "$pass" = link; then - if test "$linkmode" = "prog"; then - compile_deplibs="$new_inherited_linker_flags $compile_deplibs" - finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" - else - compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - fi - fi - dependency_libs="$newdependency_libs" - if test "$pass" = dlpreopen; then - # Link the dlpreopened libraries before other libraries - for deplib in $save_deplibs; do - deplibs="$deplib $deplibs" - done - fi - if test "$pass" != dlopen; then - if test "$pass" != conv; then - # Make sure lib_search_path contains only unique directories. - lib_search_path= - for dir in $newlib_search_path; do - case "$lib_search_path " in - *" $dir "*) ;; - *) func_append lib_search_path " $dir" ;; - esac - done - newlib_search_path= - fi - - if test "$linkmode,$pass" != "prog,link"; then - vars="deplibs" - else - vars="compile_deplibs finalize_deplibs" - fi - for var in $vars dependency_libs; do - # Add libraries to $var in reverse order - eval tmp_libs=\"\$$var\" - new_libs= - for deplib in $tmp_libs; do - # FIXME: Pedantically, this is the right thing to do, so - # that some nasty dependency loop isn't accidentally - # broken: - #new_libs="$deplib $new_libs" - # Pragmatically, this seems to cause very few problems in - # practice: - case $deplib in - -L*) new_libs="$deplib $new_libs" ;; - -R*) ;; - *) - # And here is the reason: when a library appears more - # than once as an explicit dependence of a library, or - # is implicitly linked in more than once by the - # compiler, it is considered special, and multiple - # occurrences thereof are not removed. Compare this - # with having the same library being listed as a - # dependency of multiple other libraries: in this case, - # we know (pedantically, we assume) the library does not - # need to be listed more than once, so we keep only the - # last copy. This is not always right, but it is rare - # enough that we require users that really mean to play - # such unportable linking tricks to link the library - # using -Wl,-lname, so that libtool does not consider it - # for duplicate removal. - case " $specialdeplibs " in - *" $deplib "*) new_libs="$deplib $new_libs" ;; - *) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$deplib $new_libs" ;; - esac - ;; - esac - ;; - esac - done - tmp_libs= - for deplib in $new_libs; do - case $deplib in - -L*) - case " $tmp_libs " in - *" $deplib "*) ;; - *) func_append tmp_libs " $deplib" ;; - esac - ;; - *) func_append tmp_libs " $deplib" ;; - esac - done - eval $var=\"$tmp_libs\" - done # for var - fi - # Last step: remove runtime libs from dependency_libs - # (they stay in deplibs) - tmp_libs= - for i in $dependency_libs ; do - case " $predeps $postdeps $compiler_lib_search_path " in - *" $i "*) - i="" - ;; - esac - if test -n "$i" ; then - func_append tmp_libs " $i" - fi - done - dependency_libs=$tmp_libs - done # for pass - if test "$linkmode" = prog; then - dlfiles="$newdlfiles" - fi - if test "$linkmode" = prog || test "$linkmode" = lib; then - dlprefiles="$newdlprefiles" - fi - - case $linkmode in - oldlib) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for archives" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for archives" ;; - esac - - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for archives" - - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for archives" - - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for archives" - - test -n "$release" && \ - func_warning "\`-release' is ignored for archives" - - test -n "$export_symbols$export_symbols_regex" && \ - func_warning "\`-export-symbols' is ignored for archives" - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs="$output" - func_append objs "$old_deplibs" - ;; - - lib) - # Make sure we only generate libraries of the form `libNAME.la'. - case $outputname in - lib*) - func_stripname 'lib' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - ;; - *) - test "$module" = no && \ - func_fatal_help "libtool library \`$output' must begin with \`lib'" - - if test "$need_lib_prefix" != no; then - # Add the "lib" prefix for modules if required - func_stripname '' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - else - func_stripname '' '.la' "$outputname" - libname=$func_stripname_result - fi - ;; - esac - - if test -n "$objs"; then - if test "$deplibs_check_method" != pass_all; then - func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" - else - echo - $ECHO "*** Warning: Linking the shared library $output against the non-libtool" - $ECHO "*** objects $objs is not portable!" - func_append libobjs " $objs" - fi - fi - - test "$dlself" != no && \ - func_warning "\`-dlopen self' is ignored for libtool libraries" - - set dummy $rpath - shift - test "$#" -gt 1 && \ - func_warning "ignoring multiple \`-rpath's for a libtool library" - - install_libdir="$1" - - oldlibs= - if test -z "$rpath"; then - if test "$build_libtool_libs" = yes; then - # Building a libtool convenience library. - # Some compilers have problems with a `.al' extension so - # convenience libraries should have the same extension an - # archive normally would. - oldlibs="$output_objdir/$libname.$libext $oldlibs" - build_libtool_libs=convenience - build_old_libs=yes - fi - - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for convenience libraries" - - test -n "$release" && \ - func_warning "\`-release' is ignored for convenience libraries" - else - - # Parse the version information argument. - save_ifs="$IFS"; IFS=':' - set dummy $vinfo 0 0 0 - shift - IFS="$save_ifs" - - test -n "$7" && \ - func_fatal_help "too many parameters to \`-version-info'" - - # convert absolute version numbers to libtool ages - # this retains compatibility with .la files and attempts - # to make the code below a bit more comprehensible - - case $vinfo_number in - yes) - number_major="$1" - number_minor="$2" - number_revision="$3" - # - # There are really only two kinds -- those that - # use the current revision as the major version - # and those that subtract age and use age as - # a minor version. But, then there is irix - # which has an extra 1 added just for fun - # - case $version_type in - # correct linux to gnu/linux during the next big refactor - darwin|linux|osf|windows|none) - func_arith $number_major + $number_minor - current=$func_arith_result - age="$number_minor" - revision="$number_revision" - ;; - freebsd-aout|freebsd-elf|qnx|sunos) - current="$number_major" - revision="$number_minor" - age="0" - ;; - irix|nonstopux) - func_arith $number_major + $number_minor - current=$func_arith_result - age="$number_minor" - revision="$number_minor" - lt_irix_increment=no - ;; - *) - func_fatal_configuration "$modename: unknown library version type \`$version_type'" - ;; - esac - ;; - no) - current="$1" - revision="$2" - age="$3" - ;; - esac - - # Check that each of the things are valid numbers. - case $current in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "CURRENT \`$current' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - case $revision in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "REVISION \`$revision' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - case $age in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "AGE \`$age' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - if test "$age" -gt "$current"; then - func_error "AGE \`$age' is greater than the current interface number \`$current'" - func_fatal_error "\`$vinfo' is not valid version information" - fi - - # Calculate the version variables. - major= - versuffix= - verstring= - case $version_type in - none) ;; - - darwin) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - func_arith $current - $age - major=.$func_arith_result - versuffix="$major.$age.$revision" - # Darwin ld doesn't like 0 for these options... - func_arith $current + 1 - minor_current=$func_arith_result - xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - - freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; - ;; - - freebsd-elf) - major=".$current" - versuffix=".$current" - ;; - - irix | nonstopux) - if test "X$lt_irix_increment" = "Xno"; then - func_arith $current - $age - else - func_arith $current - $age + 1 - fi - major=$func_arith_result - - case $version_type in - nonstopux) verstring_prefix=nonstopux ;; - *) verstring_prefix=sgi ;; - esac - verstring="$verstring_prefix$major.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$revision - while test "$loop" -ne 0; do - func_arith $revision - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring="$verstring_prefix$major.$iface:$verstring" - done - - # Before this point, $major must not contain `.'. - major=.$major - versuffix="$major.$revision" - ;; - - linux) # correct to gnu/linux during the next big refactor - func_arith $current - $age - major=.$func_arith_result - versuffix="$major.$age.$revision" - ;; - - osf) - func_arith $current - $age - major=.$func_arith_result - versuffix=".$current.$age.$revision" - verstring="$current.$age.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$age - while test "$loop" -ne 0; do - func_arith $current - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring="$verstring:${iface}.0" - done - - # Make executables depend on our current version. - func_append verstring ":${current}.0" - ;; - - qnx) - major=".$current" - versuffix=".$current" - ;; - - sunos) - major=".$current" - versuffix=".$current.$revision" - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 filesystems. - func_arith $current - $age - major=$func_arith_result - versuffix="-$major" - ;; - - *) - func_fatal_configuration "unknown library version type \`$version_type'" - ;; - esac - - # Clear the version info if we defaulted, and they specified a release. - if test -z "$vinfo" && test -n "$release"; then - major= - case $version_type in - darwin) - # we can't check for "0.0" in archive_cmds due to quoting - # problems, so we reset it completely - verstring= - ;; - *) - verstring="0.0" - ;; - esac - if test "$need_version" = no; then - versuffix= - else - versuffix=".0.0" - fi - fi - - # Remove version info from name if versioning should be avoided - if test "$avoid_version" = yes && test "$need_version" = no; then - major= - versuffix= - verstring="" - fi - - # Check to see if the archive will have undefined symbols. - if test "$allow_undefined" = yes; then - if test "$allow_undefined_flag" = unsupported; then - func_warning "undefined symbols not allowed in $host shared libraries" - build_libtool_libs=no - build_old_libs=yes - fi - else - # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" - fi - - fi - - func_generate_dlsyms "$libname" "$libname" "yes" - func_append libobjs " $symfileobj" - test "X$libobjs" = "X " && libobjs= - - if test "$opt_mode" != relink; then - # Remove our outputs, but don't remove object files since they - # may have been created when compiling PIC objects. - removelist= - tempremovelist=`$ECHO "$output_objdir/*"` - for p in $tempremovelist; do - case $p in - *.$objext | *.gcno) - ;; - $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) - if test "X$precious_files_regex" != "X"; then - if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 - then - continue - fi - fi - func_append removelist " $p" - ;; - *) ;; - esac - done - test -n "$removelist" && \ - func_show_eval "${RM}r \$removelist" - fi - - # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - func_append oldlibs " $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` - fi - - # Eliminate all temporary directories. - #for path in $notinst_path; do - # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` - # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` - # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` - #done - - if test -n "$xrpath"; then - # If the user specified any rpath flags, then add them. - temp_xrpath= - for libdir in $xrpath; do - func_replace_sysroot "$libdir" - func_append temp_xrpath " -R$func_replace_sysroot_result" - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - done - if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then - dependency_libs="$temp_xrpath $dependency_libs" - fi - fi - - # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles="$dlfiles" - dlfiles= - for lib in $old_dlfiles; do - case " $dlprefiles $dlfiles " in - *" $lib "*) ;; - *) func_append dlfiles " $lib" ;; - esac - done - - # Make sure dlprefiles contains only unique files - old_dlprefiles="$dlprefiles" - dlprefiles= - for lib in $old_dlprefiles; do - case "$dlprefiles " in - *" $lib "*) ;; - *) func_append dlprefiles " $lib" ;; - esac - done - - if test "$build_libtool_libs" = yes; then - if test -n "$rpath"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) - # these systems don't actually have a c library (as such)! - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C library is in the System framework - func_append deplibs " System.ltframework" - ;; - *-*-netbsd*) - # Don't link with libc until the a.out ld.so is fixed. - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - ;; - *) - # Add libc to deplibs on all other systems if necessary. - if test "$build_libtool_need_lc" = "yes"; then - func_append deplibs " -lc" - fi - ;; - esac - fi - - # Transform deplibs into only deplibs that can be linked in shared. - name_save=$name - libname_save=$libname - release_save=$release - versuffix_save=$versuffix - major_save=$major - # I'm not sure if I'm treating the release correctly. I think - # release should show up in the -l (ie -lgmp5) so we don't want to - # add it in twice. Is that correct? - release="" - versuffix="" - major="" - newdeplibs= - droppeddeps=no - case $deplibs_check_method in - pass_all) - # Don't check for shared/static. Everything works. - # This might be a little naive. We might want to check - # whether the library exists or not. But this is on - # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behavior. - newdeplibs=$deplibs - ;; - test_compile) - # This code stresses the "libraries are programs" paradigm to its - # limits. Maybe even breaks it. We compile a program, linking it - # against the deplibs as a proxy for the library. Then we can check - # whether they linked in statically or dynamically with ldd. - $opt_dry_run || $RM conftest.c - cat > conftest.c </dev/null` - $nocaseglob - else - potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` - fi - for potent_lib in $potential_libs; do - # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null | - $GREP " -> " >/dev/null; then - continue - fi - # The statement above tries to avoid entering an - # endless loop below, in case of cyclic links. - # We might still enter an endless loop, since a link - # loop can be closed while we follow links, - # but so what? - potlib="$potent_lib" - while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` - case $potliblink in - [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; - esac - done - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | - $SED -e 10q | - $EGREP "$file_magic_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - $ECHO "*** with $libname but no candidates were found. (...for file magic test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a file magic. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $a_deplib "*) - func_append newdeplibs " $a_deplib" - a_deplib="" - ;; - esac - fi - if test -n "$a_deplib" ; then - libname=`eval "\\$ECHO \"$libname_spec\""` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - potlib="$potent_lib" # see symlink-check above in file_magic test - if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ - $EGREP "$match_pattern_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a regex pattern. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs="" - tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - for i in $predeps $postdeps ; do - # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` - done - fi - case $tmp_deplibs in - *[!\ \ ]*) - echo - if test "X$deplibs_check_method" = "Xnone"; then - echo "*** Warning: inter-library dependencies are not supported in this platform." - else - echo "*** Warning: inter-library dependencies are not known to be supported." - fi - echo "*** All declared inter-library dependencies are being dropped." - droppeddeps=yes - ;; - esac - ;; - esac - versuffix=$versuffix_save - major=$major_save - release=$release_save - libname=$libname_save - name=$name_save - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library with the System framework - newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - if test "$droppeddeps" = yes; then - if test "$module" = yes; then - echo - echo "*** Warning: libtool could not satisfy all declared inter-library" - $ECHO "*** dependencies of module $libname. Therefore, libtool will create" - echo "*** a static module, that should work as long as the dlopening" - echo "*** application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - else - echo "*** The inter-library dependencies that have been dropped here will be" - echo "*** automatically added whenever a program is linked with this library" - echo "*** or is declared to -dlopen it." - - if test "$allow_undefined" = no; then - echo - echo "*** Since this library must not contain undefined symbols," - echo "*** because either the platform does not support them or" - echo "*** it was explicitly requested with -no-undefined," - echo "*** libtool will only create a static version of it." - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - fi - fi - # Done checking deplibs! - deplibs=$newdeplibs - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - case $host in - *-*-darwin*) - newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - deplibs="$new_libs" - - # All the library-specific variables (install_libdir is set above). - library_names= - old_library= - dlname= - - # Test again, we may have decided not to build it any more - if test "$build_libtool_libs" = yes; then - # Remove ${wl} instances when linking with ld. - # FIXME: should test the right _cmds variable. - case $archive_cmds in - *\$LD\ *) wl= ;; - esac - if test "$hardcode_into_libs" = yes; then - # Hardcode the library paths - hardcode_libdirs= - dep_rpath= - rpath="$finalize_rpath" - test "$opt_mode" != relink && rpath="$compile_rpath$rpath" - for libdir in $rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - func_replace_sysroot "$libdir" - libdir=$func_replace_sysroot_result - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append dep_rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" - fi - if test -n "$runpath_var" && test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - func_append rpath "$dir:" - done - eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" - fi - test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" - fi - - shlibpath="$finalize_shlibpath" - test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" - if test -n "$shlibpath"; then - eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" - fi - - # Get the real and link names of the library. - eval shared_ext=\"$shrext_cmds\" - eval library_names=\"$library_names_spec\" - set dummy $library_names - shift - realname="$1" - shift - - if test -n "$soname_spec"; then - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - if test -z "$dlname"; then - dlname=$soname - fi - - lib="$output_objdir/$realname" - linknames= - for link - do - func_append linknames " $link" - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` - test "X$libobjs" = "X " && libobjs= - - delfiles= - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" - export_symbols="$output_objdir/$libname.uexp" - func_append delfiles " $export_symbols" - fi - - orig_export_symbols= - case $host_os in - cygwin* | mingw* | cegcc*) - if test -n "$export_symbols" && test -z "$export_symbols_regex"; then - # exporting using user supplied symfile - if test "x`$SED 1q $export_symbols`" != xEXPORTS; then - # and it's NOT already a .def file. Must figure out - # which of the given symbols are data symbols and tag - # them as such. So, trigger use of export_symbols_cmds. - # export_symbols gets reassigned inside the "prepare - # the list of exported symbols" if statement, so the - # include_expsyms logic still works. - orig_export_symbols="$export_symbols" - export_symbols= - always_export_symbols=yes - fi - fi - ;; - esac - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - cmds=$export_symbols_cmds - save_ifs="$IFS"; IFS='~' - for cmd1 in $cmds; do - IFS="$save_ifs" - # Take the normal branch if the nm_file_list_spec branch - # doesn't work or if tool conversion is not needed. - case $nm_file_list_spec~$to_tool_file_cmd in - *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) - try_normal_branch=yes - eval cmd=\"$cmd1\" - func_len " $cmd" - len=$func_len_result - ;; - *) - try_normal_branch=no - ;; - esac - if test "$try_normal_branch" = yes \ - && { test "$len" -lt "$max_cmd_len" \ - || test "$max_cmd_len" -le -1; } - then - func_show_eval "$cmd" 'exit $?' - skipped_export=false - elif test -n "$nm_file_list_spec"; then - func_basename "$output" - output_la=$func_basename_result - save_libobjs=$libobjs - save_output=$output - output=${output_objdir}/${output_la}.nm - func_to_tool_file "$output" - libobjs=$nm_file_list_spec$func_to_tool_file_result - func_append delfiles " $output" - func_verbose "creating $NM input file list: $output" - for obj in $save_libobjs; do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > "$output" - eval cmd=\"$cmd1\" - func_show_eval "$cmd" 'exit $?' - output=$save_output - libobjs=$save_libobjs - skipped_export=false - else - # The command line is too long to execute in one step. - func_verbose "using reloadable object file for export list..." - skipped_export=: - # Break out early, otherwise skipped_export may be - # set to false by a later but shorter cmd. - break - fi - done - IFS="$save_ifs" - if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - - tmp_deplibs= - for test_deplib in $deplibs; do - case " $convenience " in - *" $test_deplib "*) ;; - *) - func_append tmp_deplibs " $test_deplib" - ;; - esac - done - deplibs="$tmp_deplibs" - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec" && - test "$compiler_needs_object" = yes && - test -z "$libobjs"; then - # extract the archives, so we have objects to list. - # TODO: could optimize this to just extract one archive. - whole_archive_flag_spec= - fi - if test -n "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - else - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - fi - - if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then - eval flag=\"$thread_safe_flag_spec\" - func_append linker_flags " $flag" - fi - - # Make a backup of the uninstalled library when relinking - if test "$opt_mode" = relink; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? - fi - - # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - eval test_cmds=\"$module_expsym_cmds\" - cmds=$module_expsym_cmds - else - eval test_cmds=\"$module_cmds\" - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval test_cmds=\"$archive_expsym_cmds\" - cmds=$archive_expsym_cmds - else - eval test_cmds=\"$archive_cmds\" - cmds=$archive_cmds - fi - fi - - if test "X$skipped_export" != "X:" && - func_len " $test_cmds" && - len=$func_len_result && - test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # The command line is too long to link in one step, link piecewise - # or, if using GNU ld and skipped_export is not :, use a linker - # script. - - # Save the value of $output and $libobjs because we want to - # use them later. If we have whole_archive_flag_spec, we - # want to use save_libobjs as it was before - # whole_archive_flag_spec was expanded, because we can't - # assume the linker understands whole_archive_flag_spec. - # This may have to be revisited, in case too many - # convenience libraries get linked in and end up exceeding - # the spec. - if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - fi - save_output=$output - func_basename "$output" - output_la=$func_basename_result - - # Clear the reloadable object creation command queue and - # initialize k to one. - test_cmds= - concat_cmds= - objlist= - last_robj= - k=1 - - if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then - output=${output_objdir}/${output_la}.lnkscript - func_verbose "creating GNU ld script: $output" - echo 'INPUT (' > $output - for obj in $save_libobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - echo ')' >> $output - func_append delfiles " $output" - func_to_tool_file "$output" - output=$func_to_tool_file_result - elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then - output=${output_objdir}/${output_la}.lnk - func_verbose "creating linker input file list: $output" - : > $output - set x $save_libobjs - shift - firstobj= - if test "$compiler_needs_object" = yes; then - firstobj="$1 " - shift - fi - for obj - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - func_append delfiles " $output" - func_to_tool_file "$output" - output=$firstobj\"$file_list_spec$func_to_tool_file_result\" - else - if test -n "$save_libobjs"; then - func_verbose "creating reloadable object files..." - output=$output_objdir/$output_la-${k}.$objext - eval test_cmds=\"$reload_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - if test "X$objlist" = X || - test "$len" -lt "$max_cmd_len"; then - func_append objlist " $obj" - else - # The command $test_cmds is almost too long, add a - # command to the queue. - if test "$k" -eq 1 ; then - # The first file doesn't have a previous command to add. - reload_objs=$objlist - eval concat_cmds=\"$reload_cmds\" - else - # All subsequent reloadable object files will link in - # the last one created. - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" - fi - last_robj=$output_objdir/$output_la-${k}.$objext - func_arith $k + 1 - k=$func_arith_result - output=$output_objdir/$output_la-${k}.$objext - objlist=" $obj" - func_len " $last_robj" - func_arith $len0 + $func_len_result - len=$func_arith_result - fi - done - # Handle the remaining objects by creating one last - # reloadable object file. All subsequent reloadable object - # files will link in the last one created. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\${concat_cmds}$reload_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" - fi - func_append delfiles " $output" - - else - output= - fi - - if ${skipped_export-false}; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - libobjs=$output - # Append the command to create the export file. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" - fi - fi - - test -n "$save_libobjs" && - func_verbose "creating a temporary reloadable object file: $output" - - # Loop through the commands generated above and execute them. - save_ifs="$IFS"; IFS='~' - for cmd in $concat_cmds; do - IFS="$save_ifs" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - - if test -n "$export_symbols_regex" && ${skipped_export-false}; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - - if ${skipped_export-false}; then - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - fi - - libobjs=$output - # Restore the value of output. - output=$save_output - - if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - fi - # Expand the library linking commands again to reset the - # value of $libobjs for piecewise linking. - - # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - cmds=$module_expsym_cmds - else - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - cmds=$archive_expsym_cmds - else - cmds=$archive_cmds - fi - fi - fi - - if test -n "$delfiles"; then - # Append the command to remove temporary files to $cmds. - eval cmds=\"\$cmds~\$RM $delfiles\" - fi - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? - - if test -n "$convenience"; then - if test -z "$whole_archive_flag_spec"; then - func_show_eval '${RM}r "$gentop"' - fi - fi - - exit $EXIT_SUCCESS - fi - - # Create links to the real library. - for linkname in $linknames; do - if test "$realname" != "$linkname"; then - func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' - fi - done - - # If -module or -export-dynamic was specified, set the dlname. - if test "$module" = yes || test "$export_dynamic" = yes; then - # On all known operating systems, these are identical. - dlname="$soname" - fi - fi - ;; - - obj) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for objects" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for objects" ;; - esac - - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for objects" - - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for objects" - - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for objects" - - test -n "$release" && \ - func_warning "\`-release' is ignored for objects" - - case $output in - *.lo) - test -n "$objs$old_deplibs" && \ - func_fatal_error "cannot build library object \`$output' from non-libtool objects" - - libobj=$output - func_lo2o "$libobj" - obj=$func_lo2o_result - ;; - *) - libobj= - obj="$output" - ;; - esac - - # Delete the old objects. - $opt_dry_run || $RM $obj $libobj - - # Objects from convenience libraries. This assumes - # single-version convenience libraries. Whenever we create - # different ones for PIC/non-PIC, this we'll have to duplicate - # the extraction. - reload_conv_objs= - gentop= - # reload_cmds runs $LD directly, so let us get rid of - # -Wl from whole_archive_flag_spec and hope we can get by with - # turning comma into space.. - wl= - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` - else - gentop="$output_objdir/${obj}x" - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - reload_conv_objs="$reload_objs $func_extract_archives_result" - fi - fi - - # If we're not building shared, we need to use non_pic_objs - test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" - - # Create the old-style object. - reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test - - output="$obj" - func_execute_cmds "$reload_cmds" 'exit $?' - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - fi - - if test "$build_libtool_libs" != yes; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - # Create an invalid libtool object if no PIC, so that we don't - # accidentally link it into a program. - # $show "echo timestamp > $libobj" - # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? - exit $EXIT_SUCCESS - fi - - if test -n "$pic_flag" || test "$pic_mode" != default; then - # Only do commands if we really have different PIC objects. - reload_objs="$libobjs $reload_conv_objs" - output="$libobj" - func_execute_cmds "$reload_cmds" 'exit $?' - fi - - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - ;; - - prog) - case $host in - *cygwin*) func_stripname '' '.exe' "$output" - output=$func_stripname_result.exe;; - esac - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for programs" - - test -n "$release" && \ - func_warning "\`-release' is ignored for programs" - - test "$preload" = yes \ - && test "$dlopen_support" = unknown \ - && test "$dlopen_self" = unknown \ - && test "$dlopen_self_static" = unknown && \ - func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - case $host in - *-*-darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - # But is supposedly fixed on 10.4 or later (yay!). - if test "$tagname" = CXX ; then - case ${MACOSX_DEPLOYMENT_TARGET-10.0} in - 10.[0123]) - func_append compile_command " ${wl}-bind_at_load" - func_append finalize_command " ${wl}-bind_at_load" - ;; - esac - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $compile_deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $compile_deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - compile_deplibs="$new_libs" - - - func_append compile_command " $compile_deplibs" - func_append finalize_command " $finalize_deplibs" - - if test -n "$rpath$xrpath"; then - # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; - esac - fi - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$libdir:"*) ;; - ::) dllsearchpath=$libdir;; - *) func_append dllsearchpath ":$libdir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; - esac - ;; - esac - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - compile_rpath="$rpath" - - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) func_append finalize_perm_rpath " $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - finalize_rpath="$rpath" - - if test -n "$libobjs" && test "$build_old_libs" = yes; then - # Transform all the library objects into standard objects. - compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - fi - - func_generate_dlsyms "$outputname" "@PROGRAM@" "no" - - # template prelinking step - if test -n "$prelink_cmds"; then - func_execute_cmds "$prelink_cmds" 'exit $?' - fi - - wrappers_required=yes - case $host in - *cegcc* | *mingw32ce*) - # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. - wrappers_required=no - ;; - *cygwin* | *mingw* ) - if test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - *) - if test "$need_relink" = no || test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - esac - if test "$wrappers_required" = no; then - # Replace the output file specification. - compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - link_command="$compile_command$compile_rpath" - - # We have no uninstalled library dependencies, so finalize right now. - exit_status=0 - func_show_eval "$link_command" 'exit_status=$?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Delete the generated files. - if test -f "$output_objdir/${outputname}S.${objext}"; then - func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' - fi - - exit $exit_status - fi - - if test -n "$compile_shlibpath$finalize_shlibpath"; then - compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" - fi - if test -n "$finalize_shlibpath"; then - finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" - fi - - compile_var= - finalize_var= - if test -n "$runpath_var"; then - if test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - func_append rpath "$dir:" - done - compile_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - if test -n "$finalize_perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $finalize_perm_rpath; do - func_append rpath "$dir:" - done - finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - fi - - if test "$no_install" = yes; then - # We don't need to create a wrapper script. - link_command="$compile_var$compile_command$compile_rpath" - # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - # Delete the old output file. - $opt_dry_run || $RM $output - # Link the executable and exit - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - exit $EXIT_SUCCESS - fi - - if test "$hardcode_action" = relink; then - # Fast installation is not supported - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - - func_warning "this platform does not like uninstalled shared libraries" - func_warning "\`$output' will be relinked during installation" - else - if test "$fast_install" != no; then - link_command="$finalize_var$compile_command$finalize_rpath" - if test "$fast_install" = yes; then - relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` - else - # fast_install is set to needless - relink_command= - fi - else - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - fi - fi - - # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname - - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output_objdir/$outputname" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Now create the wrapper script. - func_verbose "creating $output" - - # Quote the relink command for shipping. - if test -n "$relink_command"; then - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" - fi - done - relink_command="(cd `pwd`; $relink_command)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` - fi - - # Only actually do things if not in dry run mode. - $opt_dry_run || { - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) func_stripname '' '.exe' "$output" - output=$func_stripname_result ;; - esac - # test for cygwin because mv fails w/o .exe extensions - case $host in - *cygwin*) - exeext=.exe - func_stripname '' '.exe' "$outputname" - outputname=$func_stripname_result ;; - *) exeext= ;; - esac - case $host in - *cygwin* | *mingw* ) - func_dirname_and_basename "$output" "" "." - output_name=$func_basename_result - output_path=$func_dirname_result - cwrappersource="$output_path/$objdir/lt-$output_name.c" - cwrapper="$output_path/$output_name.exe" - $RM $cwrappersource $cwrapper - trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 - - func_emit_cwrapperexe_src > $cwrappersource - - # The wrapper executable is built using the $host compiler, - # because it contains $host paths and files. If cross- - # compiling, it, like the target executable, must be - # executed on the $host or under an emulation environment. - $opt_dry_run || { - $LTCC $LTCFLAGS -o $cwrapper $cwrappersource - $STRIP $cwrapper - } - - # Now, create the wrapper script for func_source use: - func_ltwrapper_scriptname $cwrapper - $RM $func_ltwrapper_scriptname_result - trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 - $opt_dry_run || { - # note: this script will not be executed, so do not chmod. - if test "x$build" = "x$host" ; then - $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result - else - func_emit_wrapper no > $func_ltwrapper_scriptname_result - fi - } - ;; - * ) - $RM $output - trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 - - func_emit_wrapper no > $output - chmod +x $output - ;; - esac - } - exit $EXIT_SUCCESS - ;; - esac - - # See if we need to build an old-fashioned archive. - for oldlib in $oldlibs; do - - if test "$build_libtool_libs" = convenience; then - oldobjs="$libobjs_save $symfileobj" - addlibs="$convenience" - build_libtool_libs=no - else - if test "$build_libtool_libs" = module; then - oldobjs="$libobjs_save" - build_libtool_libs=no - else - oldobjs="$old_deplibs $non_pic_objects" - if test "$preload" = yes && test -f "$symfileobj"; then - func_append oldobjs " $symfileobj" - fi - fi - addlibs="$old_convenience" - fi - - if test -n "$addlibs"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $addlibs - func_append oldobjs " $func_extract_archives_result" - fi - - # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - cmds=$old_archive_from_new_cmds - else - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append oldobjs " $func_extract_archives_result" - fi - - # POSIX demands no paths to be encoded in archives. We have - # to avoid creating archives with duplicate basenames if we - # might have to extract them afterwards, e.g., when creating a - # static archive out of a convenience library, or when linking - # the entirety of a libtool archive into another (currently - # not supported by libtool). - if (for obj in $oldobjs - do - func_basename "$obj" - $ECHO "$func_basename_result" - done | sort | sort -uc >/dev/null 2>&1); then - : - else - echo "copying selected object files to avoid basename conflicts..." - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - func_mkdir_p "$gentop" - save_oldobjs=$oldobjs - oldobjs= - counter=1 - for obj in $save_oldobjs - do - func_basename "$obj" - objbase="$func_basename_result" - case " $oldobjs " in - " ") oldobjs=$obj ;; - *[\ /]"$objbase "*) - while :; do - # Make sure we don't pick an alternate name that also - # overlaps. - newobj=lt$counter-$objbase - func_arith $counter + 1 - counter=$func_arith_result - case " $oldobjs " in - *[\ /]"$newobj "*) ;; - *) if test ! -f "$gentop/$newobj"; then break; fi ;; - esac - done - func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - func_append oldobjs " $gentop/$newobj" - ;; - *) func_append oldobjs " $obj" ;; - esac - done - fi - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - eval cmds=\"$old_archive_cmds\" - - func_len " $cmds" - len=$func_len_result - if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - cmds=$old_archive_cmds - elif test -n "$archiver_list_spec"; then - func_verbose "using command file archive linking..." - for obj in $oldobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > $output_objdir/$libname.libcmd - func_to_tool_file "$output_objdir/$libname.libcmd" - oldobjs=" $archiver_list_spec$func_to_tool_file_result" - cmds=$old_archive_cmds - else - # the command line is too long to link in one step, link in parts - func_verbose "using piecewise archive linking..." - save_RANLIB=$RANLIB - RANLIB=: - objlist= - concat_cmds= - save_oldobjs=$oldobjs - oldobjs= - # Is there a better way of finding the last object in the list? - for obj in $save_oldobjs - do - last_oldobj=$obj - done - eval test_cmds=\"$old_archive_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - for obj in $save_oldobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - func_append objlist " $obj" - if test "$len" -lt "$max_cmd_len"; then - : - else - # the above command should be used before it gets too long - oldobjs=$objlist - if test "$obj" = "$last_oldobj" ; then - RANLIB=$save_RANLIB - fi - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" - objlist= - len=$len0 - fi - done - RANLIB=$save_RANLIB - oldobjs=$objlist - if test "X$oldobjs" = "X" ; then - eval cmds=\"\$concat_cmds\" - else - eval cmds=\"\$concat_cmds~\$old_archive_cmds\" - fi - fi - fi - func_execute_cmds "$cmds" 'exit $?' - done - - test -n "$generated" && \ - func_show_eval "${RM}r$generated" - - # Now create the libtool archive. - case $output in - *.la) - old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" - func_verbose "creating $output" - - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" - fi - done - # Quote the link command for shipping. - relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` - if test "$hardcode_automatic" = yes ; then - relink_command= - fi - - # Only create the output if not a dry run. - $opt_dry_run || { - for installed in no yes; do - if test "$installed" = yes; then - if test -z "$install_libdir"; then - break - fi - output="$output_objdir/$outputname"i - # Replace all uninstalled libtool libraries with the installed ones - newdependency_libs= - for deplib in $dependency_libs; do - case $deplib in - *.la) - func_basename "$deplib" - name="$func_basename_result" - func_resolve_sysroot "$deplib" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" - ;; - -L*) - func_stripname -L '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -L$func_replace_sysroot_result" - ;; - -R*) - func_stripname -R '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -R$func_replace_sysroot_result" - ;; - *) func_append newdependency_libs " $deplib" ;; - esac - done - dependency_libs="$newdependency_libs" - newdlfiles= - - for lib in $dlfiles; do - case $lib in - *.la) - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" - ;; - *) func_append newdlfiles " $lib" ;; - esac - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - *.la) - # Only pass preopened files to the pseudo-archive (for - # eventual linking with the app. that links it) if we - # didn't already link the preopened objects directly into - # the library: - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" - ;; - esac - done - dlprefiles="$newdlprefiles" - else - newdlfiles= - for lib in $dlfiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlfiles " $abs" - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlprefiles " $abs" - done - dlprefiles="$newdlprefiles" - fi - $RM $output - # place dlname in correct position for cygwin - # In fact, it would be nice if we could use this code for all target - # systems that can't hard-code library paths into their executables - # and that have no shared library path variable independent of PATH, - # but it turns out we can't easily determine that from inspecting - # libtool variables, so we have to hard-code the OSs to which it - # applies here; at the moment, that means platforms that use the PE - # object format with DLL files. See the long comment at the top of - # tests/bindir.at for full details. - tdlname=$dlname - case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) - # If a -bindir argument was supplied, place the dll there. - if test "x$bindir" != x ; - then - func_relative_path "$install_libdir" "$bindir" - tdlname=$func_relative_path_result$dlname - else - # Otherwise fall back on heuristic. - tdlname=../bin/$dlname - fi - ;; - esac - $ECHO > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='$tdlname' - -# Names of this library. -library_names='$library_names' - -# The name of the static archive. -old_library='$old_library' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='$new_inherited_linker_flags' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Names of additional weak libraries provided by this library -weak_library_names='$weak_libs' - -# Version information for $libname. -current=$current -age=$age -revision=$revision - -# Is this an already installed library? -installed=$installed - -# Should we warn about portability when linking against -modules? -shouldnotlink=$module - -# Files to dlopen/dlpreopen -dlopen='$dlfiles' -dlpreopen='$dlprefiles' - -# Directory that this library needs to be installed in: -libdir='$install_libdir'" - if test "$installed" = no && test "$need_relink" = yes; then - $ECHO >> $output "\ -relink_command=\"$relink_command\"" - fi - done - } - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' - ;; - esac - exit $EXIT_SUCCESS -} - -{ test "$opt_mode" = link || test "$opt_mode" = relink; } && - func_mode_link ${1+"$@"} - - -# func_mode_uninstall arg... -func_mode_uninstall () -{ - $opt_debug - RM="$nonopt" - files= - rmforce= - exit_status=0 - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - for arg - do - case $arg in - -f) func_append RM " $arg"; rmforce=yes ;; - -*) func_append RM " $arg" ;; - *) func_append files " $arg" ;; - esac - done - - test -z "$RM" && \ - func_fatal_help "you must specify an RM program" - - rmdirs= - - for file in $files; do - func_dirname "$file" "" "." - dir="$func_dirname_result" - if test "X$dir" = X.; then - odir="$objdir" - else - odir="$dir/$objdir" - fi - func_basename "$file" - name="$func_basename_result" - test "$opt_mode" = uninstall && odir="$dir" - - # Remember odir for removal later, being careful to avoid duplicates - if test "$opt_mode" = clean; then - case " $rmdirs " in - *" $odir "*) ;; - *) func_append rmdirs " $odir" ;; - esac - fi - - # Don't error if the file doesn't exist and rm -f was used. - if { test -L "$file"; } >/dev/null 2>&1 || - { test -h "$file"; } >/dev/null 2>&1 || - test -f "$file"; then - : - elif test -d "$file"; then - exit_status=1 - continue - elif test "$rmforce" = yes; then - continue - fi - - rmfiles="$file" - - case $name in - *.la) - # Possibly a libtool archive, so verify it. - if func_lalib_p "$file"; then - func_source $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - func_append rmfiles " $odir/$n" - done - test -n "$old_library" && func_append rmfiles " $odir/$old_library" - - case "$opt_mode" in - clean) - case " $library_names " in - *" $dlname "*) ;; - *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; - esac - test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" - ;; - uninstall) - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' - fi - # FIXME: should reinstall the best remaining shared library. - ;; - esac - fi - ;; - - *.lo) - # Possibly a libtool object, so verify it. - if func_lalib_p "$file"; then - - # Read the .lo file - func_source $dir/$name - - # Add PIC object to the list of files to remove. - if test -n "$pic_object" && - test "$pic_object" != none; then - func_append rmfiles " $dir/$pic_object" - fi - - # Add non-PIC object to the list of files to remove. - if test -n "$non_pic_object" && - test "$non_pic_object" != none; then - func_append rmfiles " $dir/$non_pic_object" - fi - fi - ;; - - *) - if test "$opt_mode" = clean ; then - noexename=$name - case $file in - *.exe) - func_stripname '' '.exe' "$file" - file=$func_stripname_result - func_stripname '' '.exe' "$name" - noexename=$func_stripname_result - # $file with .exe has already been added to rmfiles, - # add $file without .exe - func_append rmfiles " $file" - ;; - esac - # Do a test to see if this is a libtool program. - if func_ltwrapper_p "$file"; then - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - relink_command= - func_source $func_ltwrapper_scriptname_result - func_append rmfiles " $func_ltwrapper_scriptname_result" - else - relink_command= - func_source $dir/$noexename - fi - - # note $name still contains .exe if it was in $file originally - # as does the version of $file that was added into $rmfiles - func_append rmfiles " $odir/$name $odir/${name}S.${objext}" - if test "$fast_install" = yes && test -n "$relink_command"; then - func_append rmfiles " $odir/lt-$name" - fi - if test "X$noexename" != "X$name" ; then - func_append rmfiles " $odir/lt-${noexename}.c" - fi - fi - fi - ;; - esac - func_show_eval "$RM $rmfiles" 'exit_status=1' - done - - # Try to remove the ${objdir}s in the directories where we deleted files - for dir in $rmdirs; do - if test -d "$dir"; then - func_show_eval "rmdir $dir >/dev/null 2>&1" - fi - done - - exit $exit_status -} - -{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && - func_mode_uninstall ${1+"$@"} - -test -z "$opt_mode" && { - help="$generic_help" - func_fatal_help "you must specify a MODE" -} - -test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode \`$opt_mode'" - -if test -n "$exec_cmd"; then - eval exec "$exec_cmd" - exit $EXIT_FAILURE -fi - -exit $exit_status - - -# The TAGs below are defined such that we never get into a situation -# in which we disable both kinds of libraries. Given conflicting -# choices, we go for a static library, that is the most portable, -# since we can't tell whether shared libraries were disabled because -# the user asked for that or because the platform doesn't support -# them. This is particularly important on AIX, because we don't -# support having both static and shared libraries enabled at the same -# time on that platform, so we default to a shared-only configuration. -# If a disable-shared tag is given, we'll fallback to a static-only -# configuration. But we'll never go from static-only to shared-only. - -# ### BEGIN LIBTOOL TAG CONFIG: disable-shared -build_libtool_libs=no -build_old_libs=yes -# ### END LIBTOOL TAG CONFIG: disable-shared - -# ### BEGIN LIBTOOL TAG CONFIG: disable-static -build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` -# ### END LIBTOOL TAG CONFIG: disable-static - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: -# vi:sw=2 - diff --git a/vendor/gtest-1.7.0/m4/ltoptions.m4 b/vendor/gtest-1.7.0/m4/ltoptions.m4 deleted file mode 100644 index 5d9acd8e..00000000 --- a/vendor/gtest-1.7.0/m4/ltoptions.m4 +++ /dev/null @@ -1,384 +0,0 @@ -# Helper functions for option handling. -*- Autoconf -*- -# -# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 7 ltoptions.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) - - -# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) -# ------------------------------------------ -m4_define([_LT_MANGLE_OPTION], -[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) - - -# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) -# --------------------------------------- -# Set option OPTION-NAME for macro MACRO-NAME, and if there is a -# matching handler defined, dispatch to it. Other OPTION-NAMEs are -# saved as a flag. -m4_define([_LT_SET_OPTION], -[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl -m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), - _LT_MANGLE_DEFUN([$1], [$2]), - [m4_warning([Unknown $1 option `$2'])])[]dnl -]) - - -# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) -# ------------------------------------------------------------ -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -m4_define([_LT_IF_OPTION], -[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) - - -# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) -# ------------------------------------------------------- -# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME -# are set. -m4_define([_LT_UNLESS_OPTIONS], -[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), - [m4_define([$0_found])])])[]dnl -m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 -])[]dnl -]) - - -# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) -# ---------------------------------------- -# OPTION-LIST is a space-separated list of Libtool options associated -# with MACRO-NAME. If any OPTION has a matching handler declared with -# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about -# the unknown option and exit. -m4_defun([_LT_SET_OPTIONS], -[# Set options -m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [_LT_SET_OPTION([$1], _LT_Option)]) - -m4_if([$1],[LT_INIT],[ - dnl - dnl Simply set some default values (i.e off) if boolean options were not - dnl specified: - _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no - ]) - _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no - ]) - dnl - dnl If no reference was made to various pairs of opposing options, then - dnl we run the default mode handler for the pair. For example, if neither - dnl `shared' nor `disable-shared' was passed, we enable building of shared - dnl archives by default: - _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) - _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], - [_LT_ENABLE_FAST_INSTALL]) - ]) -])# _LT_SET_OPTIONS - - -## --------------------------------- ## -## Macros to handle LT_INIT options. ## -## --------------------------------- ## - -# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) -# ----------------------------------------- -m4_define([_LT_MANGLE_DEFUN], -[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) - - -# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) -# ----------------------------------------------- -m4_define([LT_OPTION_DEFINE], -[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl -])# LT_OPTION_DEFINE - - -# dlopen -# ------ -LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes -]) - -AU_DEFUN([AC_LIBTOOL_DLOPEN], -[_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) - - -# win32-dll -# --------- -# Declare package support for building win32 dll's. -LT_OPTION_DEFINE([LT_INIT], [win32-dll], -[enable_win32_dll=yes - -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; -esac - -test -z "$AS" && AS=as -_LT_DECL([], [AS], [1], [Assembler program])dnl - -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl - -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl -])# win32-dll - -AU_DEFUN([AC_LIBTOOL_WIN32_DLL], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) - - -# _LT_ENABLE_SHARED([DEFAULT]) -# ---------------------------- -# implement the --enable-shared flag, and supports the `shared' and -# `disable-shared' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_SHARED], -[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([shared], - [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], - [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) - - _LT_DECL([build_libtool_libs], [enable_shared], [0], - [Whether or not to build shared libraries]) -])# _LT_ENABLE_SHARED - -LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) -]) - -AC_DEFUN([AC_DISABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], [disable-shared]) -]) - -AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_SHARED], []) -dnl AC_DEFUN([AM_DISABLE_SHARED], []) - - - -# _LT_ENABLE_STATIC([DEFAULT]) -# ---------------------------- -# implement the --enable-static flag, and support the `static' and -# `disable-static' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_STATIC], -[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([static], - [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], - [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_static=]_LT_ENABLE_STATIC_DEFAULT) - - _LT_DECL([build_old_libs], [enable_static], [0], - [Whether or not to build static libraries]) -])# _LT_ENABLE_STATIC - -LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) -]) - -AC_DEFUN([AC_DISABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], [disable-static]) -]) - -AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_STATIC], []) -dnl AC_DEFUN([AM_DISABLE_STATIC], []) - - - -# _LT_ENABLE_FAST_INSTALL([DEFAULT]) -# ---------------------------------- -# implement the --enable-fast-install flag, and support the `fast-install' -# and `disable-fast-install' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_FAST_INSTALL], -[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([fast-install], - [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], - [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) - -_LT_DECL([fast_install], [enable_fast_install], [0], - [Whether or not to optimize for fast installation])dnl -])# _LT_ENABLE_FAST_INSTALL - -LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) - -# Old names: -AU_DEFUN([AC_ENABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) - -AU_DEFUN([AC_DISABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) -dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) - - -# _LT_WITH_PIC([MODE]) -# -------------------- -# implement the --with-pic flag, and support the `pic-only' and `no-pic' -# LT_INIT options. -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. -m4_define([_LT_WITH_PIC], -[AC_ARG_WITH([pic], - [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], - [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], - [lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for lt_pkg in $withval; do - IFS="$lt_save_ifs" - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [pic_mode=default]) - -test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) - -_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl -])# _LT_WITH_PIC - -LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) - -# Old name: -AU_DEFUN([AC_LIBTOOL_PICMODE], -[_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) - -## ----------------- ## -## LTDL_INIT Options ## -## ----------------- ## - -m4_define([_LTDL_MODE], []) -LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], - [m4_define([_LTDL_MODE], [nonrecursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [recursive], - [m4_define([_LTDL_MODE], [recursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [subproject], - [m4_define([_LTDL_MODE], [subproject])]) - -m4_define([_LTDL_TYPE], []) -LT_OPTION_DEFINE([LTDL_INIT], [installable], - [m4_define([_LTDL_TYPE], [installable])]) -LT_OPTION_DEFINE([LTDL_INIT], [convenience], - [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/vendor/gtest-1.7.0/m4/ltversion.m4 b/vendor/gtest-1.7.0/m4/ltversion.m4 deleted file mode 100644 index 07a8602d..00000000 --- a/vendor/gtest-1.7.0/m4/ltversion.m4 +++ /dev/null @@ -1,23 +0,0 @@ -# ltversion.m4 -- version numbers -*- Autoconf -*- -# -# Copyright (C) 2004 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# @configure_input@ - -# serial 3337 ltversion.m4 -# This file is part of GNU Libtool - -m4_define([LT_PACKAGE_VERSION], [2.4.2]) -m4_define([LT_PACKAGE_REVISION], [1.3337]) - -AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4.2' -macro_revision='1.3337' -_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) -_LT_DECL(, macro_revision, 0) -]) diff --git a/vendor/jsoncpp-0.10.5/dist/.deps/jsoncpp.Po b/vendor/jsoncpp-0.10.5/dist/.deps/jsoncpp.Po deleted file mode 100644 index 80bdb77e..00000000 --- a/vendor/jsoncpp-0.10.5/dist/.deps/jsoncpp.Po +++ /dev/null @@ -1,545 +0,0 @@ -vendor/jsoncpp-0.10.5/dist/jsoncpp.o: \ - vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp \ - vendor/jsoncpp-0.10.5/dist/json/json.h \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iosfwd \ - /usr/include/wchar.h /usr/include/_types.h /usr/include/sys/_types.h \ - /usr/include/sys/cdefs.h /usr/include/sys/_symbol_aliasing.h \ - /usr/include/sys/_posix_availability.h /usr/include/machine/_types.h \ - /usr/include/i386/_types.h /usr/include/sys/_pthread/_pthread_types.h \ - /usr/include/Availability.h /usr/include/AvailabilityInternal.h \ - /usr/include/sys/_types/_null.h /usr/include/sys/_types/_size_t.h \ - /usr/include/sys/_types/_mbstate_t.h \ - /usr/include/sys/_types/_ct_rune_t.h /usr/include/sys/_types/_rune_t.h \ - /usr/include/sys/_types/_wchar_t.h \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/stdarg.h \ - /usr/include/stdio.h /usr/include/sys/_types/_va_list.h \ - /usr/include/sys/stdio.h /usr/include/sys/_types/_off_t.h \ - /usr/include/sys/_types/_ssize_t.h /usr/include/time.h \ - /usr/include/sys/_types/_clock_t.h /usr/include/sys/_types/_time_t.h \ - /usr/include/sys/_types/_timespec.h /usr/include/_wctype.h \ - /usr/include/sys/_types/_wint_t.h /usr/include/_types/_wctype_t.h \ - /usr/include/ctype.h /usr/include/runetype.h \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstring \ - /usr/include/string.h /usr/include/sys/_types/_rsize_t.h \ - /usr/include/sys/_types/_errno_t.h /usr/include/strings.h \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdio \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cwchar \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cwctype \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cctype \ - /usr/include/wctype.h /usr/include/_types/_wctrans_t.h \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/initializer_list \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstddef \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/stddef.h \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/type_traits \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/utility \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tuple \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tuple_03 \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/typeinfo \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/exception \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdint \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/stdint.h \ - /usr/include/stdint.h /usr/include/sys/_types/_int8_t.h \ - /usr/include/sys/_types/_int16_t.h /usr/include/sys/_types/_int32_t.h \ - /usr/include/sys/_types/_int64_t.h /usr/include/_types/_uint8_t.h \ - /usr/include/_types/_uint16_t.h /usr/include/_types/_uint32_t.h \ - /usr/include/_types/_uint64_t.h /usr/include/sys/_types/_intptr_t.h \ - /usr/include/sys/_types/_uintptr_t.h /usr/include/_types/_intmax_t.h \ - /usr/include/_types/_uintmax_t.h \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/new \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/limits \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__undef_min_max \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iterator \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_base \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_base_03 \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__debug \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/tuple \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/stdexcept \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__bit_reference \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/climits \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/limits.h \ - /usr/include/limits.h /usr/include/machine/limits.h \ - /usr/include/i386/limits.h /usr/include/i386/_limits.h \ - /usr/include/sys/syslimits.h \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__split_buffer \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/map \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tree \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/functional \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_03 \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/deque \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/stack \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/istream \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ostream \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ios \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__locale \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/mutex \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__mutex_base \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/chrono \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ctime \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ratio \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/system_error \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cerrno \ - /usr/include/errno.h /usr/include/sys/errno.h /usr/include/pthread.h \ - /usr/include/pthread/pthread_impl.h /usr/include/pthread/sched.h \ - /usr/include/sys/_pthread/_pthread_attr_t.h \ - /usr/include/sys/_pthread/_pthread_cond_t.h \ - /usr/include/sys/_pthread/_pthread_condattr_t.h \ - /usr/include/sys/_pthread/_pthread_key_t.h \ - /usr/include/sys/_pthread/_pthread_mutex_t.h \ - /usr/include/sys/_pthread/_pthread_mutexattr_t.h \ - /usr/include/sys/_pthread/_pthread_once_t.h \ - /usr/include/sys/_pthread/_pthread_rwlock_t.h \ - /usr/include/sys/_pthread/_pthread_rwlockattr_t.h \ - /usr/include/sys/_pthread/_pthread_t.h /usr/include/pthread/qos.h \ - /usr/include/sys/qos.h /usr/include/sys/_types/_mach_port_t.h \ - /usr/include/sys/_types/_sigset_t.h /usr/include/locale.h \ - /usr/include/_locale.h /usr/include/xlocale.h /usr/include/_xlocale.h \ - /usr/include/xlocale/_ctype.h /usr/include/xlocale/__wctype.h \ - /usr/include/xlocale/_stdio.h /usr/include/xlocale/_string.h \ - /usr/include/xlocale/_time.h /usr/include/xlocale/_wchar.h \ - /usr/include/xlocale/_wctype.h \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/streambuf \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/locale \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdlib \ - /usr/include/stdlib.h /usr/include/sys/wait.h \ - /usr/include/sys/_types/_pid_t.h /usr/include/sys/_types/_id_t.h \ - /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ - /usr/include/machine/signal.h /usr/include/i386/signal.h \ - /usr/include/machine/_mcontext.h /usr/include/i386/_mcontext.h \ - /usr/include/mach/i386/_structs.h \ - /usr/include/sys/_types/_sigaltstack.h \ - /usr/include/sys/_types/_ucontext.h /usr/include/sys/_types/_uid_t.h \ - /usr/include/sys/resource.h /usr/include/sys/_types/_timeval.h \ - /usr/include/machine/endian.h /usr/include/i386/endian.h \ - /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ - /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ - /usr/include/machine/types.h /usr/include/i386/types.h \ - /usr/include/sys/_types/_dev_t.h /usr/include/sys/_types/_mode_t.h \ - /usr/include/xlocale/_stdlib.h /usr/include/nl_types.h \ - /usr/include/sys/types.h /usr/include/sys/_types/_blkcnt_t.h \ - /usr/include/sys/_types/_blksize_t.h /usr/include/sys/_types/_gid_t.h \ - /usr/include/sys/_types/_in_addr_t.h \ - /usr/include/sys/_types/_in_port_t.h /usr/include/sys/_types/_ino_t.h \ - /usr/include/sys/_types/_ino64_t.h /usr/include/sys/_types/_key_t.h \ - /usr/include/sys/_types/_nlink_t.h \ - /usr/include/sys/_types/_useconds_t.h \ - /usr/include/sys/_types/_suseconds_t.h \ - /usr/include/sys/_types/_fd_def.h \ - /usr/include/sys/_types/_fd_setsize.h \ - /usr/include/sys/_types/_fd_set.h /usr/include/sys/_types/_fd_clr.h \ - /usr/include/sys/_types/_fd_zero.h /usr/include/sys/_types/_fd_isset.h \ - /usr/include/sys/_types/_fd_copy.h \ - /usr/include/sys/_types/_fsblkcnt_t.h \ - /usr/include/sys/_types/_fsfilcnt_t.h /usr/include/_types/_nl_item.h \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/bitset \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/sstream \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cassert \ - /usr/include/assert.h \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/set \ - /usr/include/math.h \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iomanip \ - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath - -vendor/jsoncpp-0.10.5/dist/json/json.h: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iosfwd: - -/usr/include/wchar.h: - -/usr/include/_types.h: - -/usr/include/sys/_types.h: - -/usr/include/sys/cdefs.h: - -/usr/include/sys/_symbol_aliasing.h: - -/usr/include/sys/_posix_availability.h: - -/usr/include/machine/_types.h: - -/usr/include/i386/_types.h: - -/usr/include/sys/_pthread/_pthread_types.h: - -/usr/include/Availability.h: - -/usr/include/AvailabilityInternal.h: - -/usr/include/sys/_types/_null.h: - -/usr/include/sys/_types/_size_t.h: - -/usr/include/sys/_types/_mbstate_t.h: - -/usr/include/sys/_types/_ct_rune_t.h: - -/usr/include/sys/_types/_rune_t.h: - -/usr/include/sys/_types/_wchar_t.h: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/stdarg.h: - -/usr/include/stdio.h: - -/usr/include/sys/_types/_va_list.h: - -/usr/include/sys/stdio.h: - -/usr/include/sys/_types/_off_t.h: - -/usr/include/sys/_types/_ssize_t.h: - -/usr/include/time.h: - -/usr/include/sys/_types/_clock_t.h: - -/usr/include/sys/_types/_time_t.h: - -/usr/include/sys/_types/_timespec.h: - -/usr/include/_wctype.h: - -/usr/include/sys/_types/_wint_t.h: - -/usr/include/_types/_wctype_t.h: - -/usr/include/ctype.h: - -/usr/include/runetype.h: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstring: - -/usr/include/string.h: - -/usr/include/sys/_types/_rsize_t.h: - -/usr/include/sys/_types/_errno_t.h: - -/usr/include/strings.h: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdio: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cwchar: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cwctype: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cctype: - -/usr/include/wctype.h: - -/usr/include/_types/_wctrans_t.h: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/initializer_list: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstddef: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/stddef.h: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/type_traits: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/utility: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tuple: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tuple_03: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/typeinfo: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/exception: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdint: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/stdint.h: - -/usr/include/stdint.h: - -/usr/include/sys/_types/_int8_t.h: - -/usr/include/sys/_types/_int16_t.h: - -/usr/include/sys/_types/_int32_t.h: - -/usr/include/sys/_types/_int64_t.h: - -/usr/include/_types/_uint8_t.h: - -/usr/include/_types/_uint16_t.h: - -/usr/include/_types/_uint32_t.h: - -/usr/include/_types/_uint64_t.h: - -/usr/include/sys/_types/_intptr_t.h: - -/usr/include/sys/_types/_uintptr_t.h: - -/usr/include/_types/_intmax_t.h: - -/usr/include/_types/_uintmax_t.h: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/new: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/limits: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__undef_min_max: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iterator: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_base: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_base_03: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__debug: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/tuple: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/stdexcept: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__bit_reference: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/climits: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include/limits.h: - -/usr/include/limits.h: - -/usr/include/machine/limits.h: - -/usr/include/i386/limits.h: - -/usr/include/i386/_limits.h: - -/usr/include/sys/syslimits.h: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__split_buffer: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/map: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tree: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/functional: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_03: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/deque: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/stack: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/istream: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ostream: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ios: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__locale: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/mutex: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__mutex_base: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/chrono: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ctime: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ratio: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/system_error: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cerrno: - -/usr/include/errno.h: - -/usr/include/sys/errno.h: - -/usr/include/pthread.h: - -/usr/include/pthread/pthread_impl.h: - -/usr/include/pthread/sched.h: - -/usr/include/sys/_pthread/_pthread_attr_t.h: - -/usr/include/sys/_pthread/_pthread_cond_t.h: - -/usr/include/sys/_pthread/_pthread_condattr_t.h: - -/usr/include/sys/_pthread/_pthread_key_t.h: - -/usr/include/sys/_pthread/_pthread_mutex_t.h: - -/usr/include/sys/_pthread/_pthread_mutexattr_t.h: - -/usr/include/sys/_pthread/_pthread_once_t.h: - -/usr/include/sys/_pthread/_pthread_rwlock_t.h: - -/usr/include/sys/_pthread/_pthread_rwlockattr_t.h: - -/usr/include/sys/_pthread/_pthread_t.h: - -/usr/include/pthread/qos.h: - -/usr/include/sys/qos.h: - -/usr/include/sys/_types/_mach_port_t.h: - -/usr/include/sys/_types/_sigset_t.h: - -/usr/include/locale.h: - -/usr/include/_locale.h: - -/usr/include/xlocale.h: - -/usr/include/_xlocale.h: - -/usr/include/xlocale/_ctype.h: - -/usr/include/xlocale/__wctype.h: - -/usr/include/xlocale/_stdio.h: - -/usr/include/xlocale/_string.h: - -/usr/include/xlocale/_time.h: - -/usr/include/xlocale/_wchar.h: - -/usr/include/xlocale/_wctype.h: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/streambuf: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/locale: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdlib: - -/usr/include/stdlib.h: - -/usr/include/sys/wait.h: - -/usr/include/sys/_types/_pid_t.h: - -/usr/include/sys/_types/_id_t.h: - -/usr/include/sys/signal.h: - -/usr/include/sys/appleapiopts.h: - -/usr/include/machine/signal.h: - -/usr/include/i386/signal.h: - -/usr/include/machine/_mcontext.h: - -/usr/include/i386/_mcontext.h: - -/usr/include/mach/i386/_structs.h: - -/usr/include/sys/_types/_sigaltstack.h: - -/usr/include/sys/_types/_ucontext.h: - -/usr/include/sys/_types/_uid_t.h: - -/usr/include/sys/resource.h: - -/usr/include/sys/_types/_timeval.h: - -/usr/include/machine/endian.h: - -/usr/include/i386/endian.h: - -/usr/include/sys/_endian.h: - -/usr/include/libkern/_OSByteOrder.h: - -/usr/include/libkern/i386/_OSByteOrder.h: - -/usr/include/alloca.h: - -/usr/include/machine/types.h: - -/usr/include/i386/types.h: - -/usr/include/sys/_types/_dev_t.h: - -/usr/include/sys/_types/_mode_t.h: - -/usr/include/xlocale/_stdlib.h: - -/usr/include/nl_types.h: - -/usr/include/sys/types.h: - -/usr/include/sys/_types/_blkcnt_t.h: - -/usr/include/sys/_types/_blksize_t.h: - -/usr/include/sys/_types/_gid_t.h: - -/usr/include/sys/_types/_in_addr_t.h: - -/usr/include/sys/_types/_in_port_t.h: - -/usr/include/sys/_types/_ino_t.h: - -/usr/include/sys/_types/_ino64_t.h: - -/usr/include/sys/_types/_key_t.h: - -/usr/include/sys/_types/_nlink_t.h: - -/usr/include/sys/_types/_useconds_t.h: - -/usr/include/sys/_types/_suseconds_t.h: - -/usr/include/sys/_types/_fd_def.h: - -/usr/include/sys/_types/_fd_setsize.h: - -/usr/include/sys/_types/_fd_set.h: - -/usr/include/sys/_types/_fd_clr.h: - -/usr/include/sys/_types/_fd_zero.h: - -/usr/include/sys/_types/_fd_isset.h: - -/usr/include/sys/_types/_fd_copy.h: - -/usr/include/sys/_types/_fsblkcnt_t.h: - -/usr/include/sys/_types/_fsfilcnt_t.h: - -/usr/include/_types/_nl_item.h: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/bitset: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/sstream: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cassert: - -/usr/include/assert.h: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/set: - -/usr/include/math.h: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iomanip: - -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath: From ac72ba77e04cfe887070f26680ee39de4c3f816c Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 23 Dec 2015 18:35:16 -0500 Subject: [PATCH 055/212] cleanup version gen to be driven by git tags this removes the static meta.h header file which included only version information and replaces it with a version.h file. This file is generated on build time from the m4/version.h.m4 template and includes the version string as generated from `git describe --tags --always --dirty`. This makes sure that the version of any builds always corresponds to an existing revision in git (and also marks it as dirty if the build comes from uncommited changes). --- .gitignore | 1 + Makefile.am | 14 ++++++++------ configure.ac | 1 - include/restclient-cpp/meta.h | 13 ------------- include/restclient-cpp/restclient.h | 2 ++ m4/version.h.m4 | 5 +++++ source/restclient.cpp | 4 ++-- test/test_restclient_delete.cpp | 3 +-- test/test_restclient_get.cpp | 3 +-- test/test_restclient_post.cpp | 3 +-- test/test_restclient_put.cpp | 3 +-- 11 files changed, 22 insertions(+), 30 deletions(-) delete mode 100644 include/restclient-cpp/meta.h create mode 100644 m4/version.h.m4 diff --git a/.gitignore b/.gitignore index 7c4f2986..388e0056 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,4 @@ usr # generated files docs +include/restclient-cpp/version.h diff --git a/Makefile.am b/Makefile.am index 8e8de71b..465d9d3f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,18 +1,20 @@ ACLOCAL_AMFLAGS=-I m4 -CPPFLAGS=-Iinclude -Ivendor/gtest-1.7.0/include -Ivendor/jsoncpp-0.10.5/dist +CPPFLAGS=-Iinclude check_PROGRAMS = test-program -pkginclude_HEADERS = include/restclient-cpp/restclient.h include/restclient-cpp/meta.h +pkginclude_HEADERS = include/restclient-cpp/restclient.h include/restclient-cpp/version.h +BUILT_SOURCES = include/restclient-cpp/version.h test_program_SOURCES = vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp test/test_restclient_delete.cpp test/test_restclient_get.cpp test/test_restclient_post.cpp test/test_restclient_put.cpp test/tests.cpp test_program_LDADD = .libs/librestclient-cpp.a test_program_LDFLAGS=-Lvendor/gtest-1.7.0/lib/.libs -lgtest +test_program_CPPFLAGS=-Iinclude -Ivendor/gtest-1.7.0/include -Ivendor/jsoncpp-0.10.5/dist lib_LTLIBRARIES=librestclient-cpp.la librestclient_cpp_la_SOURCES=source/restclient.cpp librestclient_cpp_la_CXXFLAGS=-fPIC librestclient_cpp_la_LDFLAGS=-version-info 1:0:1 -.PHONY: test check clean-coverage-files coverage-html docs clean-docs deploy-docs doxygen jekyll packages rpm deb +.PHONY: test check clean-coverage-files coverage-html docs clean-docs deploy-docs doxygen jekyll packages rpm deb include/restclient-cpp/version.h test: check ./test-program @@ -45,8 +47,8 @@ deb: packages: local-install rpm deb -include/snyder/version.h: - m4 -I m4 --define=M4_SNYDER_VERSION=$(VERSION) version.h.m4 > $@ +include/restclient-cpp/version.h: + m4 -I m4 --define=M4_RESTCLIENT_VERSION=$(VERSION) version.h.m4 > $@ GAUGES_CODE="539c6c8de32bb442640005f3" @@ -61,7 +63,7 @@ jekyll: echo "markdown: redcarpet" >> docs/_config.yml echo "---" > docs/index.md echo "layout: project" >> docs/index.md - echo "title: restclient-cpp" >> docs/index.md + echo "title: $(NAME)" >> docs/index.md echo "---" >> docs/index.md cat README.md >> docs/index.md diff --git a/configure.ac b/configure.ac index 4c2d0ee4..97f31e9a 100644 --- a/configure.ac +++ b/configure.ac @@ -5,7 +5,6 @@ AC_PREREQ([2.52]) AC_INIT([restclient-cpp], [0.1.2], [d@unwiredcouch.com]) AM_INIT_AUTOMAKE([0.1.2 foreign subdir-objects]) LT_INIT -AC_CONFIG_SRCDIR([include/restclient-cpp/meta.h]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_MACRO_DIR([m4]) diff --git a/include/restclient-cpp/meta.h b/include/restclient-cpp/meta.h deleted file mode 100644 index 9458efe1..00000000 --- a/include/restclient-cpp/meta.h +++ /dev/null @@ -1,13 +0,0 @@ -/** - * @file meta.h - * @brief header file for meta information - * @author Daniel Schauenberg - */ - -#ifndef INCLUDE_META_H_ -#define INCLUDE_META_H_ - -// version string -#define VERSION "0.2.0" - -#endif // INCLUDE_META_H_ diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index ca7fb739..11d35e9c 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -14,6 +14,8 @@ #include #include +#include "restclient-cpp/version.h" + class RestClient { public: diff --git a/m4/version.h.m4 b/m4/version.h.m4 new file mode 100644 index 00000000..c983fe6f --- /dev/null +++ b/m4/version.h.m4 @@ -0,0 +1,5 @@ +changecom(`@@')dnl +#ifndef RESTCLIENT_VERSION +#define RESTCLIENT_VERSION "M4_RESTCLIENT_VERSION" +#endif +changecom(`#')dnl diff --git a/source/restclient.cpp b/source/restclient.cpp index 9be97366..fb4de5fa 100644 --- a/source/restclient.cpp +++ b/source/restclient.cpp @@ -8,7 +8,7 @@ INCLUDES ========================*/ #include "restclient-cpp/restclient.h" -#include "restclient-cpp/meta.h" +#include "restclient-cpp/version.h" #include #include @@ -17,7 +17,7 @@ #include /** initialize user agent string */ -const char* RestClient::user_agent = "restclient-cpp/" VERSION; +const char* RestClient::user_agent = "restclient-cpp/" RESTCLIENT_VERSION; /** initialize authentication variable */ std::string RestClient::user_pass = std::string(); /** Authentication Methods implementation */ diff --git a/test/test_restclient_delete.cpp b/test/test_restclient_delete.cpp index f49f304e..507a550b 100644 --- a/test/test_restclient_delete.cpp +++ b/test/test_restclient_delete.cpp @@ -1,5 +1,4 @@ #include "restclient-cpp/restclient.h" -#include "restclient-cpp/meta.h" #include #include #include @@ -47,7 +46,7 @@ TEST_F(RestClientDeleteTest, TestRestClientDeleteBody) str >> root; EXPECT_EQ("http://httpbin.org/delete", root.get("url", "no url set").asString()); - EXPECT_EQ("restclient-cpp/" VERSION, root["headers"].get("User-Agent", "no url set").asString()); + EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } // check for failure TEST_F(RestClientDeleteTest, TestRestClientFailureCode) diff --git a/test/test_restclient_get.cpp b/test/test_restclient_get.cpp index ede7aa27..3c2c1339 100644 --- a/test/test_restclient_get.cpp +++ b/test/test_restclient_get.cpp @@ -1,5 +1,4 @@ #include "restclient-cpp/restclient.h" -#include "restclient-cpp/meta.h" #include #include #include @@ -47,7 +46,7 @@ TEST_F(RestClientGetTest, TestRestClientGETBodyCode) str >> root; EXPECT_EQ("http://httpbin.org/get", root.get("url", "no url set").asString()); - EXPECT_EQ("restclient-cpp/" VERSION, root["headers"].get("User-Agent", "no url set").asString()); + EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } //check if additional http headers were sent TEST_F(RestClientGetTest, TestRestClientGETAdditionalHeaders) diff --git a/test/test_restclient_post.cpp b/test/test_restclient_post.cpp index 29bb3789..fdf34df7 100644 --- a/test/test_restclient_post.cpp +++ b/test/test_restclient_post.cpp @@ -1,5 +1,4 @@ #include "restclient-cpp/restclient.h" -#include "restclient-cpp/meta.h" #include #include #include @@ -47,7 +46,7 @@ TEST_F(RestClientPostTest, TestRestClientPostBody) str >> root; EXPECT_EQ("http://httpbin.org/post", root.get("url", "no url set").asString()); - EXPECT_EQ("restclient-cpp/" VERSION, root["headers"].get("User-Agent", "no url set").asString()); + EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } // check for failure TEST_F(RestClientPostTest, TestRestClientFailureCode) diff --git a/test/test_restclient_put.cpp b/test/test_restclient_put.cpp index dc6696d2..cdb94093 100644 --- a/test/test_restclient_put.cpp +++ b/test/test_restclient_put.cpp @@ -1,5 +1,4 @@ #include "restclient-cpp/restclient.h" -#include "restclient-cpp/meta.h" #include #include #include @@ -47,7 +46,7 @@ TEST_F(RestClientPutTest, TestRestClientPutBody) str >> root; EXPECT_EQ("http://httpbin.org/put", root.get("url", "no url set").asString()); - EXPECT_EQ("restclient-cpp/" VERSION, root["headers"].get("User-Agent", "no url set").asString()); + EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } // check for failure TEST_F(RestClientPutTest, TestRestClientFailureCode) From eec3d06ac9c608efb600ab0449cc84c6c7ec50fc Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 23 Dec 2015 18:43:04 -0500 Subject: [PATCH 056/212] add description to package builds --- Makefile.am | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 465d9d3f..5f48f79b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -37,7 +37,10 @@ VERSION = $(shell git describe --tags --always --dirty) BUILDER = $(shell echo "`git config user.name` <`git config user.email`>") PKG_RELEASE ?= 1 PROJECT_URL="https://github.com/mrtazz/$(NAME)" -FPM_FLAGS= --name $(NAME) --version $(VERSION) --iteration $(PKG_RELEASE) --epoch 1 --license MIT --maintainer "$(BUILDER)" --url $(PROJECT_URL) --vendor mrtazz usr +FPM_FLAGS= --name $(NAME) --version $(VERSION) --iteration $(PKG_RELEASE) \ + --epoch 1 --license MIT --maintainer "$(BUILDER)" --url $(PROJECT_URL) \ + --vendor mrtazz --description "C++ client for making HTTP/REST requests" \ + usr rpm: fpm -t rpm -s dir $(FPM_FLAGS) From 0627821e38fa2b562ffbd943747b75d271a7be9a Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 23 Dec 2015 18:49:54 -0500 Subject: [PATCH 057/212] add make task to deploy packages --- Makefile.am | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 5f48f79b..bbe25c3b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -14,7 +14,7 @@ librestclient_cpp_la_SOURCES=source/restclient.cpp librestclient_cpp_la_CXXFLAGS=-fPIC librestclient_cpp_la_LDFLAGS=-version-info 1:0:1 -.PHONY: test check clean-coverage-files coverage-html docs clean-docs deploy-docs doxygen jekyll packages rpm deb include/restclient-cpp/version.h +.PHONY: test check clean-coverage-files coverage-html docs clean-docs deploy-docs doxygen jekyll packages rpm deb include/restclient-cpp/version.h deploy-packages test: check ./test-program @@ -50,6 +50,11 @@ deb: packages: local-install rpm deb +deploy-packages: packages + package_cloud push mrtazz/$(NAME)/el/7 *.rpm + package_cloud push mrtazz/$(NAME)/debian/wheezy *.deb + package_cloud push mrtazz/$(NAME)/ubuntu/trusty *.deb + include/restclient-cpp/version.h: m4 -I m4 --define=M4_RESTCLIENT_VERSION=$(VERSION) version.h.m4 > $@ From 5f4185a8641578f654952a5f4220b0722a73986f Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 23 Dec 2015 18:50:59 -0500 Subject: [PATCH 058/212] hook up package deploy via travis-ci on tags --- .travis.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.travis.yml b/.travis.yml index ce6c443f..0b9cfdb4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,13 @@ addons: - build-essential - libcurl4-openssl-dev - doxygen + - rpm +deploy: + provider: script + script: ./autogen.sh && ./configure --prefix=`pwd`/usr && make deploy-packages + on: + tags: true env: global: - secure: i+h0SxjrHCfvoaXCJ1b+tK0vvNgoLq7Xl/eh34tb3QokacWO+piyLcbSxvz0IcE50ye0x8CyMn2hyyGCgzwHDgaUCmkILS+3y+9E7FC4nYwLvi2mJ2Q9DI1Q5aXhcMXiEYb9b1LjrorUdgs6DcfJVq7ZSU3CawKU/uBtKfC39iQ= + - secure: IdA0aOUuazgCVT3X8bmOjC2mJpHIk+eakCUgiPGhsMsg6Nhe+OgYUF9uGLgz3py5qZq3ns+9WV1IVZVhwd1CFz+2wFKHM6WRnvlfFJ/aV+rb10I2tiX8BrepNcZzCvwuTxIgqb3m97DHRmf/s8DnnmF6v5pvUaKb9SjxFQ1d/XY= From cfa0f72182da2ff23f4e49a5b012277062210a5b Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Thu, 24 Dec 2015 13:05:46 -0500 Subject: [PATCH 059/212] install fpm on travis for package builds --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 0b9cfdb4..6cf1d2a5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,7 @@ language: cpp script: ./autogen.sh && ./configure --enable-coverage && make test +install: +- gem install fpm before_script: - ./utils/build_gtest.sh - gem install coveralls-lcov From 2dbc95af58ca9a8b7aa9b360b653aea4121e4d86 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 25 Dec 2015 16:15:17 -0500 Subject: [PATCH 060/212] install package_cloud gem on travis builds --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 6cf1d2a5..d2cc7bcf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,7 @@ language: cpp script: ./autogen.sh && ./configure --enable-coverage && make test install: - gem install fpm +- gem install package_cloud before_script: - ./utils/build_gtest.sh - gem install coveralls-lcov From 23eb88ab2223c6454281f18abaf2338253ff74db Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 25 Dec 2015 16:17:46 -0500 Subject: [PATCH 061/212] add curl dependency to fpm build flags --- Makefile.am | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile.am b/Makefile.am index bbe25c3b..a1b02ec9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -38,9 +38,9 @@ BUILDER = $(shell echo "`git config user.name` <`git config user.email`>") PKG_RELEASE ?= 1 PROJECT_URL="https://github.com/mrtazz/$(NAME)" FPM_FLAGS= --name $(NAME) --version $(VERSION) --iteration $(PKG_RELEASE) \ - --epoch 1 --license MIT --maintainer "$(BUILDER)" --url $(PROJECT_URL) \ - --vendor mrtazz --description "C++ client for making HTTP/REST requests" \ - usr + --epoch 1 --license MIT --maintainer "$(BUILDER)" --url $(PROJECT_URL) \ + --vendor mrtazz --description "C++ client for making HTTP/REST requests" \ + --depends curl usr rpm: fpm -t rpm -s dir $(FPM_FLAGS) From 75ad9396463cdbd90cf68b8222272900cd7dbba7 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 26 Dec 2015 17:42:10 -0500 Subject: [PATCH 062/212] document basic auth usage fixes #24 --- README.md | 3 +++ source/restclient.cpp | 18 ++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 24dcf66c..4aba7ea3 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,9 @@ RestClient::response r = RestClient::get("http://url.com", headers) RestClient::response r = RestClient::post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}", headers) RestClient::response r = RestClient::put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}", headers) RestClient::response r = RestClient::del("http://url.com/delete", headers) + +RestClient::setAuth("WarMachine68", "WARMACHINEROX"); + ``` The response is of type RestClient::response and has three attributes: diff --git a/source/restclient.cpp b/source/restclient.cpp index fb4de5fa..00be8256 100644 --- a/source/restclient.cpp +++ b/source/restclient.cpp @@ -20,11 +20,25 @@ const char* RestClient::user_agent = "restclient-cpp/" RESTCLIENT_VERSION; /** initialize authentication variable */ std::string RestClient::user_pass = std::string(); -/** Authentication Methods implementation */ + +/** + * @brief method to clear auth set on the static class + * + * @return void + */ void RestClient::clearAuth(){ RestClient::user_pass.clear(); } -void RestClient::setAuth(const std::string& user,const std::string& password){ + +/** + * @brief method to set basic auth data on the class + * + * @param user - user name to use for basic auth + * @param password - password to use for basic auth + * + * @return void + */ +void RestClient::setAuth(const std::string& user, const std::string& password){ RestClient::user_pass.clear(); RestClient::user_pass += user+":"+password; } From b8d826010602f3c9ec7358ac17af14e1493d82d8 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 26 Dec 2015 17:42:43 -0500 Subject: [PATCH 063/212] document `timeout` parameter for all restclient methods --- source/restclient.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/restclient.cpp b/source/restclient.cpp index 00be8256..6b77444a 100644 --- a/source/restclient.cpp +++ b/source/restclient.cpp @@ -42,10 +42,12 @@ void RestClient::setAuth(const std::string& user, const std::string& password){ RestClient::user_pass.clear(); RestClient::user_pass += user+":"+password; } + /** * @brief HTTP GET method * * @param url to query + * @param timeout in seconds for this request * * @return response struct */ @@ -60,6 +62,7 @@ RestClient::response RestClient::get(const std::string& url, const size_t timeou * * @param url to query * @param headers HTTP headers + * @param timeout in seconds for this request * * @return response struct */ @@ -139,6 +142,7 @@ RestClient::response RestClient::get(const std::string& url, const headermap& he * @param url to query * @param ctype content type as string * @param data HTTP POST body + * @param timeout in seconds for this request * * @return response struct */ @@ -158,6 +162,7 @@ RestClient::response RestClient::post(const std::string& url, * @param ctype content type as string * @param data HTTP POST body * @param headers HTTP headers + * @param timeout in seconds for this request * * @return response struct */ @@ -249,6 +254,7 @@ RestClient::response RestClient::post(const std::string& url, * @param url to query * @param ctype content type as string * @param data HTTP PUT body + * @param timeout in seconds for this request * * @return response struct */ @@ -268,6 +274,7 @@ RestClient::response RestClient::put(const std::string& url, * @param ctype content type as string * @param data HTTP PUT body * @param headers HTTP headers + * @param timeout in seconds for this request * * @return response struct */ @@ -368,6 +375,7 @@ RestClient::response RestClient::put(const std::string& url, * @brief HTTP DELETE method * * @param url to query + * @param timeout in seconds for this request * * @return response struct */ @@ -382,6 +390,7 @@ RestClient::response RestClient::del(const std::string& url, const size_t timeou * * @param url to query * @param headers HTTP headers + * @param timeout in seconds for this request * * @return response struct */ From 6f6363576579f1038bb269d3d19dd61121d29a14 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 26 Dec 2015 17:46:50 -0500 Subject: [PATCH 064/212] add doxygen docs to restclient structs --- include/restclient-cpp/restclient.h | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index 11d35e9c..f53cd7f1 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -24,14 +24,30 @@ class RestClient */ typedef std::map headermap; - /** response struct for queries */ + /** @struct response + * @brief This structure represents the HTTP response data + * @var response::code + * Member 'code' contains the HTTP response code + * @var response::body + * Member 'body' contains the HTTP response body + * @var response::headers + * Member 'headers' contains the HTTP response headers + */ typedef struct { int code; std::string body; headermap headers; } response; - /** struct used for uploading data */ + + /** @struct upload_object + * @brief This structure represents the payload to upload on POST + * requests + * @var upload_object::data + * Member 'data' contains the data to upload + * @var upload_object::length + * Member 'length' contains the length of the data to upload + */ typedef struct { const char* data; @@ -70,7 +86,7 @@ class RestClient // header callback function static size_t header_callback(void *ptr, size_t size, size_t nmemb, - void *userdata); + void *userdata); // read callback function static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userdata); From 1a728c2ca1c71b5f99d2828fbe81eab971e72d7d Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 26 Dec 2015 17:56:34 -0500 Subject: [PATCH 065/212] add make target and travis setup to run valgrind --- .travis.yml | 6 +++++- Makefile.am | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d2cc7bcf..2ea69873 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,8 @@ language: cpp -script: ./autogen.sh && ./configure --enable-coverage && make test +script: + - ./autogen.sh && ./configure --enable-coverage + - make test + - make valgrind install: - gem install fpm - gem install package_cloud @@ -21,6 +24,7 @@ addons: - libcurl4-openssl-dev - doxygen - rpm + - valgrind deploy: provider: script script: ./autogen.sh && ./configure --prefix=`pwd`/usr && make deploy-packages diff --git a/Makefile.am b/Makefile.am index a1b02ec9..99258561 100644 --- a/Makefile.am +++ b/Makefile.am @@ -19,6 +19,9 @@ librestclient_cpp_la_LDFLAGS=-version-info 1:0:1 test: check ./test-program +valgrind: check + valgrind --leak-check=full --error-exitcode=0 ./test-program + clean-local: find . -name "*.gcda" -print0 | xargs -0 rm From 500b4a205c4329a22b588336b1403bd9008ba96e Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 9 Jan 2016 04:14:52 +0100 Subject: [PATCH 066/212] clean up Makefile this adds the README.md to dist data and also moves functionality regarding packaging and documentation into their own separate Makefiles that are included by automake --- Makefile.am | 70 ++++++------------------------------------- Makefile.docs.mk | 35 ++++++++++++++++++++++ Makefile.packaging.mk | 28 +++++++++++++++++ 3 files changed, 72 insertions(+), 61 deletions(-) create mode 100644 Makefile.docs.mk create mode 100644 Makefile.packaging.mk diff --git a/Makefile.am b/Makefile.am index 99258561..b232c0f3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -14,7 +14,12 @@ librestclient_cpp_la_SOURCES=source/restclient.cpp librestclient_cpp_la_CXXFLAGS=-fPIC librestclient_cpp_la_LDFLAGS=-version-info 1:0:1 -.PHONY: test check clean-coverage-files coverage-html docs clean-docs deploy-docs doxygen jekyll packages rpm deb include/restclient-cpp/version.h deploy-packages +dist_doc_DATA = README.md + +.PHONY: test check clean-coverage-files coverage-html include/restclient-cpp/version.h + +include/restclient-cpp/version.h: + m4 -I m4 -DM4_RESTCLIENT_VERSION=$(VERSION) version.h.m4 > $@ test: check ./test-program @@ -32,64 +37,7 @@ coverage.info: test coverage-html: coverage.info genhtml -t "restclient-cpp coverage report" --legend --show-details coverage.info --output-directory html -local-install: - $(MAKE) install PREFIX=usr - -NAME=restclient-cpp -VERSION = $(shell git describe --tags --always --dirty) -BUILDER = $(shell echo "`git config user.name` <`git config user.email`>") -PKG_RELEASE ?= 1 -PROJECT_URL="https://github.com/mrtazz/$(NAME)" -FPM_FLAGS= --name $(NAME) --version $(VERSION) --iteration $(PKG_RELEASE) \ - --epoch 1 --license MIT --maintainer "$(BUILDER)" --url $(PROJECT_URL) \ - --vendor mrtazz --description "C++ client for making HTTP/REST requests" \ - --depends curl usr - -rpm: - fpm -t rpm -s dir $(FPM_FLAGS) - -deb: - fpm -t deb -s dir $(FPM_FLAGS) - -packages: local-install rpm deb - -deploy-packages: packages - package_cloud push mrtazz/$(NAME)/el/7 *.rpm - package_cloud push mrtazz/$(NAME)/debian/wheezy *.deb - package_cloud push mrtazz/$(NAME)/ubuntu/trusty *.deb - -include/restclient-cpp/version.h: - m4 -I m4 --define=M4_RESTCLIENT_VERSION=$(VERSION) version.h.m4 > $@ - - -GAUGES_CODE="539c6c8de32bb442640005f3" - -doxygen: - doxygen doxygen.config - -jekyll: - echo "gaugesid: $(GAUGES_CODE)" > docs/_config.yml - echo "projecturl: $(PROJECT_URL)" >> docs/_config.yml - echo "basesite: http://www.unwiredcouch.com" >> docs/_config.yml - echo "markdown: redcarpet" >> docs/_config.yml - echo "---" > docs/index.md - echo "layout: project" >> docs/index.md - echo "title: $(NAME)" >> docs/index.md - echo "---" >> docs/index.md - cat README.md >> docs/index.md - -docs: doxygen jekyll - -clean-docs: - rm -rf ./docs - -deploy-docs: docs - @cd docs && git init && git remote add upstream "https://${GH_TOKEN}@github.com/mrtazz/$(NAME).git" && \ - git submodule add https://github.com/mrtazz/jekyll-layouts.git ./_layouts && \ - git submodule update --init && \ - git fetch upstream && git reset upstream/gh-pages && \ - git config user.name 'Daniel Schauenberg' && git config user.email d@unwiredcouch.com && \ - touch . && git add -A . && \ - git commit -m "rebuild pages at $(VERSION)" && \ - git push -q upstream HEAD:gh-pages +# include other make targets in the main Makefile +include $(srcdir)/Makefile.packaging.mk +include $(srcdir)/Makefile.docs.mk diff --git a/Makefile.docs.mk b/Makefile.docs.mk new file mode 100644 index 00000000..c509095d --- /dev/null +++ b/Makefile.docs.mk @@ -0,0 +1,35 @@ +# Make tasks to create and deploy documentation +.PHONY: docs clean-docs deploy-docs doxygen jekyll + +GAUGES_CODE="539c6c8de32bb442640005f3" + +doxygen: + doxygen doxygen.config + +jekyll: + install -d docs + echo "gaugesid: $(GAUGES_CODE)" > docs/_config.yml + echo "projecturl: $(PROJECT_URL)" >> docs/_config.yml + echo "basesite: http://www.unwiredcouch.com" >> docs/_config.yml + echo "markdown: redcarpet" >> docs/_config.yml + echo "---" > docs/index.md + echo "layout: project" >> docs/index.md + echo "title: $(NAME)" >> docs/index.md + echo "---" >> docs/index.md + cat README.md >> docs/index.md + +docs: doxygen jekyll + +clean-docs: + rm -rf ./docs + +deploy-docs: docs + @cd docs && git init && git remote add upstream "https://${GH_TOKEN}@github.com/mrtazz/$(NAME).git" && \ + git submodule add https://github.com/mrtazz/jekyll-layouts.git ./_layouts && \ + git submodule update --init && \ + git fetch upstream && git reset upstream/gh-pages && \ + git config user.name 'Daniel Schauenberg' && git config user.email d@unwiredcouch.com && \ + touch . && git add -A . && \ + git commit -m "rebuild pages at $(VERSION)" && \ + git push -q upstream HEAD:gh-pages + diff --git a/Makefile.packaging.mk b/Makefile.packaging.mk new file mode 100644 index 00000000..268b4017 --- /dev/null +++ b/Makefile.packaging.mk @@ -0,0 +1,28 @@ +# make tasks to create and publish packages +.PHONY: rpm deb packages deploy-packages + +local-install: + $(MAKE) install PREFIX=usr + +NAME=restclient-cpp +VERSION = $(shell git describe --tags --always --dirty) +BUILDER = $(shell echo "`git config user.name` <`git config user.email`>") +PKG_RELEASE ?= 1 +PROJECT_URL="https://github.com/mrtazz/$(NAME)" +FPM_FLAGS= --name $(NAME) --version $(VERSION) --iteration $(PKG_RELEASE) \ + --epoch 1 --license MIT --maintainer "$(BUILDER)" --url $(PROJECT_URL) \ + --vendor mrtazz --description "C++ client for making HTTP/REST requests" \ + --depends curl usr + +rpm: + fpm -t rpm -s dir $(FPM_FLAGS) + +deb: + fpm -t deb -s dir $(FPM_FLAGS) + +packages: local-install rpm deb + +deploy-packages: packages + package_cloud push mrtazz/$(NAME)/el/7 *.rpm + package_cloud push mrtazz/$(NAME)/debian/wheezy *.deb + package_cloud push mrtazz/$(NAME)/ubuntu/trusty *.deb From 5ba370c94fd85c0bef191904bd8fccc129077bde Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 9 Jan 2016 04:19:14 +0100 Subject: [PATCH 067/212] clean up configure.ac this adds a URL to the AC_INIT function and fixes the version and the AM_INIT call. Also cleans up the comments to be more accurate and simplifies the check for curl headers. --- configure.ac | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/configure.ac b/configure.ac index 97f31e9a..71d3c4f0 100644 --- a/configure.ac +++ b/configure.ac @@ -1,9 +1,7 @@ -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - AC_PREREQ([2.52]) -AC_INIT([restclient-cpp], [0.1.2], [d@unwiredcouch.com]) -AM_INIT_AUTOMAKE([0.1.2 foreign subdir-objects]) +AC_INIT([restclient-cpp], [0.2.0], [d@unwiredcouch.com], + [http://code.mrtazz.com/restclient-cpp]) +AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT AC_CONFIG_HEADERS([config.h]) AC_CONFIG_MACRO_DIR([m4]) @@ -14,25 +12,20 @@ AC_PROG_CC AC_PROG_INSTALL # check for headers -AC_CHECK_HEADERS([curl/curl.h], - [restclient_cpp_curl_headers_found=yes; break;]) - -AS_IF([test "x$restclient_cpp_curl_headers_found" != "xyes"], - [AC_MSG_ERROR([Unable to find the curl headers])]) +AC_CHECK_HEADERS([curl/curl.h]) # Checks for libraries. # FIXME: Replace `main' with a function in `-lcurl': AC_CHECK_LIB([curl], [main]) -# Checks for header files. - # Checks for typedefs, structures, and compiler characteristics. AC_C_INLINE AC_TYPE_SIZE_T -# Checks for library functions. - AC_CONFIG_FILES([Makefile]) + +# enable code coverage with ./configure --enable-coverage AC_ARG_ENABLE(coverage, AC_HELP_STRING([--enable-coverage],[Enable code coverage]), [CXXFLAGS=" -O0 -g -ftest-coverage -fprofile-arcs"]) + AC_OUTPUT From 79857f6073338667718ee67be23a5c0033d0fa19 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 9 Jan 2016 04:20:35 +0100 Subject: [PATCH 068/212] adapt the build_gtest script to use gmake if available this makes it possible to run the script on systems like FreeBSD where make is not GNU make by default --- utils/build_gtest.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/build_gtest.sh b/utils/build_gtest.sh index 2f206280..f7912998 100755 --- a/utils/build_gtest.sh +++ b/utils/build_gtest.sh @@ -2,4 +2,5 @@ cd vendor/gtest-1.7.0 autoreconf -i ./configure -make + +which -s gmake && gmake || make From f1c25ecfe5aa45932af9818423c3b04cb1bd2e12 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 10 Jan 2016 11:39:42 -0500 Subject: [PATCH 069/212] remove web URL from configure init this ended up installing some things under the URL prefix. Until I've figured this one out, let's remove the URL. --- configure.ac | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 71d3c4f0..bb3b34fe 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,5 @@ AC_PREREQ([2.52]) -AC_INIT([restclient-cpp], [0.2.0], [d@unwiredcouch.com], - [http://code.mrtazz.com/restclient-cpp]) +AC_INIT([restclient-cpp], [0.2.0], [d@unwiredcouch.com]) AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT AC_CONFIG_HEADERS([config.h]) From 36cf172fa14e1b10a4203b2916dc6414ba339791 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 10 Jan 2016 11:40:48 -0500 Subject: [PATCH 070/212] update CHANGELOG for 0.3.0 and bump version --- CHANGELOG.md | 21 +++++++++++++++++++++ configure.ac | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b45b9bf..564a0c00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## v0.4.0 (???) + +## v0.3.0 (10th January 2016) + +### Features +- added support for connection timeouts (Islam Yasar) +- Allow for setting additional HTTP headers (Karol Samborski) + +### Improvements and Bug fixes +- improve general documentation and add docs for auth (Daniel Schauenberg) +- remove calls to curl_global_cleanup (Daniel Schauenberg) +- add unit test for basic auth (Daniel Schauenberg) +- switch unit tests to use [http://httpbin.org]() (Daniel Schauenberg) +- move two include instructions (Jos) +- added reporting for test coverage (Daniel Schauenberg) +- cleanup version gen to be driven by git tags (Daniel Schauenberg) +- clean up build and support building on FreeBSD (Daniel Schauenberg) +- automate package deployment to packagecloud (Daniel Schauenberg) +- add automatic doc build & deploy (Daniel Schauenberg) +- Ensure the built shared library does not have dynamic references to libgtest (Thomas Goetze) + ## v0.2.0 (19th April 2015) - support basic auth - Add header's to response object diff --git a/configure.ac b/configure.ac index bb3b34fe..7382168f 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ([2.52]) -AC_INIT([restclient-cpp], [0.2.0], [d@unwiredcouch.com]) +AC_INIT([restclient-cpp], [0.3.0], [d@unwiredcouch.com]) AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT AC_CONFIG_HEADERS([config.h]) From 866b731654a75f30f73459cb6299f0135ecc4c14 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 12 Jan 2016 14:07:41 -0500 Subject: [PATCH 071/212] add doxygen reference badge to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4aba7ea3..f5882eac 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![Build Status](https://travis-ci.org/mrtazz/restclient-cpp.svg?branch=master)](https://travis-ci.org/mrtazz/restclient-cpp) [![Coverage Status](https://coveralls.io/repos/mrtazz/restclient-cpp/badge.svg?branch=master&service=github)](https://coveralls.io/github/mrtazz/restclient-cpp?branch=master) [![Packagecloud](https://img.shields.io/badge/packagecloud-available-brightgreen.svg)](https://packagecloud.io/mrtazz/restclient-cpp) +[![doxygen](https://img.shields.io/badge/doxygen-reference-blue.svg)](http://code.mrtazz.com/restclient-cpp/ref/) [![MIT license](https://img.shields.io/badge/license-MIT-blue.svg)](http://opensource.org/licenses/MIT) From 798cf4d9df04d21598b362143f3d2fdc34dcb45f Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 12 Jan 2016 14:04:22 -0500 Subject: [PATCH 072/212] first design stab at API refactor this splits up the way to interact with endpoints into a simple and an advanced usage way. The simple way mostly corresponds to the old API. The new way is via a `connection` object that can be configured with different properties. related to #27, #31, #33 --- README.md | 100 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 83 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index f5882eac..c26a121b 100644 --- a/README.md +++ b/README.md @@ -7,42 +7,87 @@ ## About -This is a simple REST client for C++. It wraps libcurl for HTTP requests. +This is a simple REST client for C++. It wraps [libcurl][] for HTTP requests. ## Usage -I tried to keep usage close to the [ruby rest-client][]. So the basic usage is: +restclient-cpp provides two ways of interacting with REST endpoints. There is +a simple one, which doesn't need you to configure an object to interact with +an API. However the simple way doesn't provide a lot of configuration options +either. So if you need more than just a simple HTTP call, you will probably +want to check out the advanced usage. -```cpp -RestClient::method(url, content-type, params); -// or -RestClient::method(url, content-type, params, headers); -``` - -Examples: +### Simple API +The simple API is just some static methods modeled after the most common HTTP +verbs: ```cpp #include "restclient-cpp/restclient.h" +// initialize RestClient +RestClient::init() + RestClient::response r = RestClient::get("http://url.com") RestClient::response r = RestClient::post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}") RestClient::response r = RestClient::put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}") RestClient::response r = RestClient::del("http://url.com/delete") -// add some headers +// deinit RestClient. After calling this you have to call RestClient::init() +// again before you can use it +RestClient::disable(); +``` + +The response is of type [RestClient::response][restclient_response] and has +three attributes: + +```cpp +RestClient::response.code // HTTP response code +RestClient::response.body // HTTP response body +RestClient::response.headers // HTTP response headers +``` + +### Advanced Usage +However if you want more sophisticated features like connection reuse, +timeouts or authentication, there is also a different, more configurable way. +```cpp +#include "restclient-cpp/restclient.h" + +// initialize RestClient +RestClient::init(); + +// get a connection object +RestClient::Connection conn = new RestClient::Connection(); + +// configure basic auth +conn->SetBasicAuth("WarMachine68", "WARMACHINEROX"); + +// set connection timeout to 5s +conn->SetTimeout(5); + +// set custom user agent +// (this will result in the UA "foo/cool restclient-cpp/VERSION") +conn->SetUserAgent("foo/cool"); + +// set headers RestClient::headermap headers; headers["Accept"] = "application/json"; +conn->SetHeaders(headers) -RestClient::response r = RestClient::get("http://url.com", headers) -RestClient::response r = RestClient::post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}", headers) -RestClient::response r = RestClient::put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}", headers) -RestClient::response r = RestClient::del("http://url.com/delete", headers) +// append additional headers +conn->AppendHeader("X-MY-HEADER", "foo") -RestClient::setAuth("WarMachine68", "WARMACHINEROX"); +RestClient::response r = conn->get("http://url.com") +RestClient::response r = conn->post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}") +RestClient::response r = conn->put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}") +RestClient::response r = conn->del("http://url.com/delete") +// deinit RestClient. After calling this you have to call RestClient::init() +// again before you can use it +RestClient::disable(); ``` -The response is of type RestClient::response and has three attributes: +The responses are again of type [RestClient::response][restclient_response] +and have three attributes: ```cpp RestClient::response.code // HTTP response code @@ -50,6 +95,25 @@ RestClient::response.body // HTTP response body RestClient::response.headers // HTTP response headers ``` +#### Persistent connections/Keep-Alive +The connection object stores the curl easy handle in an instance variable and +uses that for lifetime of the object. This means curl will [automatically +reuse connections][curl_keepalive] made with that handle. + + +## Thread Safety +restclient-cpp leans heavily on libcurl as it aims to provide a thin wrapper +around it. This means it adheres to the basic level of thread safety [provided +by libcurl][curl_threadsafety]. The `RestClient::init()` and +`RestClient::disable()` methods basically correspond to `curl_global_init` and +`curl_global_cleanup` and thus need to be called right at the beginning of +your program and before shutdown respectively. These set up the environment +and are **not thread-safe**. After that you can create connection objects or +run the static methods from within your threads. Do not share connection +objects across threads as this would mean accessing curl handles from multiple +threads at the same time which is not allowed. + + ## Dependencies - [libcurl][] @@ -71,7 +135,9 @@ merged as fast as possible. [libcurl]: http://curl.haxx.se/libcurl/ -[ruby rest-client]: http://github.com/archiloque/rest-client [gtest]: http://code.google.com/p/googletest/ [packagecloud]: https://packagecloud.io/mrtazz/restclient-cpp [contributing]: https://github.com/mrtazz/restclient-cpp/blob/master/CONTRIBUTING.md +[curl_keepalive]: http://curl.haxx.se/docs/faq.html#What_about_Keep_Alive_or_persist +[curl_threadsafety]: http://curl.haxx.se/libcurl/c/threadsafe.html +[restclient_response]: http://code.mrtazz.com/restclient-cpp/ref/struct_rest_client_1_1response.html From 51cf554da918574f652ad273a88505d9823320d7 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 12 Jan 2016 14:09:37 -0500 Subject: [PATCH 073/212] fix description in doxygen config --- doxygen.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doxygen.config b/doxygen.config index 4348acd6..f50b7984 100644 --- a/doxygen.config +++ b/doxygen.config @@ -44,7 +44,7 @@ PROJECT_NUMBER = # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. -PROJECT_BRIEF = "metrics library for C++11" +PROJECT_BRIEF = "C++ client for making HTTP/REST requests" # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 From 556ea43cb2f60268ec479a0620193553cafd8c8e Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 13 Jan 2016 21:42:45 -0500 Subject: [PATCH 074/212] some updates to the redesign --- README.md | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index c26a121b..e6c837fd 100644 --- a/README.md +++ b/README.md @@ -16,24 +16,17 @@ an API. However the simple way doesn't provide a lot of configuration options either. So if you need more than just a simple HTTP call, you will probably want to check out the advanced usage. -### Simple API +### Simple Usage The simple API is just some static methods modeled after the most common HTTP verbs: ```cpp #include "restclient-cpp/restclient.h" -// initialize RestClient -RestClient::init() - RestClient::response r = RestClient::get("http://url.com") RestClient::response r = RestClient::post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}") RestClient::response r = RestClient::put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}") RestClient::response r = RestClient::del("http://url.com/delete") - -// deinit RestClient. After calling this you have to call RestClient::init() -// again before you can use it -RestClient::disable(); ``` The response is of type [RestClient::response][restclient_response] and has @@ -108,10 +101,14 @@ by libcurl][curl_threadsafety]. The `RestClient::init()` and `RestClient::disable()` methods basically correspond to `curl_global_init` and `curl_global_cleanup` and thus need to be called right at the beginning of your program and before shutdown respectively. These set up the environment -and are **not thread-safe**. After that you can create connection objects or -run the static methods from within your threads. Do not share connection -objects across threads as this would mean accessing curl handles from multiple -threads at the same time which is not allowed. +and are **not thread-safe**. After that you can create connection objects in +your threads. Do not share connection objects across threads as this would +mean accessing curl handles from multiple threads at the same time which is +not allowed. + +In order to provide an easy to use API, the simple usage via the static +methods implicitly calls the curl global functions and is therefore also **not +thread-safe**. ## Dependencies From 69cf32f0a9ed8ade34d010dc2826455da5686cbb Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 18 Jan 2016 12:04:21 -0500 Subject: [PATCH 075/212] vendorize cpplint and add lint and ci make tasks --- Makefile.am | 7 +- utils/cpplint.py | 6323 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 6329 insertions(+), 1 deletion(-) create mode 100755 utils/cpplint.py diff --git a/Makefile.am b/Makefile.am index b232c0f3..e7d7acab 100644 --- a/Makefile.am +++ b/Makefile.am @@ -16,7 +16,7 @@ librestclient_cpp_la_LDFLAGS=-version-info 1:0:1 dist_doc_DATA = README.md -.PHONY: test check clean-coverage-files coverage-html include/restclient-cpp/version.h +.PHONY: test check clean-coverage-files coverage-html include/restclient-cpp/version.h lint ci include/restclient-cpp/version.h: m4 -I m4 -DM4_RESTCLIENT_VERSION=$(VERSION) version.h.m4 > $@ @@ -27,6 +27,11 @@ test: check valgrind: check valgrind --leak-check=full --error-exitcode=0 ./test-program +lint: + ./utils/cpplint.py --filter=-legal/copyright include/restclient-cpp/*.h source/*.cc + +ci: lint test valgrind + clean-local: find . -name "*.gcda" -print0 | xargs -0 rm diff --git a/utils/cpplint.py b/utils/cpplint.py new file mode 100755 index 00000000..ccc25d4c --- /dev/null +++ b/utils/cpplint.py @@ -0,0 +1,6323 @@ +#!/usr/bin/env python +# +# Copyright (c) 2009 Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Does google-lint on c++ files. + +The goal of this script is to identify places in the code that *may* +be in non-compliance with google style. It does not attempt to fix +up these problems -- the point is to educate. It does also not +attempt to find all problems, or to ensure that everything it does +find is legitimately a problem. + +In particular, we can get very confused by /* and // inside strings! +We do a small hack, which is to ignore //'s with "'s after them on the +same line, but it is far from perfect (in either direction). +""" + +import codecs +import copy +import getopt +import math # for log +import os +import re +import sre_compile +import string +import sys +import unicodedata + + +_USAGE = """ +Syntax: cpplint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...] + [--counting=total|toplevel|detailed] [--root=subdir] + [--linelength=digits] + [file] ... + + The style guidelines this tries to follow are those in + http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml + + Every problem is given a confidence score from 1-5, with 5 meaning we are + certain of the problem, and 1 meaning it could be a legitimate construct. + This will miss some errors, and is not a substitute for a code review. + + To suppress false-positive errors of a certain category, add a + 'NOLINT(category)' comment to the line. NOLINT or NOLINT(*) + suppresses errors of all categories on that line. + + The files passed in will be linted; at least one file must be provided. + Default linted extensions are .cc, .cpp, .cu, .cuh and .h. Change the + extensions with the --extensions flag. + + Flags: + + output=vs7 + By default, the output is formatted to ease emacs parsing. Visual Studio + compatible output (vs7) may also be used. Other formats are unsupported. + + verbose=# + Specify a number 0-5 to restrict errors to certain verbosity levels. + + filter=-x,+y,... + Specify a comma-separated list of category-filters to apply: only + error messages whose category names pass the filters will be printed. + (Category names are printed with the message and look like + "[whitespace/indent]".) Filters are evaluated left to right. + "-FOO" and "FOO" means "do not print categories that start with FOO". + "+FOO" means "do print categories that start with FOO". + + Examples: --filter=-whitespace,+whitespace/braces + --filter=whitespace,runtime/printf,+runtime/printf_format + --filter=-,+build/include_what_you_use + + To see a list of all the categories used in cpplint, pass no arg: + --filter= + + counting=total|toplevel|detailed + The total number of errors found is always printed. If + 'toplevel' is provided, then the count of errors in each of + the top-level categories like 'build' and 'whitespace' will + also be printed. If 'detailed' is provided, then a count + is provided for each category like 'build/class'. + + root=subdir + The root directory used for deriving header guard CPP variable. + By default, the header guard CPP variable is calculated as the relative + path to the directory that contains .git, .hg, or .svn. When this flag + is specified, the relative path is calculated from the specified + directory. If the specified directory does not exist, this flag is + ignored. + + Examples: + Assuming that src/.git exists, the header guard CPP variables for + src/chrome/browser/ui/browser.h are: + + No flag => CHROME_BROWSER_UI_BROWSER_H_ + --root=chrome => BROWSER_UI_BROWSER_H_ + --root=chrome/browser => UI_BROWSER_H_ + + linelength=digits + This is the allowed line length for the project. The default value is + 80 characters. + + Examples: + --linelength=120 + + extensions=extension,extension,... + The allowed file extensions that cpplint will check + + Examples: + --extensions=hpp,cpp + + cpplint.py supports per-directory configurations specified in CPPLINT.cfg + files. CPPLINT.cfg file can contain a number of key=value pairs. + Currently the following options are supported: + + set noparent + filter=+filter1,-filter2,... + exclude_files=regex + linelength=80 + + "set noparent" option prevents cpplint from traversing directory tree + upwards looking for more .cfg files in parent directories. This option + is usually placed in the top-level project directory. + + The "filter" option is similar in function to --filter flag. It specifies + message filters in addition to the |_DEFAULT_FILTERS| and those specified + through --filter command-line flag. + + "exclude_files" allows to specify a regular expression to be matched against + a file name. If the expression matches, the file is skipped and not run + through liner. + + "linelength" allows to specify the allowed line length for the project. + + CPPLINT.cfg has an effect on files in the same directory and all + sub-directories, unless overridden by a nested configuration file. + + Example file: + filter=-build/include_order,+build/include_alpha + exclude_files=.*\.cc + + The above example disables build/include_order warning and enables + build/include_alpha as well as excludes all .cc from being + processed by linter, in the current directory (where the .cfg + file is located) and all sub-directories. +""" + +# We categorize each error message we print. Here are the categories. +# We want an explicit list so we can list them all in cpplint --filter=. +# If you add a new error message with a new category, add it to the list +# here! cpplint_unittest.py should tell you if you forget to do this. +_ERROR_CATEGORIES = [ + 'build/class', + 'build/c++11', + 'build/deprecated', + 'build/endif_comment', + 'build/explicit_make_pair', + 'build/forward_decl', + 'build/header_guard', + 'build/include', + 'build/include_alpha', + 'build/include_order', + 'build/include_what_you_use', + 'build/namespaces', + 'build/printf_format', + 'build/storage_class', + 'legal/copyright', + 'readability/alt_tokens', + 'readability/braces', + 'readability/casting', + 'readability/check', + 'readability/constructors', + 'readability/fn_size', + 'readability/function', + 'readability/inheritance', + 'readability/multiline_comment', + 'readability/multiline_string', + 'readability/namespace', + 'readability/nolint', + 'readability/nul', + 'readability/strings', + 'readability/todo', + 'readability/utf8', + 'runtime/arrays', + 'runtime/casting', + 'runtime/explicit', + 'runtime/int', + 'runtime/init', + 'runtime/invalid_increment', + 'runtime/member_string_references', + 'runtime/memset', + 'runtime/indentation_namespace', + 'runtime/operator', + 'runtime/printf', + 'runtime/printf_format', + 'runtime/references', + 'runtime/string', + 'runtime/threadsafe_fn', + 'runtime/vlog', + 'whitespace/blank_line', + 'whitespace/braces', + 'whitespace/comma', + 'whitespace/comments', + 'whitespace/empty_conditional_body', + 'whitespace/empty_loop_body', + 'whitespace/end_of_line', + 'whitespace/ending_newline', + 'whitespace/forcolon', + 'whitespace/indent', + 'whitespace/line_length', + 'whitespace/newline', + 'whitespace/operators', + 'whitespace/parens', + 'whitespace/semicolon', + 'whitespace/tab', + 'whitespace/todo', + ] + +# These error categories are no longer enforced by cpplint, but for backwards- +# compatibility they may still appear in NOLINT comments. +_LEGACY_ERROR_CATEGORIES = [ + 'readability/streams', + ] + +# The default state of the category filter. This is overridden by the --filter= +# flag. By default all errors are on, so only add here categories that should be +# off by default (i.e., categories that must be enabled by the --filter= flags). +# All entries here should start with a '-' or '+', as in the --filter= flag. +_DEFAULT_FILTERS = ['-build/include_alpha'] + +# We used to check for high-bit characters, but after much discussion we +# decided those were OK, as long as they were in UTF-8 and didn't represent +# hard-coded international strings, which belong in a separate i18n file. + +# C++ headers +_CPP_HEADERS = frozenset([ + # Legacy + 'algobase.h', + 'algo.h', + 'alloc.h', + 'builtinbuf.h', + 'bvector.h', + 'complex.h', + 'defalloc.h', + 'deque.h', + 'editbuf.h', + 'fstream.h', + 'function.h', + 'hash_map', + 'hash_map.h', + 'hash_set', + 'hash_set.h', + 'hashtable.h', + 'heap.h', + 'indstream.h', + 'iomanip.h', + 'iostream.h', + 'istream.h', + 'iterator.h', + 'list.h', + 'map.h', + 'multimap.h', + 'multiset.h', + 'ostream.h', + 'pair.h', + 'parsestream.h', + 'pfstream.h', + 'procbuf.h', + 'pthread_alloc', + 'pthread_alloc.h', + 'rope', + 'rope.h', + 'ropeimpl.h', + 'set.h', + 'slist', + 'slist.h', + 'stack.h', + 'stdiostream.h', + 'stl_alloc.h', + 'stl_relops.h', + 'streambuf.h', + 'stream.h', + 'strfile.h', + 'strstream.h', + 'tempbuf.h', + 'tree.h', + 'type_traits.h', + 'vector.h', + # 17.6.1.2 C++ library headers + 'algorithm', + 'array', + 'atomic', + 'bitset', + 'chrono', + 'codecvt', + 'complex', + 'condition_variable', + 'deque', + 'exception', + 'forward_list', + 'fstream', + 'functional', + 'future', + 'initializer_list', + 'iomanip', + 'ios', + 'iosfwd', + 'iostream', + 'istream', + 'iterator', + 'limits', + 'list', + 'locale', + 'map', + 'memory', + 'mutex', + 'new', + 'numeric', + 'ostream', + 'queue', + 'random', + 'ratio', + 'regex', + 'set', + 'sstream', + 'stack', + 'stdexcept', + 'streambuf', + 'string', + 'strstream', + 'system_error', + 'thread', + 'tuple', + 'typeindex', + 'typeinfo', + 'type_traits', + 'unordered_map', + 'unordered_set', + 'utility', + 'valarray', + 'vector', + # 17.6.1.2 C++ headers for C library facilities + 'cassert', + 'ccomplex', + 'cctype', + 'cerrno', + 'cfenv', + 'cfloat', + 'cinttypes', + 'ciso646', + 'climits', + 'clocale', + 'cmath', + 'csetjmp', + 'csignal', + 'cstdalign', + 'cstdarg', + 'cstdbool', + 'cstddef', + 'cstdint', + 'cstdio', + 'cstdlib', + 'cstring', + 'ctgmath', + 'ctime', + 'cuchar', + 'cwchar', + 'cwctype', + ]) + + +# These headers are excluded from [build/include] and [build/include_order] +# checks: +# - Anything not following google file name conventions (containing an +# uppercase character, such as Python.h or nsStringAPI.h, for example). +# - Lua headers. +_THIRD_PARTY_HEADERS_PATTERN = re.compile( + r'^(?:[^/]*[A-Z][^/]*\.h|lua\.h|lauxlib\.h|lualib\.h)$') + + +# Assertion macros. These are defined in base/logging.h and +# testing/base/gunit.h. Note that the _M versions need to come first +# for substring matching to work. +_CHECK_MACROS = [ + 'DCHECK', 'CHECK', + 'EXPECT_TRUE_M', 'EXPECT_TRUE', + 'ASSERT_TRUE_M', 'ASSERT_TRUE', + 'EXPECT_FALSE_M', 'EXPECT_FALSE', + 'ASSERT_FALSE_M', 'ASSERT_FALSE', + ] + +# Replacement macros for CHECK/DCHECK/EXPECT_TRUE/EXPECT_FALSE +_CHECK_REPLACEMENT = dict([(m, {}) for m in _CHECK_MACROS]) + +for op, replacement in [('==', 'EQ'), ('!=', 'NE'), + ('>=', 'GE'), ('>', 'GT'), + ('<=', 'LE'), ('<', 'LT')]: + _CHECK_REPLACEMENT['DCHECK'][op] = 'DCHECK_%s' % replacement + _CHECK_REPLACEMENT['CHECK'][op] = 'CHECK_%s' % replacement + _CHECK_REPLACEMENT['EXPECT_TRUE'][op] = 'EXPECT_%s' % replacement + _CHECK_REPLACEMENT['ASSERT_TRUE'][op] = 'ASSERT_%s' % replacement + _CHECK_REPLACEMENT['EXPECT_TRUE_M'][op] = 'EXPECT_%s_M' % replacement + _CHECK_REPLACEMENT['ASSERT_TRUE_M'][op] = 'ASSERT_%s_M' % replacement + +for op, inv_replacement in [('==', 'NE'), ('!=', 'EQ'), + ('>=', 'LT'), ('>', 'LE'), + ('<=', 'GT'), ('<', 'GE')]: + _CHECK_REPLACEMENT['EXPECT_FALSE'][op] = 'EXPECT_%s' % inv_replacement + _CHECK_REPLACEMENT['ASSERT_FALSE'][op] = 'ASSERT_%s' % inv_replacement + _CHECK_REPLACEMENT['EXPECT_FALSE_M'][op] = 'EXPECT_%s_M' % inv_replacement + _CHECK_REPLACEMENT['ASSERT_FALSE_M'][op] = 'ASSERT_%s_M' % inv_replacement + +# Alternative tokens and their replacements. For full list, see section 2.5 +# Alternative tokens [lex.digraph] in the C++ standard. +# +# Digraphs (such as '%:') are not included here since it's a mess to +# match those on a word boundary. +_ALT_TOKEN_REPLACEMENT = { + 'and': '&&', + 'bitor': '|', + 'or': '||', + 'xor': '^', + 'compl': '~', + 'bitand': '&', + 'and_eq': '&=', + 'or_eq': '|=', + 'xor_eq': '^=', + 'not': '!', + 'not_eq': '!=' + } + +# Compile regular expression that matches all the above keywords. The "[ =()]" +# bit is meant to avoid matching these keywords outside of boolean expressions. +# +# False positives include C-style multi-line comments and multi-line strings +# but those have always been troublesome for cpplint. +_ALT_TOKEN_REPLACEMENT_PATTERN = re.compile( + r'[ =()](' + ('|'.join(_ALT_TOKEN_REPLACEMENT.keys())) + r')(?=[ (]|$)') + + +# These constants define types of headers for use with +# _IncludeState.CheckNextIncludeOrder(). +_C_SYS_HEADER = 1 +_CPP_SYS_HEADER = 2 +_LIKELY_MY_HEADER = 3 +_POSSIBLE_MY_HEADER = 4 +_OTHER_HEADER = 5 + +# These constants define the current inline assembly state +_NO_ASM = 0 # Outside of inline assembly block +_INSIDE_ASM = 1 # Inside inline assembly block +_END_ASM = 2 # Last line of inline assembly block +_BLOCK_ASM = 3 # The whole block is an inline assembly block + +# Match start of assembly blocks +_MATCH_ASM = re.compile(r'^\s*(?:asm|_asm|__asm|__asm__)' + r'(?:\s+(volatile|__volatile__))?' + r'\s*[{(]') + + +_regexp_compile_cache = {} + +# {str, set(int)}: a map from error categories to sets of linenumbers +# on which those errors are expected and should be suppressed. +_error_suppressions = {} + +# The root directory used for deriving header guard CPP variable. +# This is set by --root flag. +_root = None + +# The allowed line length of files. +# This is set by --linelength flag. +_line_length = 80 + +# The allowed extensions for file names +# This is set by --extensions flag. +_valid_extensions = set(['cc', 'h', 'cpp', 'cu', 'cuh']) + +def ParseNolintSuppressions(filename, raw_line, linenum, error): + """Updates the global list of error-suppressions. + + Parses any NOLINT comments on the current line, updating the global + error_suppressions store. Reports an error if the NOLINT comment + was malformed. + + Args: + filename: str, the name of the input file. + raw_line: str, the line of input text, with comments. + linenum: int, the number of the current line. + error: function, an error handler. + """ + matched = Search(r'\bNOLINT(NEXTLINE)?\b(\([^)]+\))?', raw_line) + if matched: + if matched.group(1): + suppressed_line = linenum + 1 + else: + suppressed_line = linenum + category = matched.group(2) + if category in (None, '(*)'): # => "suppress all" + _error_suppressions.setdefault(None, set()).add(suppressed_line) + else: + if category.startswith('(') and category.endswith(')'): + category = category[1:-1] + if category in _ERROR_CATEGORIES: + _error_suppressions.setdefault(category, set()).add(suppressed_line) + elif category not in _LEGACY_ERROR_CATEGORIES: + error(filename, linenum, 'readability/nolint', 5, + 'Unknown NOLINT error category: %s' % category) + + +def ResetNolintSuppressions(): + """Resets the set of NOLINT suppressions to empty.""" + _error_suppressions.clear() + + +def IsErrorSuppressedByNolint(category, linenum): + """Returns true if the specified error category is suppressed on this line. + + Consults the global error_suppressions map populated by + ParseNolintSuppressions/ResetNolintSuppressions. + + Args: + category: str, the category of the error. + linenum: int, the current line number. + Returns: + bool, True iff the error should be suppressed due to a NOLINT comment. + """ + return (linenum in _error_suppressions.get(category, set()) or + linenum in _error_suppressions.get(None, set())) + + +def Match(pattern, s): + """Matches the string with the pattern, caching the compiled regexp.""" + # The regexp compilation caching is inlined in both Match and Search for + # performance reasons; factoring it out into a separate function turns out + # to be noticeably expensive. + if pattern not in _regexp_compile_cache: + _regexp_compile_cache[pattern] = sre_compile.compile(pattern) + return _regexp_compile_cache[pattern].match(s) + + +def ReplaceAll(pattern, rep, s): + """Replaces instances of pattern in a string with a replacement. + + The compiled regex is kept in a cache shared by Match and Search. + + Args: + pattern: regex pattern + rep: replacement text + s: search string + + Returns: + string with replacements made (or original string if no replacements) + """ + if pattern not in _regexp_compile_cache: + _regexp_compile_cache[pattern] = sre_compile.compile(pattern) + return _regexp_compile_cache[pattern].sub(rep, s) + + +def Search(pattern, s): + """Searches the string for the pattern, caching the compiled regexp.""" + if pattern not in _regexp_compile_cache: + _regexp_compile_cache[pattern] = sre_compile.compile(pattern) + return _regexp_compile_cache[pattern].search(s) + + +class _IncludeState(object): + """Tracks line numbers for includes, and the order in which includes appear. + + include_list contains list of lists of (header, line number) pairs. + It's a lists of lists rather than just one flat list to make it + easier to update across preprocessor boundaries. + + Call CheckNextIncludeOrder() once for each header in the file, passing + in the type constants defined above. Calls in an illegal order will + raise an _IncludeError with an appropriate error message. + + """ + # self._section will move monotonically through this set. If it ever + # needs to move backwards, CheckNextIncludeOrder will raise an error. + _INITIAL_SECTION = 0 + _MY_H_SECTION = 1 + _C_SECTION = 2 + _CPP_SECTION = 3 + _OTHER_H_SECTION = 4 + + _TYPE_NAMES = { + _C_SYS_HEADER: 'C system header', + _CPP_SYS_HEADER: 'C++ system header', + _LIKELY_MY_HEADER: 'header this file implements', + _POSSIBLE_MY_HEADER: 'header this file may implement', + _OTHER_HEADER: 'other header', + } + _SECTION_NAMES = { + _INITIAL_SECTION: "... nothing. (This can't be an error.)", + _MY_H_SECTION: 'a header this file implements', + _C_SECTION: 'C system header', + _CPP_SECTION: 'C++ system header', + _OTHER_H_SECTION: 'other header', + } + + def __init__(self): + self.include_list = [[]] + self.ResetSection('') + + def FindHeader(self, header): + """Check if a header has already been included. + + Args: + header: header to check. + Returns: + Line number of previous occurrence, or -1 if the header has not + been seen before. + """ + for section_list in self.include_list: + for f in section_list: + if f[0] == header: + return f[1] + return -1 + + def ResetSection(self, directive): + """Reset section checking for preprocessor directive. + + Args: + directive: preprocessor directive (e.g. "if", "else"). + """ + # The name of the current section. + self._section = self._INITIAL_SECTION + # The path of last found header. + self._last_header = '' + + # Update list of includes. Note that we never pop from the + # include list. + if directive in ('if', 'ifdef', 'ifndef'): + self.include_list.append([]) + elif directive in ('else', 'elif'): + self.include_list[-1] = [] + + def SetLastHeader(self, header_path): + self._last_header = header_path + + def CanonicalizeAlphabeticalOrder(self, header_path): + """Returns a path canonicalized for alphabetical comparison. + + - replaces "-" with "_" so they both cmp the same. + - removes '-inl' since we don't require them to be after the main header. + - lowercase everything, just in case. + + Args: + header_path: Path to be canonicalized. + + Returns: + Canonicalized path. + """ + return header_path.replace('-inl.h', '.h').replace('-', '_').lower() + + def IsInAlphabeticalOrder(self, clean_lines, linenum, header_path): + """Check if a header is in alphabetical order with the previous header. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + header_path: Canonicalized header to be checked. + + Returns: + Returns true if the header is in alphabetical order. + """ + # If previous section is different from current section, _last_header will + # be reset to empty string, so it's always less than current header. + # + # If previous line was a blank line, assume that the headers are + # intentionally sorted the way they are. + if (self._last_header > header_path and + Match(r'^\s*#\s*include\b', clean_lines.elided[linenum - 1])): + return False + return True + + def CheckNextIncludeOrder(self, header_type): + """Returns a non-empty error message if the next header is out of order. + + This function also updates the internal state to be ready to check + the next include. + + Args: + header_type: One of the _XXX_HEADER constants defined above. + + Returns: + The empty string if the header is in the right order, or an + error message describing what's wrong. + + """ + error_message = ('Found %s after %s' % + (self._TYPE_NAMES[header_type], + self._SECTION_NAMES[self._section])) + + last_section = self._section + + if header_type == _C_SYS_HEADER: + if self._section <= self._C_SECTION: + self._section = self._C_SECTION + else: + self._last_header = '' + return error_message + elif header_type == _CPP_SYS_HEADER: + if self._section <= self._CPP_SECTION: + self._section = self._CPP_SECTION + else: + self._last_header = '' + return error_message + elif header_type == _LIKELY_MY_HEADER: + if self._section <= self._MY_H_SECTION: + self._section = self._MY_H_SECTION + else: + self._section = self._OTHER_H_SECTION + elif header_type == _POSSIBLE_MY_HEADER: + if self._section <= self._MY_H_SECTION: + self._section = self._MY_H_SECTION + else: + # This will always be the fallback because we're not sure + # enough that the header is associated with this file. + self._section = self._OTHER_H_SECTION + else: + assert header_type == _OTHER_HEADER + self._section = self._OTHER_H_SECTION + + if last_section != self._section: + self._last_header = '' + + return '' + + +class _CppLintState(object): + """Maintains module-wide state..""" + + def __init__(self): + self.verbose_level = 1 # global setting. + self.error_count = 0 # global count of reported errors + # filters to apply when emitting error messages + self.filters = _DEFAULT_FILTERS[:] + # backup of filter list. Used to restore the state after each file. + self._filters_backup = self.filters[:] + self.counting = 'total' # In what way are we counting errors? + self.errors_by_category = {} # string to int dict storing error counts + + # output format: + # "emacs" - format that emacs can parse (default) + # "vs7" - format that Microsoft Visual Studio 7 can parse + self.output_format = 'emacs' + + def SetOutputFormat(self, output_format): + """Sets the output format for errors.""" + self.output_format = output_format + + def SetVerboseLevel(self, level): + """Sets the module's verbosity, and returns the previous setting.""" + last_verbose_level = self.verbose_level + self.verbose_level = level + return last_verbose_level + + def SetCountingStyle(self, counting_style): + """Sets the module's counting options.""" + self.counting = counting_style + + def SetFilters(self, filters): + """Sets the error-message filters. + + These filters are applied when deciding whether to emit a given + error message. + + Args: + filters: A string of comma-separated filters (eg "+whitespace/indent"). + Each filter should start with + or -; else we die. + + Raises: + ValueError: The comma-separated filters did not all start with '+' or '-'. + E.g. "-,+whitespace,-whitespace/indent,whitespace/badfilter" + """ + # Default filters always have less priority than the flag ones. + self.filters = _DEFAULT_FILTERS[:] + self.AddFilters(filters) + + def AddFilters(self, filters): + """ Adds more filters to the existing list of error-message filters. """ + for filt in filters.split(','): + clean_filt = filt.strip() + if clean_filt: + self.filters.append(clean_filt) + for filt in self.filters: + if not (filt.startswith('+') or filt.startswith('-')): + raise ValueError('Every filter in --filters must start with + or -' + ' (%s does not)' % filt) + + def BackupFilters(self): + """ Saves the current filter list to backup storage.""" + self._filters_backup = self.filters[:] + + def RestoreFilters(self): + """ Restores filters previously backed up.""" + self.filters = self._filters_backup[:] + + def ResetErrorCounts(self): + """Sets the module's error statistic back to zero.""" + self.error_count = 0 + self.errors_by_category = {} + + def IncrementErrorCount(self, category): + """Bumps the module's error statistic.""" + self.error_count += 1 + if self.counting in ('toplevel', 'detailed'): + if self.counting != 'detailed': + category = category.split('/')[0] + if category not in self.errors_by_category: + self.errors_by_category[category] = 0 + self.errors_by_category[category] += 1 + + def PrintErrorCounts(self): + """Print a summary of errors by category, and the total.""" + for category, count in self.errors_by_category.iteritems(): + sys.stderr.write('Category \'%s\' errors found: %d\n' % + (category, count)) + sys.stderr.write('Total errors found: %d\n' % self.error_count) + +_cpplint_state = _CppLintState() + + +def _OutputFormat(): + """Gets the module's output format.""" + return _cpplint_state.output_format + + +def _SetOutputFormat(output_format): + """Sets the module's output format.""" + _cpplint_state.SetOutputFormat(output_format) + + +def _VerboseLevel(): + """Returns the module's verbosity setting.""" + return _cpplint_state.verbose_level + + +def _SetVerboseLevel(level): + """Sets the module's verbosity, and returns the previous setting.""" + return _cpplint_state.SetVerboseLevel(level) + + +def _SetCountingStyle(level): + """Sets the module's counting options.""" + _cpplint_state.SetCountingStyle(level) + + +def _Filters(): + """Returns the module's list of output filters, as a list.""" + return _cpplint_state.filters + + +def _SetFilters(filters): + """Sets the module's error-message filters. + + These filters are applied when deciding whether to emit a given + error message. + + Args: + filters: A string of comma-separated filters (eg "whitespace/indent"). + Each filter should start with + or -; else we die. + """ + _cpplint_state.SetFilters(filters) + +def _AddFilters(filters): + """Adds more filter overrides. + + Unlike _SetFilters, this function does not reset the current list of filters + available. + + Args: + filters: A string of comma-separated filters (eg "whitespace/indent"). + Each filter should start with + or -; else we die. + """ + _cpplint_state.AddFilters(filters) + +def _BackupFilters(): + """ Saves the current filter list to backup storage.""" + _cpplint_state.BackupFilters() + +def _RestoreFilters(): + """ Restores filters previously backed up.""" + _cpplint_state.RestoreFilters() + +class _FunctionState(object): + """Tracks current function name and the number of lines in its body.""" + + _NORMAL_TRIGGER = 250 # for --v=0, 500 for --v=1, etc. + _TEST_TRIGGER = 400 # about 50% more than _NORMAL_TRIGGER. + + def __init__(self): + self.in_a_function = False + self.lines_in_function = 0 + self.current_function = '' + + def Begin(self, function_name): + """Start analyzing function body. + + Args: + function_name: The name of the function being tracked. + """ + self.in_a_function = True + self.lines_in_function = 0 + self.current_function = function_name + + def Count(self): + """Count line in current function body.""" + if self.in_a_function: + self.lines_in_function += 1 + + def Check(self, error, filename, linenum): + """Report if too many lines in function body. + + Args: + error: The function to call with any errors found. + filename: The name of the current file. + linenum: The number of the line to check. + """ + if Match(r'T(EST|est)', self.current_function): + base_trigger = self._TEST_TRIGGER + else: + base_trigger = self._NORMAL_TRIGGER + trigger = base_trigger * 2**_VerboseLevel() + + if self.lines_in_function > trigger: + error_level = int(math.log(self.lines_in_function / base_trigger, 2)) + # 50 => 0, 100 => 1, 200 => 2, 400 => 3, 800 => 4, 1600 => 5, ... + if error_level > 5: + error_level = 5 + error(filename, linenum, 'readability/fn_size', error_level, + 'Small and focused functions are preferred:' + ' %s has %d non-comment lines' + ' (error triggered by exceeding %d lines).' % ( + self.current_function, self.lines_in_function, trigger)) + + def End(self): + """Stop analyzing function body.""" + self.in_a_function = False + + +class _IncludeError(Exception): + """Indicates a problem with the include order in a file.""" + pass + + +class FileInfo(object): + """Provides utility functions for filenames. + + FileInfo provides easy access to the components of a file's path + relative to the project root. + """ + + def __init__(self, filename): + self._filename = filename + + def FullName(self): + """Make Windows paths like Unix.""" + return os.path.abspath(self._filename).replace('\\', '/') + + def RepositoryName(self): + """FullName after removing the local path to the repository. + + If we have a real absolute path name here we can try to do something smart: + detecting the root of the checkout and truncating /path/to/checkout from + the name so that we get header guards that don't include things like + "C:\Documents and Settings\..." or "/home/username/..." in them and thus + people on different computers who have checked the source out to different + locations won't see bogus errors. + """ + fullname = self.FullName() + + if os.path.exists(fullname): + project_dir = os.path.dirname(fullname) + + if os.path.exists(os.path.join(project_dir, ".svn")): + # If there's a .svn file in the current directory, we recursively look + # up the directory tree for the top of the SVN checkout + root_dir = project_dir + one_up_dir = os.path.dirname(root_dir) + while os.path.exists(os.path.join(one_up_dir, ".svn")): + root_dir = os.path.dirname(root_dir) + one_up_dir = os.path.dirname(one_up_dir) + + prefix = os.path.commonprefix([root_dir, project_dir]) + return fullname[len(prefix) + 1:] + + # Not SVN <= 1.6? Try to find a git, hg, or svn top level directory by + # searching up from the current path. + root_dir = os.path.dirname(fullname) + while (root_dir != os.path.dirname(root_dir) and + not os.path.exists(os.path.join(root_dir, ".git")) and + not os.path.exists(os.path.join(root_dir, ".hg")) and + not os.path.exists(os.path.join(root_dir, ".svn"))): + root_dir = os.path.dirname(root_dir) + + if (os.path.exists(os.path.join(root_dir, ".git")) or + os.path.exists(os.path.join(root_dir, ".hg")) or + os.path.exists(os.path.join(root_dir, ".svn"))): + prefix = os.path.commonprefix([root_dir, project_dir]) + return fullname[len(prefix) + 1:] + + # Don't know what to do; header guard warnings may be wrong... + return fullname + + def Split(self): + """Splits the file into the directory, basename, and extension. + + For 'chrome/browser/browser.cc', Split() would + return ('chrome/browser', 'browser', '.cc') + + Returns: + A tuple of (directory, basename, extension). + """ + + googlename = self.RepositoryName() + project, rest = os.path.split(googlename) + return (project,) + os.path.splitext(rest) + + def BaseName(self): + """File base name - text after the final slash, before the final period.""" + return self.Split()[1] + + def Extension(self): + """File extension - text following the final period.""" + return self.Split()[2] + + def NoExtension(self): + """File has no source file extension.""" + return '/'.join(self.Split()[0:2]) + + def IsSource(self): + """File has a source file extension.""" + return self.Extension()[1:] in ('c', 'cc', 'cpp', 'cxx') + + +def _ShouldPrintError(category, confidence, linenum): + """If confidence >= verbose, category passes filter and is not suppressed.""" + + # There are three ways we might decide not to print an error message: + # a "NOLINT(category)" comment appears in the source, + # the verbosity level isn't high enough, or the filters filter it out. + if IsErrorSuppressedByNolint(category, linenum): + return False + + if confidence < _cpplint_state.verbose_level: + return False + + is_filtered = False + for one_filter in _Filters(): + if one_filter.startswith('-'): + if category.startswith(one_filter[1:]): + is_filtered = True + elif one_filter.startswith('+'): + if category.startswith(one_filter[1:]): + is_filtered = False + else: + assert False # should have been checked for in SetFilter. + if is_filtered: + return False + + return True + + +def Error(filename, linenum, category, confidence, message): + """Logs the fact we've found a lint error. + + We log where the error was found, and also our confidence in the error, + that is, how certain we are this is a legitimate style regression, and + not a misidentification or a use that's sometimes justified. + + False positives can be suppressed by the use of + "cpplint(category)" comments on the offending line. These are + parsed into _error_suppressions. + + Args: + filename: The name of the file containing the error. + linenum: The number of the line containing the error. + category: A string used to describe the "category" this bug + falls under: "whitespace", say, or "runtime". Categories + may have a hierarchy separated by slashes: "whitespace/indent". + confidence: A number from 1-5 representing a confidence score for + the error, with 5 meaning that we are certain of the problem, + and 1 meaning that it could be a legitimate construct. + message: The error message. + """ + if _ShouldPrintError(category, confidence, linenum): + _cpplint_state.IncrementErrorCount(category) + if _cpplint_state.output_format == 'vs7': + sys.stderr.write('%s(%s): %s [%s] [%d]\n' % ( + filename, linenum, message, category, confidence)) + elif _cpplint_state.output_format == 'eclipse': + sys.stderr.write('%s:%s: warning: %s [%s] [%d]\n' % ( + filename, linenum, message, category, confidence)) + else: + sys.stderr.write('%s:%s: %s [%s] [%d]\n' % ( + filename, linenum, message, category, confidence)) + + +# Matches standard C++ escape sequences per 2.13.2.3 of the C++ standard. +_RE_PATTERN_CLEANSE_LINE_ESCAPES = re.compile( + r'\\([abfnrtv?"\\\']|\d+|x[0-9a-fA-F]+)') +# Match a single C style comment on the same line. +_RE_PATTERN_C_COMMENTS = r'/\*(?:[^*]|\*(?!/))*\*/' +# Matches multi-line C style comments. +# This RE is a little bit more complicated than one might expect, because we +# have to take care of space removals tools so we can handle comments inside +# statements better. +# The current rule is: We only clear spaces from both sides when we're at the +# end of the line. Otherwise, we try to remove spaces from the right side, +# if this doesn't work we try on left side but only if there's a non-character +# on the right. +_RE_PATTERN_CLEANSE_LINE_C_COMMENTS = re.compile( + r'(\s*' + _RE_PATTERN_C_COMMENTS + r'\s*$|' + + _RE_PATTERN_C_COMMENTS + r'\s+|' + + r'\s+' + _RE_PATTERN_C_COMMENTS + r'(?=\W)|' + + _RE_PATTERN_C_COMMENTS + r')') + + +def IsCppString(line): + """Does line terminate so, that the next symbol is in string constant. + + This function does not consider single-line nor multi-line comments. + + Args: + line: is a partial line of code starting from the 0..n. + + Returns: + True, if next character appended to 'line' is inside a + string constant. + """ + + line = line.replace(r'\\', 'XX') # after this, \\" does not match to \" + return ((line.count('"') - line.count(r'\"') - line.count("'\"'")) & 1) == 1 + + +def CleanseRawStrings(raw_lines): + """Removes C++11 raw strings from lines. + + Before: + static const char kData[] = R"( + multi-line string + )"; + + After: + static const char kData[] = "" + (replaced by blank line) + ""; + + Args: + raw_lines: list of raw lines. + + Returns: + list of lines with C++11 raw strings replaced by empty strings. + """ + + delimiter = None + lines_without_raw_strings = [] + for line in raw_lines: + if delimiter: + # Inside a raw string, look for the end + end = line.find(delimiter) + if end >= 0: + # Found the end of the string, match leading space for this + # line and resume copying the original lines, and also insert + # a "" on the last line. + leading_space = Match(r'^(\s*)\S', line) + line = leading_space.group(1) + '""' + line[end + len(delimiter):] + delimiter = None + else: + # Haven't found the end yet, append a blank line. + line = '""' + + # Look for beginning of a raw string, and replace them with + # empty strings. This is done in a loop to handle multiple raw + # strings on the same line. + while delimiter is None: + # Look for beginning of a raw string. + # See 2.14.15 [lex.string] for syntax. + matched = Match(r'^(.*)\b(?:R|u8R|uR|UR|LR)"([^\s\\()]*)\((.*)$', line) + if matched: + delimiter = ')' + matched.group(2) + '"' + + end = matched.group(3).find(delimiter) + if end >= 0: + # Raw string ended on same line + line = (matched.group(1) + '""' + + matched.group(3)[end + len(delimiter):]) + delimiter = None + else: + # Start of a multi-line raw string + line = matched.group(1) + '""' + else: + break + + lines_without_raw_strings.append(line) + + # TODO(unknown): if delimiter is not None here, we might want to + # emit a warning for unterminated string. + return lines_without_raw_strings + + +def FindNextMultiLineCommentStart(lines, lineix): + """Find the beginning marker for a multiline comment.""" + while lineix < len(lines): + if lines[lineix].strip().startswith('/*'): + # Only return this marker if the comment goes beyond this line + if lines[lineix].strip().find('*/', 2) < 0: + return lineix + lineix += 1 + return len(lines) + + +def FindNextMultiLineCommentEnd(lines, lineix): + """We are inside a comment, find the end marker.""" + while lineix < len(lines): + if lines[lineix].strip().endswith('*/'): + return lineix + lineix += 1 + return len(lines) + + +def RemoveMultiLineCommentsFromRange(lines, begin, end): + """Clears a range of lines for multi-line comments.""" + # Having // dummy comments makes the lines non-empty, so we will not get + # unnecessary blank line warnings later in the code. + for i in range(begin, end): + lines[i] = '/**/' + + +def RemoveMultiLineComments(filename, lines, error): + """Removes multiline (c-style) comments from lines.""" + lineix = 0 + while lineix < len(lines): + lineix_begin = FindNextMultiLineCommentStart(lines, lineix) + if lineix_begin >= len(lines): + return + lineix_end = FindNextMultiLineCommentEnd(lines, lineix_begin) + if lineix_end >= len(lines): + error(filename, lineix_begin + 1, 'readability/multiline_comment', 5, + 'Could not find end of multi-line comment') + return + RemoveMultiLineCommentsFromRange(lines, lineix_begin, lineix_end + 1) + lineix = lineix_end + 1 + + +def CleanseComments(line): + """Removes //-comments and single-line C-style /* */ comments. + + Args: + line: A line of C++ source. + + Returns: + The line with single-line comments removed. + """ + commentpos = line.find('//') + if commentpos != -1 and not IsCppString(line[:commentpos]): + line = line[:commentpos].rstrip() + # get rid of /* ... */ + return _RE_PATTERN_CLEANSE_LINE_C_COMMENTS.sub('', line) + + +class CleansedLines(object): + """Holds 4 copies of all lines with different preprocessing applied to them. + + 1) elided member contains lines without strings and comments. + 2) lines member contains lines without comments. + 3) raw_lines member contains all the lines without processing. + 4) lines_without_raw_strings member is same as raw_lines, but with C++11 raw + strings removed. + All these members are of , and of the same length. + """ + + def __init__(self, lines): + self.elided = [] + self.lines = [] + self.raw_lines = lines + self.num_lines = len(lines) + self.lines_without_raw_strings = CleanseRawStrings(lines) + for linenum in range(len(self.lines_without_raw_strings)): + self.lines.append(CleanseComments( + self.lines_without_raw_strings[linenum])) + elided = self._CollapseStrings(self.lines_without_raw_strings[linenum]) + self.elided.append(CleanseComments(elided)) + + def NumLines(self): + """Returns the number of lines represented.""" + return self.num_lines + + @staticmethod + def _CollapseStrings(elided): + """Collapses strings and chars on a line to simple "" or '' blocks. + + We nix strings first so we're not fooled by text like '"http://"' + + Args: + elided: The line being processed. + + Returns: + The line with collapsed strings. + """ + if _RE_PATTERN_INCLUDE.match(elided): + return elided + + # Remove escaped characters first to make quote/single quote collapsing + # basic. Things that look like escaped characters shouldn't occur + # outside of strings and chars. + elided = _RE_PATTERN_CLEANSE_LINE_ESCAPES.sub('', elided) + + # Replace quoted strings and digit separators. Both single quotes + # and double quotes are processed in the same loop, otherwise + # nested quotes wouldn't work. + collapsed = '' + while True: + # Find the first quote character + match = Match(r'^([^\'"]*)([\'"])(.*)$', elided) + if not match: + collapsed += elided + break + head, quote, tail = match.groups() + + if quote == '"': + # Collapse double quoted strings + second_quote = tail.find('"') + if second_quote >= 0: + collapsed += head + '""' + elided = tail[second_quote + 1:] + else: + # Unmatched double quote, don't bother processing the rest + # of the line since this is probably a multiline string. + collapsed += elided + break + else: + # Found single quote, check nearby text to eliminate digit separators. + # + # There is no special handling for floating point here, because + # the integer/fractional/exponent parts would all be parsed + # correctly as long as there are digits on both sides of the + # separator. So we are fine as long as we don't see something + # like "0.'3" (gcc 4.9.0 will not allow this literal). + if Search(r'\b(?:0[bBxX]?|[1-9])[0-9a-fA-F]*$', head): + match_literal = Match(r'^((?:\'?[0-9a-zA-Z_])*)(.*)$', "'" + tail) + collapsed += head + match_literal.group(1).replace("'", '') + elided = match_literal.group(2) + else: + second_quote = tail.find('\'') + if second_quote >= 0: + collapsed += head + "''" + elided = tail[second_quote + 1:] + else: + # Unmatched single quote + collapsed += elided + break + + return collapsed + + +def FindEndOfExpressionInLine(line, startpos, stack): + """Find the position just after the end of current parenthesized expression. + + Args: + line: a CleansedLines line. + startpos: start searching at this position. + stack: nesting stack at startpos. + + Returns: + On finding matching end: (index just after matching end, None) + On finding an unclosed expression: (-1, None) + Otherwise: (-1, new stack at end of this line) + """ + for i in xrange(startpos, len(line)): + char = line[i] + if char in '([{': + # Found start of parenthesized expression, push to expression stack + stack.append(char) + elif char == '<': + # Found potential start of template argument list + if i > 0 and line[i - 1] == '<': + # Left shift operator + if stack and stack[-1] == '<': + stack.pop() + if not stack: + return (-1, None) + elif i > 0 and Search(r'\boperator\s*$', line[0:i]): + # operator<, don't add to stack + continue + else: + # Tentative start of template argument list + stack.append('<') + elif char in ')]}': + # Found end of parenthesized expression. + # + # If we are currently expecting a matching '>', the pending '<' + # must have been an operator. Remove them from expression stack. + while stack and stack[-1] == '<': + stack.pop() + if not stack: + return (-1, None) + if ((stack[-1] == '(' and char == ')') or + (stack[-1] == '[' and char == ']') or + (stack[-1] == '{' and char == '}')): + stack.pop() + if not stack: + return (i + 1, None) + else: + # Mismatched parentheses + return (-1, None) + elif char == '>': + # Found potential end of template argument list. + + # Ignore "->" and operator functions + if (i > 0 and + (line[i - 1] == '-' or Search(r'\boperator\s*$', line[0:i - 1]))): + continue + + # Pop the stack if there is a matching '<'. Otherwise, ignore + # this '>' since it must be an operator. + if stack: + if stack[-1] == '<': + stack.pop() + if not stack: + return (i + 1, None) + elif char == ';': + # Found something that look like end of statements. If we are currently + # expecting a '>', the matching '<' must have been an operator, since + # template argument list should not contain statements. + while stack and stack[-1] == '<': + stack.pop() + if not stack: + return (-1, None) + + # Did not find end of expression or unbalanced parentheses on this line + return (-1, stack) + + +def CloseExpression(clean_lines, linenum, pos): + """If input points to ( or { or [ or <, finds the position that closes it. + + If lines[linenum][pos] points to a '(' or '{' or '[' or '<', finds the + linenum/pos that correspond to the closing of the expression. + + TODO(unknown): cpplint spends a fair bit of time matching parentheses. + Ideally we would want to index all opening and closing parentheses once + and have CloseExpression be just a simple lookup, but due to preprocessor + tricks, this is not so easy. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + pos: A position on the line. + + Returns: + A tuple (line, linenum, pos) pointer *past* the closing brace, or + (line, len(lines), -1) if we never find a close. Note we ignore + strings and comments when matching; and the line we return is the + 'cleansed' line at linenum. + """ + + line = clean_lines.elided[linenum] + if (line[pos] not in '({[<') or Match(r'<[<=]', line[pos:]): + return (line, clean_lines.NumLines(), -1) + + # Check first line + (end_pos, stack) = FindEndOfExpressionInLine(line, pos, []) + if end_pos > -1: + return (line, linenum, end_pos) + + # Continue scanning forward + while stack and linenum < clean_lines.NumLines() - 1: + linenum += 1 + line = clean_lines.elided[linenum] + (end_pos, stack) = FindEndOfExpressionInLine(line, 0, stack) + if end_pos > -1: + return (line, linenum, end_pos) + + # Did not find end of expression before end of file, give up + return (line, clean_lines.NumLines(), -1) + + +def FindStartOfExpressionInLine(line, endpos, stack): + """Find position at the matching start of current expression. + + This is almost the reverse of FindEndOfExpressionInLine, but note + that the input position and returned position differs by 1. + + Args: + line: a CleansedLines line. + endpos: start searching at this position. + stack: nesting stack at endpos. + + Returns: + On finding matching start: (index at matching start, None) + On finding an unclosed expression: (-1, None) + Otherwise: (-1, new stack at beginning of this line) + """ + i = endpos + while i >= 0: + char = line[i] + if char in ')]}': + # Found end of expression, push to expression stack + stack.append(char) + elif char == '>': + # Found potential end of template argument list. + # + # Ignore it if it's a "->" or ">=" or "operator>" + if (i > 0 and + (line[i - 1] == '-' or + Match(r'\s>=\s', line[i - 1:]) or + Search(r'\boperator\s*$', line[0:i]))): + i -= 1 + else: + stack.append('>') + elif char == '<': + # Found potential start of template argument list + if i > 0 and line[i - 1] == '<': + # Left shift operator + i -= 1 + else: + # If there is a matching '>', we can pop the expression stack. + # Otherwise, ignore this '<' since it must be an operator. + if stack and stack[-1] == '>': + stack.pop() + if not stack: + return (i, None) + elif char in '([{': + # Found start of expression. + # + # If there are any unmatched '>' on the stack, they must be + # operators. Remove those. + while stack and stack[-1] == '>': + stack.pop() + if not stack: + return (-1, None) + if ((char == '(' and stack[-1] == ')') or + (char == '[' and stack[-1] == ']') or + (char == '{' and stack[-1] == '}')): + stack.pop() + if not stack: + return (i, None) + else: + # Mismatched parentheses + return (-1, None) + elif char == ';': + # Found something that look like end of statements. If we are currently + # expecting a '<', the matching '>' must have been an operator, since + # template argument list should not contain statements. + while stack and stack[-1] == '>': + stack.pop() + if not stack: + return (-1, None) + + i -= 1 + + return (-1, stack) + + +def ReverseCloseExpression(clean_lines, linenum, pos): + """If input points to ) or } or ] or >, finds the position that opens it. + + If lines[linenum][pos] points to a ')' or '}' or ']' or '>', finds the + linenum/pos that correspond to the opening of the expression. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + pos: A position on the line. + + Returns: + A tuple (line, linenum, pos) pointer *at* the opening brace, or + (line, 0, -1) if we never find the matching opening brace. Note + we ignore strings and comments when matching; and the line we + return is the 'cleansed' line at linenum. + """ + line = clean_lines.elided[linenum] + if line[pos] not in ')}]>': + return (line, 0, -1) + + # Check last line + (start_pos, stack) = FindStartOfExpressionInLine(line, pos, []) + if start_pos > -1: + return (line, linenum, start_pos) + + # Continue scanning backward + while stack and linenum > 0: + linenum -= 1 + line = clean_lines.elided[linenum] + (start_pos, stack) = FindStartOfExpressionInLine(line, len(line) - 1, stack) + if start_pos > -1: + return (line, linenum, start_pos) + + # Did not find start of expression before beginning of file, give up + return (line, 0, -1) + + +def CheckForCopyright(filename, lines, error): + """Logs an error if no Copyright message appears at the top of the file.""" + + # We'll say it should occur by line 10. Don't forget there's a + # dummy line at the front. + for line in xrange(1, min(len(lines), 11)): + if re.search(r'Copyright', lines[line], re.I): break + else: # means no copyright line was found + error(filename, 0, 'legal/copyright', 5, + 'No copyright message found. ' + 'You should have a line: "Copyright [year] "') + + +def GetIndentLevel(line): + """Return the number of leading spaces in line. + + Args: + line: A string to check. + + Returns: + An integer count of leading spaces, possibly zero. + """ + indent = Match(r'^( *)\S', line) + if indent: + return len(indent.group(1)) + else: + return 0 + + +def GetHeaderGuardCPPVariable(filename): + """Returns the CPP variable that should be used as a header guard. + + Args: + filename: The name of a C++ header file. + + Returns: + The CPP variable that should be used as a header guard in the + named file. + + """ + + # Restores original filename in case that cpplint is invoked from Emacs's + # flymake. + filename = re.sub(r'_flymake\.h$', '.h', filename) + filename = re.sub(r'/\.flymake/([^/]*)$', r'/\1', filename) + # Replace 'c++' with 'cpp'. + filename = filename.replace('C++', 'cpp').replace('c++', 'cpp') + + fileinfo = FileInfo(filename) + file_path_from_root = fileinfo.RepositoryName() + if _root: + file_path_from_root = re.sub('^' + _root + os.sep, '', file_path_from_root) + return re.sub(r'[^a-zA-Z0-9]', '_', file_path_from_root).upper() + '_' + + +def CheckForHeaderGuard(filename, clean_lines, error): + """Checks that the file contains a header guard. + + Logs an error if no #ifndef header guard is present. For other + headers, checks that the full pathname is used. + + Args: + filename: The name of the C++ header file. + clean_lines: A CleansedLines instance containing the file. + error: The function to call with any errors found. + """ + + # Don't check for header guards if there are error suppression + # comments somewhere in this file. + # + # Because this is silencing a warning for a nonexistent line, we + # only support the very specific NOLINT(build/header_guard) syntax, + # and not the general NOLINT or NOLINT(*) syntax. + raw_lines = clean_lines.lines_without_raw_strings + for i in raw_lines: + if Search(r'//\s*NOLINT\(build/header_guard\)', i): + return + + cppvar = GetHeaderGuardCPPVariable(filename) + + ifndef = '' + ifndef_linenum = 0 + define = '' + endif = '' + endif_linenum = 0 + for linenum, line in enumerate(raw_lines): + linesplit = line.split() + if len(linesplit) >= 2: + # find the first occurrence of #ifndef and #define, save arg + if not ifndef and linesplit[0] == '#ifndef': + # set ifndef to the header guard presented on the #ifndef line. + ifndef = linesplit[1] + ifndef_linenum = linenum + if not define and linesplit[0] == '#define': + define = linesplit[1] + # find the last occurrence of #endif, save entire line + if line.startswith('#endif'): + endif = line + endif_linenum = linenum + + if not ifndef or not define or ifndef != define: + error(filename, 0, 'build/header_guard', 5, + 'No #ifndef header guard found, suggested CPP variable is: %s' % + cppvar) + return + + # The guard should be PATH_FILE_H_, but we also allow PATH_FILE_H__ + # for backward compatibility. + if ifndef != cppvar: + error_level = 0 + if ifndef != cppvar + '_': + error_level = 5 + + ParseNolintSuppressions(filename, raw_lines[ifndef_linenum], ifndef_linenum, + error) + error(filename, ifndef_linenum, 'build/header_guard', error_level, + '#ifndef header guard has wrong style, please use: %s' % cppvar) + + # Check for "//" comments on endif line. + ParseNolintSuppressions(filename, raw_lines[endif_linenum], endif_linenum, + error) + match = Match(r'#endif\s*//\s*' + cppvar + r'(_)?\b', endif) + if match: + if match.group(1) == '_': + # Issue low severity warning for deprecated double trailing underscore + error(filename, endif_linenum, 'build/header_guard', 0, + '#endif line should be "#endif // %s"' % cppvar) + return + + # Didn't find the corresponding "//" comment. If this file does not + # contain any "//" comments at all, it could be that the compiler + # only wants "/**/" comments, look for those instead. + no_single_line_comments = True + for i in xrange(1, len(raw_lines) - 1): + line = raw_lines[i] + if Match(r'^(?:(?:\'(?:\.|[^\'])*\')|(?:"(?:\.|[^"])*")|[^\'"])*//', line): + no_single_line_comments = False + break + + if no_single_line_comments: + match = Match(r'#endif\s*/\*\s*' + cppvar + r'(_)?\s*\*/', endif) + if match: + if match.group(1) == '_': + # Low severity warning for double trailing underscore + error(filename, endif_linenum, 'build/header_guard', 0, + '#endif line should be "#endif /* %s */"' % cppvar) + return + + # Didn't find anything + error(filename, endif_linenum, 'build/header_guard', 5, + '#endif line should be "#endif // %s"' % cppvar) + + +def CheckHeaderFileIncluded(filename, include_state, error): + """Logs an error if a .cc file does not include its header.""" + + # Do not check test files + if filename.endswith('_test.cc') or filename.endswith('_unittest.cc'): + return + + fileinfo = FileInfo(filename) + headerfile = filename[0:len(filename) - 2] + 'h' + if not os.path.exists(headerfile): + return + headername = FileInfo(headerfile).RepositoryName() + first_include = 0 + for section_list in include_state.include_list: + for f in section_list: + if headername in f[0] or f[0] in headername: + return + if not first_include: + first_include = f[1] + + error(filename, first_include, 'build/include', 5, + '%s should include its header file %s' % (fileinfo.RepositoryName(), + headername)) + + +def CheckForBadCharacters(filename, lines, error): + """Logs an error for each line containing bad characters. + + Two kinds of bad characters: + + 1. Unicode replacement characters: These indicate that either the file + contained invalid UTF-8 (likely) or Unicode replacement characters (which + it shouldn't). Note that it's possible for this to throw off line + numbering if the invalid UTF-8 occurred adjacent to a newline. + + 2. NUL bytes. These are problematic for some tools. + + Args: + filename: The name of the current file. + lines: An array of strings, each representing a line of the file. + error: The function to call with any errors found. + """ + for linenum, line in enumerate(lines): + if u'\ufffd' in line: + error(filename, linenum, 'readability/utf8', 5, + 'Line contains invalid UTF-8 (or Unicode replacement character).') + if '\0' in line: + error(filename, linenum, 'readability/nul', 5, 'Line contains NUL byte.') + + +def CheckForNewlineAtEOF(filename, lines, error): + """Logs an error if there is no newline char at the end of the file. + + Args: + filename: The name of the current file. + lines: An array of strings, each representing a line of the file. + error: The function to call with any errors found. + """ + + # The array lines() was created by adding two newlines to the + # original file (go figure), then splitting on \n. + # To verify that the file ends in \n, we just have to make sure the + # last-but-two element of lines() exists and is empty. + if len(lines) < 3 or lines[-2]: + error(filename, len(lines) - 2, 'whitespace/ending_newline', 5, + 'Could not find a newline character at the end of the file.') + + +def CheckForMultilineCommentsAndStrings(filename, clean_lines, linenum, error): + """Logs an error if we see /* ... */ or "..." that extend past one line. + + /* ... */ comments are legit inside macros, for one line. + Otherwise, we prefer // comments, so it's ok to warn about the + other. Likewise, it's ok for strings to extend across multiple + lines, as long as a line continuation character (backslash) + terminates each line. Although not currently prohibited by the C++ + style guide, it's ugly and unnecessary. We don't do well with either + in this lint program, so we warn about both. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # Remove all \\ (escaped backslashes) from the line. They are OK, and the + # second (escaped) slash may trigger later \" detection erroneously. + line = line.replace('\\\\', '') + + if line.count('/*') > line.count('*/'): + error(filename, linenum, 'readability/multiline_comment', 5, + 'Complex multi-line /*...*/-style comment found. ' + 'Lint may give bogus warnings. ' + 'Consider replacing these with //-style comments, ' + 'with #if 0...#endif, ' + 'or with more clearly structured multi-line comments.') + + if (line.count('"') - line.count('\\"')) % 2: + error(filename, linenum, 'readability/multiline_string', 5, + 'Multi-line string ("...") found. This lint script doesn\'t ' + 'do well with such strings, and may give bogus warnings. ' + 'Use C++11 raw strings or concatenation instead.') + + +# (non-threadsafe name, thread-safe alternative, validation pattern) +# +# The validation pattern is used to eliminate false positives such as: +# _rand(); // false positive due to substring match. +# ->rand(); // some member function rand(). +# ACMRandom rand(seed); // some variable named rand. +# ISAACRandom rand(); // another variable named rand. +# +# Basically we require the return value of these functions to be used +# in some expression context on the same line by matching on some +# operator before the function name. This eliminates constructors and +# member function calls. +_UNSAFE_FUNC_PREFIX = r'(?:[-+*/=%^&|(<]\s*|>\s+)' +_THREADING_LIST = ( + ('asctime(', 'asctime_r(', _UNSAFE_FUNC_PREFIX + r'asctime\([^)]+\)'), + ('ctime(', 'ctime_r(', _UNSAFE_FUNC_PREFIX + r'ctime\([^)]+\)'), + ('getgrgid(', 'getgrgid_r(', _UNSAFE_FUNC_PREFIX + r'getgrgid\([^)]+\)'), + ('getgrnam(', 'getgrnam_r(', _UNSAFE_FUNC_PREFIX + r'getgrnam\([^)]+\)'), + ('getlogin(', 'getlogin_r(', _UNSAFE_FUNC_PREFIX + r'getlogin\(\)'), + ('getpwnam(', 'getpwnam_r(', _UNSAFE_FUNC_PREFIX + r'getpwnam\([^)]+\)'), + ('getpwuid(', 'getpwuid_r(', _UNSAFE_FUNC_PREFIX + r'getpwuid\([^)]+\)'), + ('gmtime(', 'gmtime_r(', _UNSAFE_FUNC_PREFIX + r'gmtime\([^)]+\)'), + ('localtime(', 'localtime_r(', _UNSAFE_FUNC_PREFIX + r'localtime\([^)]+\)'), + ('rand(', 'rand_r(', _UNSAFE_FUNC_PREFIX + r'rand\(\)'), + ('strtok(', 'strtok_r(', + _UNSAFE_FUNC_PREFIX + r'strtok\([^)]+\)'), + ('ttyname(', 'ttyname_r(', _UNSAFE_FUNC_PREFIX + r'ttyname\([^)]+\)'), + ) + + +def CheckPosixThreading(filename, clean_lines, linenum, error): + """Checks for calls to thread-unsafe functions. + + Much code has been originally written without consideration of + multi-threading. Also, engineers are relying on their old experience; + they have learned posix before threading extensions were added. These + tests guide the engineers to use thread-safe functions (when using + posix directly). + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + for single_thread_func, multithread_safe_func, pattern in _THREADING_LIST: + # Additional pattern matching check to confirm that this is the + # function we are looking for + if Search(pattern, line): + error(filename, linenum, 'runtime/threadsafe_fn', 2, + 'Consider using ' + multithread_safe_func + + '...) instead of ' + single_thread_func + + '...) for improved thread safety.') + + +def CheckVlogArguments(filename, clean_lines, linenum, error): + """Checks that VLOG() is only used for defining a logging level. + + For example, VLOG(2) is correct. VLOG(INFO), VLOG(WARNING), VLOG(ERROR), and + VLOG(FATAL) are not. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + if Search(r'\bVLOG\((INFO|ERROR|WARNING|DFATAL|FATAL)\)', line): + error(filename, linenum, 'runtime/vlog', 5, + 'VLOG() should be used with numeric verbosity level. ' + 'Use LOG() if you want symbolic severity levels.') + +# Matches invalid increment: *count++, which moves pointer instead of +# incrementing a value. +_RE_PATTERN_INVALID_INCREMENT = re.compile( + r'^\s*\*\w+(\+\+|--);') + + +def CheckInvalidIncrement(filename, clean_lines, linenum, error): + """Checks for invalid increment *count++. + + For example following function: + void increment_counter(int* count) { + *count++; + } + is invalid, because it effectively does count++, moving pointer, and should + be replaced with ++*count, (*count)++ or *count += 1. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + if _RE_PATTERN_INVALID_INCREMENT.match(line): + error(filename, linenum, 'runtime/invalid_increment', 5, + 'Changing pointer instead of value (or unused value of operator*).') + + +def IsMacroDefinition(clean_lines, linenum): + if Search(r'^#define', clean_lines[linenum]): + return True + + if linenum > 0 and Search(r'\\$', clean_lines[linenum - 1]): + return True + + return False + + +def IsForwardClassDeclaration(clean_lines, linenum): + return Match(r'^\s*(\btemplate\b)*.*class\s+\w+;\s*$', clean_lines[linenum]) + + +class _BlockInfo(object): + """Stores information about a generic block of code.""" + + def __init__(self, seen_open_brace): + self.seen_open_brace = seen_open_brace + self.open_parentheses = 0 + self.inline_asm = _NO_ASM + self.check_namespace_indentation = False + + def CheckBegin(self, filename, clean_lines, linenum, error): + """Run checks that applies to text up to the opening brace. + + This is mostly for checking the text after the class identifier + and the "{", usually where the base class is specified. For other + blocks, there isn't much to check, so we always pass. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + pass + + def CheckEnd(self, filename, clean_lines, linenum, error): + """Run checks that applies to text after the closing brace. + + This is mostly used for checking end of namespace comments. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + pass + + def IsBlockInfo(self): + """Returns true if this block is a _BlockInfo. + + This is convenient for verifying that an object is an instance of + a _BlockInfo, but not an instance of any of the derived classes. + + Returns: + True for this class, False for derived classes. + """ + return self.__class__ == _BlockInfo + + +class _ExternCInfo(_BlockInfo): + """Stores information about an 'extern "C"' block.""" + + def __init__(self): + _BlockInfo.__init__(self, True) + + +class _ClassInfo(_BlockInfo): + """Stores information about a class.""" + + def __init__(self, name, class_or_struct, clean_lines, linenum): + _BlockInfo.__init__(self, False) + self.name = name + self.starting_linenum = linenum + self.is_derived = False + self.check_namespace_indentation = True + if class_or_struct == 'struct': + self.access = 'public' + self.is_struct = True + else: + self.access = 'private' + self.is_struct = False + + # Remember initial indentation level for this class. Using raw_lines here + # instead of elided to account for leading comments. + self.class_indent = GetIndentLevel(clean_lines.raw_lines[linenum]) + + # Try to find the end of the class. This will be confused by things like: + # class A { + # } *x = { ... + # + # But it's still good enough for CheckSectionSpacing. + self.last_line = 0 + depth = 0 + for i in range(linenum, clean_lines.NumLines()): + line = clean_lines.elided[i] + depth += line.count('{') - line.count('}') + if not depth: + self.last_line = i + break + + def CheckBegin(self, filename, clean_lines, linenum, error): + # Look for a bare ':' + if Search('(^|[^:]):($|[^:])', clean_lines.elided[linenum]): + self.is_derived = True + + def CheckEnd(self, filename, clean_lines, linenum, error): + # If there is a DISALLOW macro, it should appear near the end of + # the class. + seen_last_thing_in_class = False + for i in xrange(linenum - 1, self.starting_linenum, -1): + match = Search( + r'\b(DISALLOW_COPY_AND_ASSIGN|DISALLOW_IMPLICIT_CONSTRUCTORS)\(' + + self.name + r'\)', + clean_lines.elided[i]) + if match: + if seen_last_thing_in_class: + error(filename, i, 'readability/constructors', 3, + match.group(1) + ' should be the last thing in the class') + break + + if not Match(r'^\s*$', clean_lines.elided[i]): + seen_last_thing_in_class = True + + # Check that closing brace is aligned with beginning of the class. + # Only do this if the closing brace is indented by only whitespaces. + # This means we will not check single-line class definitions. + indent = Match(r'^( *)\}', clean_lines.elided[linenum]) + if indent and len(indent.group(1)) != self.class_indent: + if self.is_struct: + parent = 'struct ' + self.name + else: + parent = 'class ' + self.name + error(filename, linenum, 'whitespace/indent', 3, + 'Closing brace should be aligned with beginning of %s' % parent) + + +class _NamespaceInfo(_BlockInfo): + """Stores information about a namespace.""" + + def __init__(self, name, linenum): + _BlockInfo.__init__(self, False) + self.name = name or '' + self.starting_linenum = linenum + self.check_namespace_indentation = True + + def CheckEnd(self, filename, clean_lines, linenum, error): + """Check end of namespace comments.""" + line = clean_lines.raw_lines[linenum] + + # Check how many lines is enclosed in this namespace. Don't issue + # warning for missing namespace comments if there aren't enough + # lines. However, do apply checks if there is already an end of + # namespace comment and it's incorrect. + # + # TODO(unknown): We always want to check end of namespace comments + # if a namespace is large, but sometimes we also want to apply the + # check if a short namespace contained nontrivial things (something + # other than forward declarations). There is currently no logic on + # deciding what these nontrivial things are, so this check is + # triggered by namespace size only, which works most of the time. + if (linenum - self.starting_linenum < 10 + and not Match(r'};*\s*(//|/\*).*\bnamespace\b', line)): + return + + # Look for matching comment at end of namespace. + # + # Note that we accept C style "/* */" comments for terminating + # namespaces, so that code that terminate namespaces inside + # preprocessor macros can be cpplint clean. + # + # We also accept stuff like "// end of namespace ." with the + # period at the end. + # + # Besides these, we don't accept anything else, otherwise we might + # get false negatives when existing comment is a substring of the + # expected namespace. + if self.name: + # Named namespace + if not Match((r'};*\s*(//|/\*).*\bnamespace\s+' + re.escape(self.name) + + r'[\*/\.\\\s]*$'), + line): + error(filename, linenum, 'readability/namespace', 5, + 'Namespace should be terminated with "// namespace %s"' % + self.name) + else: + # Anonymous namespace + if not Match(r'};*\s*(//|/\*).*\bnamespace[\*/\.\\\s]*$', line): + # If "// namespace anonymous" or "// anonymous namespace (more text)", + # mention "// anonymous namespace" as an acceptable form + if Match(r'}.*\b(namespace anonymous|anonymous namespace)\b', line): + error(filename, linenum, 'readability/namespace', 5, + 'Anonymous namespace should be terminated with "// namespace"' + ' or "// anonymous namespace"') + else: + error(filename, linenum, 'readability/namespace', 5, + 'Anonymous namespace should be terminated with "// namespace"') + + +class _PreprocessorInfo(object): + """Stores checkpoints of nesting stacks when #if/#else is seen.""" + + def __init__(self, stack_before_if): + # The entire nesting stack before #if + self.stack_before_if = stack_before_if + + # The entire nesting stack up to #else + self.stack_before_else = [] + + # Whether we have already seen #else or #elif + self.seen_else = False + + +class NestingState(object): + """Holds states related to parsing braces.""" + + def __init__(self): + # Stack for tracking all braces. An object is pushed whenever we + # see a "{", and popped when we see a "}". Only 3 types of + # objects are possible: + # - _ClassInfo: a class or struct. + # - _NamespaceInfo: a namespace. + # - _BlockInfo: some other type of block. + self.stack = [] + + # Top of the previous stack before each Update(). + # + # Because the nesting_stack is updated at the end of each line, we + # had to do some convoluted checks to find out what is the current + # scope at the beginning of the line. This check is simplified by + # saving the previous top of nesting stack. + # + # We could save the full stack, but we only need the top. Copying + # the full nesting stack would slow down cpplint by ~10%. + self.previous_stack_top = [] + + # Stack of _PreprocessorInfo objects. + self.pp_stack = [] + + def SeenOpenBrace(self): + """Check if we have seen the opening brace for the innermost block. + + Returns: + True if we have seen the opening brace, False if the innermost + block is still expecting an opening brace. + """ + return (not self.stack) or self.stack[-1].seen_open_brace + + def InNamespaceBody(self): + """Check if we are currently one level inside a namespace body. + + Returns: + True if top of the stack is a namespace block, False otherwise. + """ + return self.stack and isinstance(self.stack[-1], _NamespaceInfo) + + def InExternC(self): + """Check if we are currently one level inside an 'extern "C"' block. + + Returns: + True if top of the stack is an extern block, False otherwise. + """ + return self.stack and isinstance(self.stack[-1], _ExternCInfo) + + def InClassDeclaration(self): + """Check if we are currently one level inside a class or struct declaration. + + Returns: + True if top of the stack is a class/struct, False otherwise. + """ + return self.stack and isinstance(self.stack[-1], _ClassInfo) + + def InAsmBlock(self): + """Check if we are currently one level inside an inline ASM block. + + Returns: + True if the top of the stack is a block containing inline ASM. + """ + return self.stack and self.stack[-1].inline_asm != _NO_ASM + + def InTemplateArgumentList(self, clean_lines, linenum, pos): + """Check if current position is inside template argument list. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + pos: position just after the suspected template argument. + Returns: + True if (linenum, pos) is inside template arguments. + """ + while linenum < clean_lines.NumLines(): + # Find the earliest character that might indicate a template argument + line = clean_lines.elided[linenum] + match = Match(r'^[^{};=\[\]\.<>]*(.)', line[pos:]) + if not match: + linenum += 1 + pos = 0 + continue + token = match.group(1) + pos += len(match.group(0)) + + # These things do not look like template argument list: + # class Suspect { + # class Suspect x; } + if token in ('{', '}', ';'): return False + + # These things look like template argument list: + # template + # template + # template + # template + if token in ('>', '=', '[', ']', '.'): return True + + # Check if token is an unmatched '<'. + # If not, move on to the next character. + if token != '<': + pos += 1 + if pos >= len(line): + linenum += 1 + pos = 0 + continue + + # We can't be sure if we just find a single '<', and need to + # find the matching '>'. + (_, end_line, end_pos) = CloseExpression(clean_lines, linenum, pos - 1) + if end_pos < 0: + # Not sure if template argument list or syntax error in file + return False + linenum = end_line + pos = end_pos + return False + + def UpdatePreprocessor(self, line): + """Update preprocessor stack. + + We need to handle preprocessors due to classes like this: + #ifdef SWIG + struct ResultDetailsPageElementExtensionPoint { + #else + struct ResultDetailsPageElementExtensionPoint : public Extension { + #endif + + We make the following assumptions (good enough for most files): + - Preprocessor condition evaluates to true from #if up to first + #else/#elif/#endif. + + - Preprocessor condition evaluates to false from #else/#elif up + to #endif. We still perform lint checks on these lines, but + these do not affect nesting stack. + + Args: + line: current line to check. + """ + if Match(r'^\s*#\s*(if|ifdef|ifndef)\b', line): + # Beginning of #if block, save the nesting stack here. The saved + # stack will allow us to restore the parsing state in the #else case. + self.pp_stack.append(_PreprocessorInfo(copy.deepcopy(self.stack))) + elif Match(r'^\s*#\s*(else|elif)\b', line): + # Beginning of #else block + if self.pp_stack: + if not self.pp_stack[-1].seen_else: + # This is the first #else or #elif block. Remember the + # whole nesting stack up to this point. This is what we + # keep after the #endif. + self.pp_stack[-1].seen_else = True + self.pp_stack[-1].stack_before_else = copy.deepcopy(self.stack) + + # Restore the stack to how it was before the #if + self.stack = copy.deepcopy(self.pp_stack[-1].stack_before_if) + else: + # TODO(unknown): unexpected #else, issue warning? + pass + elif Match(r'^\s*#\s*endif\b', line): + # End of #if or #else blocks. + if self.pp_stack: + # If we saw an #else, we will need to restore the nesting + # stack to its former state before the #else, otherwise we + # will just continue from where we left off. + if self.pp_stack[-1].seen_else: + # Here we can just use a shallow copy since we are the last + # reference to it. + self.stack = self.pp_stack[-1].stack_before_else + # Drop the corresponding #if + self.pp_stack.pop() + else: + # TODO(unknown): unexpected #endif, issue warning? + pass + + # TODO(unknown): Update() is too long, but we will refactor later. + def Update(self, filename, clean_lines, linenum, error): + """Update nesting state with current line. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # Remember top of the previous nesting stack. + # + # The stack is always pushed/popped and not modified in place, so + # we can just do a shallow copy instead of copy.deepcopy. Using + # deepcopy would slow down cpplint by ~28%. + if self.stack: + self.previous_stack_top = self.stack[-1] + else: + self.previous_stack_top = None + + # Update pp_stack + self.UpdatePreprocessor(line) + + # Count parentheses. This is to avoid adding struct arguments to + # the nesting stack. + if self.stack: + inner_block = self.stack[-1] + depth_change = line.count('(') - line.count(')') + inner_block.open_parentheses += depth_change + + # Also check if we are starting or ending an inline assembly block. + if inner_block.inline_asm in (_NO_ASM, _END_ASM): + if (depth_change != 0 and + inner_block.open_parentheses == 1 and + _MATCH_ASM.match(line)): + # Enter assembly block + inner_block.inline_asm = _INSIDE_ASM + else: + # Not entering assembly block. If previous line was _END_ASM, + # we will now shift to _NO_ASM state. + inner_block.inline_asm = _NO_ASM + elif (inner_block.inline_asm == _INSIDE_ASM and + inner_block.open_parentheses == 0): + # Exit assembly block + inner_block.inline_asm = _END_ASM + + # Consume namespace declaration at the beginning of the line. Do + # this in a loop so that we catch same line declarations like this: + # namespace proto2 { namespace bridge { class MessageSet; } } + while True: + # Match start of namespace. The "\b\s*" below catches namespace + # declarations even if it weren't followed by a whitespace, this + # is so that we don't confuse our namespace checker. The + # missing spaces will be flagged by CheckSpacing. + namespace_decl_match = Match(r'^\s*namespace\b\s*([:\w]+)?(.*)$', line) + if not namespace_decl_match: + break + + new_namespace = _NamespaceInfo(namespace_decl_match.group(1), linenum) + self.stack.append(new_namespace) + + line = namespace_decl_match.group(2) + if line.find('{') != -1: + new_namespace.seen_open_brace = True + line = line[line.find('{') + 1:] + + # Look for a class declaration in whatever is left of the line + # after parsing namespaces. The regexp accounts for decorated classes + # such as in: + # class LOCKABLE API Object { + # }; + class_decl_match = Match( + r'^(\s*(?:template\s*<[\w\s<>,:]*>\s*)?' + r'(class|struct)\s+(?:[A-Z_]+\s+)*(\w+(?:::\w+)*))' + r'(.*)$', line) + if (class_decl_match and + (not self.stack or self.stack[-1].open_parentheses == 0)): + # We do not want to accept classes that are actually template arguments: + # template , + # template class Ignore3> + # void Function() {}; + # + # To avoid template argument cases, we scan forward and look for + # an unmatched '>'. If we see one, assume we are inside a + # template argument list. + end_declaration = len(class_decl_match.group(1)) + if not self.InTemplateArgumentList(clean_lines, linenum, end_declaration): + self.stack.append(_ClassInfo( + class_decl_match.group(3), class_decl_match.group(2), + clean_lines, linenum)) + line = class_decl_match.group(4) + + # If we have not yet seen the opening brace for the innermost block, + # run checks here. + if not self.SeenOpenBrace(): + self.stack[-1].CheckBegin(filename, clean_lines, linenum, error) + + # Update access control if we are inside a class/struct + if self.stack and isinstance(self.stack[-1], _ClassInfo): + classinfo = self.stack[-1] + access_match = Match( + r'^(.*)\b(public|private|protected|signals)(\s+(?:slots\s*)?)?' + r':(?:[^:]|$)', + line) + if access_match: + classinfo.access = access_match.group(2) + + # Check that access keywords are indented +1 space. Skip this + # check if the keywords are not preceded by whitespaces. + indent = access_match.group(1) + if (len(indent) != classinfo.class_indent + 1 and + Match(r'^\s*$', indent)): + if classinfo.is_struct: + parent = 'struct ' + classinfo.name + else: + parent = 'class ' + classinfo.name + slots = '' + if access_match.group(3): + slots = access_match.group(3) + error(filename, linenum, 'whitespace/indent', 3, + '%s%s: should be indented +1 space inside %s' % ( + access_match.group(2), slots, parent)) + + # Consume braces or semicolons from what's left of the line + while True: + # Match first brace, semicolon, or closed parenthesis. + matched = Match(r'^[^{;)}]*([{;)}])(.*)$', line) + if not matched: + break + + token = matched.group(1) + if token == '{': + # If namespace or class hasn't seen a opening brace yet, mark + # namespace/class head as complete. Push a new block onto the + # stack otherwise. + if not self.SeenOpenBrace(): + self.stack[-1].seen_open_brace = True + elif Match(r'^extern\s*"[^"]*"\s*\{', line): + self.stack.append(_ExternCInfo()) + else: + self.stack.append(_BlockInfo(True)) + if _MATCH_ASM.match(line): + self.stack[-1].inline_asm = _BLOCK_ASM + + elif token == ';' or token == ')': + # If we haven't seen an opening brace yet, but we already saw + # a semicolon, this is probably a forward declaration. Pop + # the stack for these. + # + # Similarly, if we haven't seen an opening brace yet, but we + # already saw a closing parenthesis, then these are probably + # function arguments with extra "class" or "struct" keywords. + # Also pop these stack for these. + if not self.SeenOpenBrace(): + self.stack.pop() + else: # token == '}' + # Perform end of block checks and pop the stack. + if self.stack: + self.stack[-1].CheckEnd(filename, clean_lines, linenum, error) + self.stack.pop() + line = matched.group(2) + + def InnermostClass(self): + """Get class info on the top of the stack. + + Returns: + A _ClassInfo object if we are inside a class, or None otherwise. + """ + for i in range(len(self.stack), 0, -1): + classinfo = self.stack[i - 1] + if isinstance(classinfo, _ClassInfo): + return classinfo + return None + + def CheckCompletedBlocks(self, filename, error): + """Checks that all classes and namespaces have been completely parsed. + + Call this when all lines in a file have been processed. + Args: + filename: The name of the current file. + error: The function to call with any errors found. + """ + # Note: This test can result in false positives if #ifdef constructs + # get in the way of brace matching. See the testBuildClass test in + # cpplint_unittest.py for an example of this. + for obj in self.stack: + if isinstance(obj, _ClassInfo): + error(filename, obj.starting_linenum, 'build/class', 5, + 'Failed to find complete declaration of class %s' % + obj.name) + elif isinstance(obj, _NamespaceInfo): + error(filename, obj.starting_linenum, 'build/namespaces', 5, + 'Failed to find complete declaration of namespace %s' % + obj.name) + + +def CheckForNonStandardConstructs(filename, clean_lines, linenum, + nesting_state, error): + r"""Logs an error if we see certain non-ANSI constructs ignored by gcc-2. + + Complain about several constructs which gcc-2 accepts, but which are + not standard C++. Warning about these in lint is one way to ease the + transition to new compilers. + - put storage class first (e.g. "static const" instead of "const static"). + - "%lld" instead of %qd" in printf-type functions. + - "%1$d" is non-standard in printf-type functions. + - "\%" is an undefined character escape sequence. + - text after #endif is not allowed. + - invalid inner-style forward declaration. + - >? and ?= and )\?=?\s*(\w+|[+-]?\d+)(\.\d*)?', + line): + error(filename, linenum, 'build/deprecated', 3, + '>? and ))?' + # r'\s*const\s*' + type_name + '\s*&\s*\w+\s*;' + error(filename, linenum, 'runtime/member_string_references', 2, + 'const string& members are dangerous. It is much better to use ' + 'alternatives, such as pointers or simple constants.') + + # Everything else in this function operates on class declarations. + # Return early if the top of the nesting stack is not a class, or if + # the class head is not completed yet. + classinfo = nesting_state.InnermostClass() + if not classinfo or not classinfo.seen_open_brace: + return + + # The class may have been declared with namespace or classname qualifiers. + # The constructor and destructor will not have those qualifiers. + base_classname = classinfo.name.split('::')[-1] + + # Look for single-argument constructors that aren't marked explicit. + # Technically a valid construct, but against style. Also look for + # non-single-argument constructors which are also technically valid, but + # strongly suggest something is wrong. + explicit_constructor_match = Match( + r'\s+(?:inline\s+)?(explicit\s+)?(?:inline\s+)?%s\s*' + r'\(((?:[^()]|\([^()]*\))*)\)' + % re.escape(base_classname), + line) + + if explicit_constructor_match: + is_marked_explicit = explicit_constructor_match.group(1) + + if not explicit_constructor_match.group(2): + constructor_args = [] + else: + constructor_args = explicit_constructor_match.group(2).split(',') + + # collapse arguments so that commas in template parameter lists and function + # argument parameter lists don't split arguments in two + i = 0 + while i < len(constructor_args): + constructor_arg = constructor_args[i] + while (constructor_arg.count('<') > constructor_arg.count('>') or + constructor_arg.count('(') > constructor_arg.count(')')): + constructor_arg += ',' + constructor_args[i + 1] + del constructor_args[i + 1] + constructor_args[i] = constructor_arg + i += 1 + + defaulted_args = [arg for arg in constructor_args if '=' in arg] + noarg_constructor = (not constructor_args or # empty arg list + # 'void' arg specifier + (len(constructor_args) == 1 and + constructor_args[0].strip() == 'void')) + onearg_constructor = ((len(constructor_args) == 1 and # exactly one arg + not noarg_constructor) or + # all but at most one arg defaulted + (len(constructor_args) >= 1 and + not noarg_constructor and + len(defaulted_args) >= len(constructor_args) - 1)) + initializer_list_constructor = bool( + onearg_constructor and + Search(r'\bstd\s*::\s*initializer_list\b', constructor_args[0])) + copy_constructor = bool( + onearg_constructor and + Match(r'(const\s+)?%s(\s*<[^>]*>)?(\s+const)?\s*(?:<\w+>\s*)?&' + % re.escape(base_classname), constructor_args[0].strip())) + + if (not is_marked_explicit and + onearg_constructor and + not initializer_list_constructor and + not copy_constructor): + if defaulted_args: + error(filename, linenum, 'runtime/explicit', 5, + 'Constructors callable with one argument ' + 'should be marked explicit.') + else: + error(filename, linenum, 'runtime/explicit', 5, + 'Single-parameter constructors should be marked explicit.') + elif is_marked_explicit and not onearg_constructor: + if noarg_constructor: + error(filename, linenum, 'runtime/explicit', 5, + 'Zero-parameter constructors should not be marked explicit.') + else: + error(filename, linenum, 'runtime/explicit', 0, + 'Constructors that require multiple arguments ' + 'should not be marked explicit.') + + +def CheckSpacingForFunctionCall(filename, clean_lines, linenum, error): + """Checks for the correctness of various spacing around function calls. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # Since function calls often occur inside if/for/while/switch + # expressions - which have their own, more liberal conventions - we + # first see if we should be looking inside such an expression for a + # function call, to which we can apply more strict standards. + fncall = line # if there's no control flow construct, look at whole line + for pattern in (r'\bif\s*\((.*)\)\s*{', + r'\bfor\s*\((.*)\)\s*{', + r'\bwhile\s*\((.*)\)\s*[{;]', + r'\bswitch\s*\((.*)\)\s*{'): + match = Search(pattern, line) + if match: + fncall = match.group(1) # look inside the parens for function calls + break + + # Except in if/for/while/switch, there should never be space + # immediately inside parens (eg "f( 3, 4 )"). We make an exception + # for nested parens ( (a+b) + c ). Likewise, there should never be + # a space before a ( when it's a function argument. I assume it's a + # function argument when the char before the whitespace is legal in + # a function name (alnum + _) and we're not starting a macro. Also ignore + # pointers and references to arrays and functions coz they're too tricky: + # we use a very simple way to recognize these: + # " (something)(maybe-something)" or + # " (something)(maybe-something," or + # " (something)[something]" + # Note that we assume the contents of [] to be short enough that + # they'll never need to wrap. + if ( # Ignore control structures. + not Search(r'\b(if|for|while|switch|return|new|delete|catch|sizeof)\b', + fncall) and + # Ignore pointers/references to functions. + not Search(r' \([^)]+\)\([^)]*(\)|,$)', fncall) and + # Ignore pointers/references to arrays. + not Search(r' \([^)]+\)\[[^\]]+\]', fncall)): + if Search(r'\w\s*\(\s(?!\s*\\$)', fncall): # a ( used for a fn call + error(filename, linenum, 'whitespace/parens', 4, + 'Extra space after ( in function call') + elif Search(r'\(\s+(?!(\s*\\)|\()', fncall): + error(filename, linenum, 'whitespace/parens', 2, + 'Extra space after (') + if (Search(r'\w\s+\(', fncall) and + not Search(r'#\s*define|typedef|using\s+\w+\s*=', fncall) and + not Search(r'\w\s+\((\w+::)*\*\w+\)\(', fncall) and + not Search(r'\bcase\s+\(', fncall)): + # TODO(unknown): Space after an operator function seem to be a common + # error, silence those for now by restricting them to highest verbosity. + if Search(r'\boperator_*\b', line): + error(filename, linenum, 'whitespace/parens', 0, + 'Extra space before ( in function call') + else: + error(filename, linenum, 'whitespace/parens', 4, + 'Extra space before ( in function call') + # If the ) is followed only by a newline or a { + newline, assume it's + # part of a control statement (if/while/etc), and don't complain + if Search(r'[^)]\s+\)\s*[^{\s]', fncall): + # If the closing parenthesis is preceded by only whitespaces, + # try to give a more descriptive error message. + if Search(r'^\s+\)', fncall): + error(filename, linenum, 'whitespace/parens', 2, + 'Closing ) should be moved to the previous line') + else: + error(filename, linenum, 'whitespace/parens', 2, + 'Extra space before )') + + +def IsBlankLine(line): + """Returns true if the given line is blank. + + We consider a line to be blank if the line is empty or consists of + only white spaces. + + Args: + line: A line of a string. + + Returns: + True, if the given line is blank. + """ + return not line or line.isspace() + + +def CheckForNamespaceIndentation(filename, nesting_state, clean_lines, line, + error): + is_namespace_indent_item = ( + len(nesting_state.stack) > 1 and + nesting_state.stack[-1].check_namespace_indentation and + isinstance(nesting_state.previous_stack_top, _NamespaceInfo) and + nesting_state.previous_stack_top == nesting_state.stack[-2]) + + if ShouldCheckNamespaceIndentation(nesting_state, is_namespace_indent_item, + clean_lines.elided, line): + CheckItemIndentationInNamespace(filename, clean_lines.elided, + line, error) + + +def CheckForFunctionLengths(filename, clean_lines, linenum, + function_state, error): + """Reports for long function bodies. + + For an overview why this is done, see: + http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Write_Short_Functions + + Uses a simplistic algorithm assuming other style guidelines + (especially spacing) are followed. + Only checks unindented functions, so class members are unchecked. + Trivial bodies are unchecked, so constructors with huge initializer lists + may be missed. + Blank/comment lines are not counted so as to avoid encouraging the removal + of vertical space and comments just to get through a lint check. + NOLINT *on the last line of a function* disables this check. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + function_state: Current function name and lines in body so far. + error: The function to call with any errors found. + """ + lines = clean_lines.lines + line = lines[linenum] + joined_line = '' + + starting_func = False + regexp = r'(\w(\w|::|\*|\&|\s)*)\(' # decls * & space::name( ... + match_result = Match(regexp, line) + if match_result: + # If the name is all caps and underscores, figure it's a macro and + # ignore it, unless it's TEST or TEST_F. + function_name = match_result.group(1).split()[-1] + if function_name == 'TEST' or function_name == 'TEST_F' or ( + not Match(r'[A-Z_]+$', function_name)): + starting_func = True + + if starting_func: + body_found = False + for start_linenum in xrange(linenum, clean_lines.NumLines()): + start_line = lines[start_linenum] + joined_line += ' ' + start_line.lstrip() + if Search(r'(;|})', start_line): # Declarations and trivial functions + body_found = True + break # ... ignore + elif Search(r'{', start_line): + body_found = True + function = Search(r'((\w|:)*)\(', line).group(1) + if Match(r'TEST', function): # Handle TEST... macros + parameter_regexp = Search(r'(\(.*\))', joined_line) + if parameter_regexp: # Ignore bad syntax + function += parameter_regexp.group(1) + else: + function += '()' + function_state.Begin(function) + break + if not body_found: + # No body for the function (or evidence of a non-function) was found. + error(filename, linenum, 'readability/fn_size', 5, + 'Lint failed to find start of function body.') + elif Match(r'^\}\s*$', line): # function end + function_state.Check(error, filename, linenum) + function_state.End() + elif not Match(r'^\s*$', line): + function_state.Count() # Count non-blank/non-comment lines. + + +_RE_PATTERN_TODO = re.compile(r'^//(\s*)TODO(\(.+?\))?:?(\s|$)?') + + +def CheckComment(line, filename, linenum, next_line_start, error): + """Checks for common mistakes in comments. + + Args: + line: The line in question. + filename: The name of the current file. + linenum: The number of the line to check. + next_line_start: The first non-whitespace column of the next line. + error: The function to call with any errors found. + """ + commentpos = line.find('//') + if commentpos != -1: + # Check if the // may be in quotes. If so, ignore it + # Comparisons made explicit for clarity -- pylint: disable=g-explicit-bool-comparison + if (line.count('"', 0, commentpos) - + line.count('\\"', 0, commentpos)) % 2 == 0: # not in quotes + # Allow one space for new scopes, two spaces otherwise: + if (not (Match(r'^.*{ *//', line) and next_line_start == commentpos) and + ((commentpos >= 1 and + line[commentpos-1] not in string.whitespace) or + (commentpos >= 2 and + line[commentpos-2] not in string.whitespace))): + error(filename, linenum, 'whitespace/comments', 2, + 'At least two spaces is best between code and comments') + + # Checks for common mistakes in TODO comments. + comment = line[commentpos:] + match = _RE_PATTERN_TODO.match(comment) + if match: + # One whitespace is correct; zero whitespace is handled elsewhere. + leading_whitespace = match.group(1) + if len(leading_whitespace) > 1: + error(filename, linenum, 'whitespace/todo', 2, + 'Too many spaces before TODO') + + username = match.group(2) + if not username: + error(filename, linenum, 'readability/todo', 2, + 'Missing username in TODO; it should look like ' + '"// TODO(my_username): Stuff."') + + middle_whitespace = match.group(3) + # Comparisons made explicit for correctness -- pylint: disable=g-explicit-bool-comparison + if middle_whitespace != ' ' and middle_whitespace != '': + error(filename, linenum, 'whitespace/todo', 2, + 'TODO(my_username) should be followed by a space') + + # If the comment contains an alphanumeric character, there + # should be a space somewhere between it and the // unless + # it's a /// or //! Doxygen comment. + if (Match(r'//[^ ]*\w', comment) and + not Match(r'(///|//\!)(\s+|$)', comment)): + error(filename, linenum, 'whitespace/comments', 4, + 'Should have a space between // and comment') + + +def CheckAccess(filename, clean_lines, linenum, nesting_state, error): + """Checks for improper use of DISALLOW* macros. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + nesting_state: A NestingState instance which maintains information about + the current stack of nested blocks being parsed. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] # get rid of comments and strings + + matched = Match((r'\s*(DISALLOW_COPY_AND_ASSIGN|' + r'DISALLOW_IMPLICIT_CONSTRUCTORS)'), line) + if not matched: + return + if nesting_state.stack and isinstance(nesting_state.stack[-1], _ClassInfo): + if nesting_state.stack[-1].access != 'private': + error(filename, linenum, 'readability/constructors', 3, + '%s must be in the private: section' % matched.group(1)) + + else: + # Found DISALLOW* macro outside a class declaration, or perhaps it + # was used inside a function when it should have been part of the + # class declaration. We could issue a warning here, but it + # probably resulted in a compiler error already. + pass + + +def CheckSpacing(filename, clean_lines, linenum, nesting_state, error): + """Checks for the correctness of various spacing issues in the code. + + Things we check for: spaces around operators, spaces after + if/for/while/switch, no spaces around parens in function calls, two + spaces between code and comment, don't start a block with a blank + line, don't end a function with a blank line, don't add a blank line + after public/protected/private, don't have too many blank lines in a row. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + nesting_state: A NestingState instance which maintains information about + the current stack of nested blocks being parsed. + error: The function to call with any errors found. + """ + + # Don't use "elided" lines here, otherwise we can't check commented lines. + # Don't want to use "raw" either, because we don't want to check inside C++11 + # raw strings, + raw = clean_lines.lines_without_raw_strings + line = raw[linenum] + + # Before nixing comments, check if the line is blank for no good + # reason. This includes the first line after a block is opened, and + # blank lines at the end of a function (ie, right before a line like '}' + # + # Skip all the blank line checks if we are immediately inside a + # namespace body. In other words, don't issue blank line warnings + # for this block: + # namespace { + # + # } + # + # A warning about missing end of namespace comments will be issued instead. + # + # Also skip blank line checks for 'extern "C"' blocks, which are formatted + # like namespaces. + if (IsBlankLine(line) and + not nesting_state.InNamespaceBody() and + not nesting_state.InExternC()): + elided = clean_lines.elided + prev_line = elided[linenum - 1] + prevbrace = prev_line.rfind('{') + # TODO(unknown): Don't complain if line before blank line, and line after, + # both start with alnums and are indented the same amount. + # This ignores whitespace at the start of a namespace block + # because those are not usually indented. + if prevbrace != -1 and prev_line[prevbrace:].find('}') == -1: + # OK, we have a blank line at the start of a code block. Before we + # complain, we check if it is an exception to the rule: The previous + # non-empty line has the parameters of a function header that are indented + # 4 spaces (because they did not fit in a 80 column line when placed on + # the same line as the function name). We also check for the case where + # the previous line is indented 6 spaces, which may happen when the + # initializers of a constructor do not fit into a 80 column line. + exception = False + if Match(r' {6}\w', prev_line): # Initializer list? + # We are looking for the opening column of initializer list, which + # should be indented 4 spaces to cause 6 space indentation afterwards. + search_position = linenum-2 + while (search_position >= 0 + and Match(r' {6}\w', elided[search_position])): + search_position -= 1 + exception = (search_position >= 0 + and elided[search_position][:5] == ' :') + else: + # Search for the function arguments or an initializer list. We use a + # simple heuristic here: If the line is indented 4 spaces; and we have a + # closing paren, without the opening paren, followed by an opening brace + # or colon (for initializer lists) we assume that it is the last line of + # a function header. If we have a colon indented 4 spaces, it is an + # initializer list. + exception = (Match(r' {4}\w[^\(]*\)\s*(const\s*)?(\{\s*$|:)', + prev_line) + or Match(r' {4}:', prev_line)) + + if not exception: + error(filename, linenum, 'whitespace/blank_line', 2, + 'Redundant blank line at the start of a code block ' + 'should be deleted.') + # Ignore blank lines at the end of a block in a long if-else + # chain, like this: + # if (condition1) { + # // Something followed by a blank line + # + # } else if (condition2) { + # // Something else + # } + if linenum + 1 < clean_lines.NumLines(): + next_line = raw[linenum + 1] + if (next_line + and Match(r'\s*}', next_line) + and next_line.find('} else ') == -1): + error(filename, linenum, 'whitespace/blank_line', 3, + 'Redundant blank line at the end of a code block ' + 'should be deleted.') + + matched = Match(r'\s*(public|protected|private):', prev_line) + if matched: + error(filename, linenum, 'whitespace/blank_line', 3, + 'Do not leave a blank line after "%s:"' % matched.group(1)) + + # Next, check comments + next_line_start = 0 + if linenum + 1 < clean_lines.NumLines(): + next_line = raw[linenum + 1] + next_line_start = len(next_line) - len(next_line.lstrip()) + CheckComment(line, filename, linenum, next_line_start, error) + + # get rid of comments and strings + line = clean_lines.elided[linenum] + + # You shouldn't have spaces before your brackets, except maybe after + # 'delete []' or 'return []() {};' + if Search(r'\w\s+\[', line) and not Search(r'(?:delete|return)\s+\[', line): + error(filename, linenum, 'whitespace/braces', 5, + 'Extra space before [') + + # In range-based for, we wanted spaces before and after the colon, but + # not around "::" tokens that might appear. + if (Search(r'for *\(.*[^:]:[^: ]', line) or + Search(r'for *\(.*[^: ]:[^:]', line)): + error(filename, linenum, 'whitespace/forcolon', 2, + 'Missing space around colon in range-based for loop') + + +def CheckOperatorSpacing(filename, clean_lines, linenum, error): + """Checks for horizontal spacing around operators. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # Don't try to do spacing checks for operator methods. Do this by + # replacing the troublesome characters with something else, + # preserving column position for all other characters. + # + # The replacement is done repeatedly to avoid false positives from + # operators that call operators. + while True: + match = Match(r'^(.*\boperator\b)(\S+)(\s*\(.*)$', line) + if match: + line = match.group(1) + ('_' * len(match.group(2))) + match.group(3) + else: + break + + # We allow no-spaces around = within an if: "if ( (a=Foo()) == 0 )". + # Otherwise not. Note we only check for non-spaces on *both* sides; + # sometimes people put non-spaces on one side when aligning ='s among + # many lines (not that this is behavior that I approve of...) + if ((Search(r'[\w.]=', line) or + Search(r'=[\w.]', line)) + and not Search(r'\b(if|while|for) ', line) + # Operators taken from [lex.operators] in C++11 standard. + and not Search(r'(>=|<=|==|!=|&=|\^=|\|=|\+=|\*=|\/=|\%=)', line) + and not Search(r'operator=', line)): + error(filename, linenum, 'whitespace/operators', 4, + 'Missing spaces around =') + + # It's ok not to have spaces around binary operators like + - * /, but if + # there's too little whitespace, we get concerned. It's hard to tell, + # though, so we punt on this one for now. TODO. + + # You should always have whitespace around binary operators. + # + # Check <= and >= first to avoid false positives with < and >, then + # check non-include lines for spacing around < and >. + # + # If the operator is followed by a comma, assume it's be used in a + # macro context and don't do any checks. This avoids false + # positives. + # + # Note that && is not included here. Those are checked separately + # in CheckRValueReference + match = Search(r'[^<>=!\s](==|!=|<=|>=|\|\|)[^<>=!\s,;\)]', line) + if match: + error(filename, linenum, 'whitespace/operators', 3, + 'Missing spaces around %s' % match.group(1)) + elif not Match(r'#.*include', line): + # Look for < that is not surrounded by spaces. This is only + # triggered if both sides are missing spaces, even though + # technically should should flag if at least one side is missing a + # space. This is done to avoid some false positives with shifts. + match = Match(r'^(.*[^\s<])<[^\s=<,]', line) + if match: + (_, _, end_pos) = CloseExpression( + clean_lines, linenum, len(match.group(1))) + if end_pos <= -1: + error(filename, linenum, 'whitespace/operators', 3, + 'Missing spaces around <') + + # Look for > that is not surrounded by spaces. Similar to the + # above, we only trigger if both sides are missing spaces to avoid + # false positives with shifts. + match = Match(r'^(.*[^-\s>])>[^\s=>,]', line) + if match: + (_, _, start_pos) = ReverseCloseExpression( + clean_lines, linenum, len(match.group(1))) + if start_pos <= -1: + error(filename, linenum, 'whitespace/operators', 3, + 'Missing spaces around >') + + # We allow no-spaces around << when used like this: 10<<20, but + # not otherwise (particularly, not when used as streams) + # + # We also allow operators following an opening parenthesis, since + # those tend to be macros that deal with operators. + match = Search(r'(operator|[^\s(<])(?:L|UL|ULL|l|ul|ull)?<<([^\s,=<])', line) + if (match and not (match.group(1).isdigit() and match.group(2).isdigit()) and + not (match.group(1) == 'operator' and match.group(2) == ';')): + error(filename, linenum, 'whitespace/operators', 3, + 'Missing spaces around <<') + + # We allow no-spaces around >> for almost anything. This is because + # C++11 allows ">>" to close nested templates, which accounts for + # most cases when ">>" is not followed by a space. + # + # We still warn on ">>" followed by alpha character, because that is + # likely due to ">>" being used for right shifts, e.g.: + # value >> alpha + # + # When ">>" is used to close templates, the alphanumeric letter that + # follows would be part of an identifier, and there should still be + # a space separating the template type and the identifier. + # type> alpha + match = Search(r'>>[a-zA-Z_]', line) + if match: + error(filename, linenum, 'whitespace/operators', 3, + 'Missing spaces around >>') + + # There shouldn't be space around unary operators + match = Search(r'(!\s|~\s|[\s]--[\s;]|[\s]\+\+[\s;])', line) + if match: + error(filename, linenum, 'whitespace/operators', 4, + 'Extra space for operator %s' % match.group(1)) + + +def CheckParenthesisSpacing(filename, clean_lines, linenum, error): + """Checks for horizontal spacing around parentheses. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # No spaces after an if, while, switch, or for + match = Search(r' (if\(|for\(|while\(|switch\()', line) + if match: + error(filename, linenum, 'whitespace/parens', 5, + 'Missing space before ( in %s' % match.group(1)) + + # For if/for/while/switch, the left and right parens should be + # consistent about how many spaces are inside the parens, and + # there should either be zero or one spaces inside the parens. + # We don't want: "if ( foo)" or "if ( foo )". + # Exception: "for ( ; foo; bar)" and "for (foo; bar; )" are allowed. + match = Search(r'\b(if|for|while|switch)\s*' + r'\(([ ]*)(.).*[^ ]+([ ]*)\)\s*{\s*$', + line) + if match: + if len(match.group(2)) != len(match.group(4)): + if not (match.group(3) == ';' and + len(match.group(2)) == 1 + len(match.group(4)) or + not match.group(2) and Search(r'\bfor\s*\(.*; \)', line)): + error(filename, linenum, 'whitespace/parens', 5, + 'Mismatching spaces inside () in %s' % match.group(1)) + if len(match.group(2)) not in [0, 1]: + error(filename, linenum, 'whitespace/parens', 5, + 'Should have zero or one spaces inside ( and ) in %s' % + match.group(1)) + + +def CheckCommaSpacing(filename, clean_lines, linenum, error): + """Checks for horizontal spacing near commas and semicolons. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + raw = clean_lines.lines_without_raw_strings + line = clean_lines.elided[linenum] + + # You should always have a space after a comma (either as fn arg or operator) + # + # This does not apply when the non-space character following the + # comma is another comma, since the only time when that happens is + # for empty macro arguments. + # + # We run this check in two passes: first pass on elided lines to + # verify that lines contain missing whitespaces, second pass on raw + # lines to confirm that those missing whitespaces are not due to + # elided comments. + if (Search(r',[^,\s]', ReplaceAll(r'\boperator\s*,\s*\(', 'F(', line)) and + Search(r',[^,\s]', raw[linenum])): + error(filename, linenum, 'whitespace/comma', 3, + 'Missing space after ,') + + # You should always have a space after a semicolon + # except for few corner cases + # TODO(unknown): clarify if 'if (1) { return 1;}' is requires one more + # space after ; + if Search(r';[^\s};\\)/]', line): + error(filename, linenum, 'whitespace/semicolon', 3, + 'Missing space after ;') + + +def CheckBracesSpacing(filename, clean_lines, linenum, error): + """Checks for horizontal spacing near commas. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # Except after an opening paren, or after another opening brace (in case of + # an initializer list, for instance), you should have spaces before your + # braces. And since you should never have braces at the beginning of a line, + # this is an easy test. + match = Match(r'^(.*[^ ({>]){', line) + if match: + # Try a bit harder to check for brace initialization. This + # happens in one of the following forms: + # Constructor() : initializer_list_{} { ... } + # Constructor{}.MemberFunction() + # Type variable{}; + # FunctionCall(type{}, ...); + # LastArgument(..., type{}); + # LOG(INFO) << type{} << " ..."; + # map_of_type[{...}] = ...; + # ternary = expr ? new type{} : nullptr; + # OuterTemplate{}> + # + # We check for the character following the closing brace, and + # silence the warning if it's one of those listed above, i.e. + # "{.;,)<>]:". + # + # To account for nested initializer list, we allow any number of + # closing braces up to "{;,)<". We can't simply silence the + # warning on first sight of closing brace, because that would + # cause false negatives for things that are not initializer lists. + # Silence this: But not this: + # Outer{ if (...) { + # Inner{...} if (...){ // Missing space before { + # }; } + # + # There is a false negative with this approach if people inserted + # spurious semicolons, e.g. "if (cond){};", but we will catch the + # spurious semicolon with a separate check. + (endline, endlinenum, endpos) = CloseExpression( + clean_lines, linenum, len(match.group(1))) + trailing_text = '' + if endpos > -1: + trailing_text = endline[endpos:] + for offset in xrange(endlinenum + 1, + min(endlinenum + 3, clean_lines.NumLines() - 1)): + trailing_text += clean_lines.elided[offset] + if not Match(r'^[\s}]*[{.;,)<>\]:]', trailing_text): + error(filename, linenum, 'whitespace/braces', 5, + 'Missing space before {') + + # Make sure '} else {' has spaces. + if Search(r'}else', line): + error(filename, linenum, 'whitespace/braces', 5, + 'Missing space before else') + + # You shouldn't have a space before a semicolon at the end of the line. + # There's a special case for "for" since the style guide allows space before + # the semicolon there. + if Search(r':\s*;\s*$', line): + error(filename, linenum, 'whitespace/semicolon', 5, + 'Semicolon defining empty statement. Use {} instead.') + elif Search(r'^\s*;\s*$', line): + error(filename, linenum, 'whitespace/semicolon', 5, + 'Line contains only semicolon. If this should be an empty statement, ' + 'use {} instead.') + elif (Search(r'\s+;\s*$', line) and + not Search(r'\bfor\b', line)): + error(filename, linenum, 'whitespace/semicolon', 5, + 'Extra space before last semicolon. If this should be an empty ' + 'statement, use {} instead.') + + +def IsDecltype(clean_lines, linenum, column): + """Check if the token ending on (linenum, column) is decltype(). + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: the number of the line to check. + column: end column of the token to check. + Returns: + True if this token is decltype() expression, False otherwise. + """ + (text, _, start_col) = ReverseCloseExpression(clean_lines, linenum, column) + if start_col < 0: + return False + if Search(r'\bdecltype\s*$', text[0:start_col]): + return True + return False + + +def IsTemplateParameterList(clean_lines, linenum, column): + """Check if the token ending on (linenum, column) is the end of template<>. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: the number of the line to check. + column: end column of the token to check. + Returns: + True if this token is end of a template parameter list, False otherwise. + """ + (_, startline, startpos) = ReverseCloseExpression( + clean_lines, linenum, column) + if (startpos > -1 and + Search(r'\btemplate\s*$', clean_lines.elided[startline][0:startpos])): + return True + return False + + +def IsRValueType(typenames, clean_lines, nesting_state, linenum, column): + """Check if the token ending on (linenum, column) is a type. + + Assumes that text to the right of the column is "&&" or a function + name. + + Args: + typenames: set of type names from template-argument-list. + clean_lines: A CleansedLines instance containing the file. + nesting_state: A NestingState instance which maintains information about + the current stack of nested blocks being parsed. + linenum: the number of the line to check. + column: end column of the token to check. + Returns: + True if this token is a type, False if we are not sure. + """ + prefix = clean_lines.elided[linenum][0:column] + + # Get one word to the left. If we failed to do so, this is most + # likely not a type, since it's unlikely that the type name and "&&" + # would be split across multiple lines. + match = Match(r'^(.*)(\b\w+|[>*)&])\s*$', prefix) + if not match: + return False + + # Check text following the token. If it's "&&>" or "&&," or "&&...", it's + # most likely a rvalue reference used inside a template. + suffix = clean_lines.elided[linenum][column:] + if Match(r'&&\s*(?:[>,]|\.\.\.)', suffix): + return True + + # Check for known types and end of templates: + # int&& variable + # vector&& variable + # + # Because this function is called recursively, we also need to + # recognize pointer and reference types: + # int* Function() + # int& Function() + if (match.group(2) in typenames or + match.group(2) in ['char', 'char16_t', 'char32_t', 'wchar_t', 'bool', + 'short', 'int', 'long', 'signed', 'unsigned', + 'float', 'double', 'void', 'auto', '>', '*', '&']): + return True + + # If we see a close parenthesis, look for decltype on the other side. + # decltype would unambiguously identify a type, anything else is + # probably a parenthesized expression and not a type. + if match.group(2) == ')': + return IsDecltype( + clean_lines, linenum, len(match.group(1)) + len(match.group(2)) - 1) + + # Check for casts and cv-qualifiers. + # match.group(1) remainder + # -------------- --------- + # const_cast< type&& + # const type&& + # type const&& + if Search(r'\b(?:const_cast\s*<|static_cast\s*<|dynamic_cast\s*<|' + r'reinterpret_cast\s*<|\w+\s)\s*$', + match.group(1)): + return True + + # Look for a preceding symbol that might help differentiate the context. + # These are the cases that would be ambiguous: + # match.group(1) remainder + # -------------- --------- + # Call ( expression && + # Declaration ( type&& + # sizeof ( type&& + # if ( expression && + # while ( expression && + # for ( type&& + # for( ; expression && + # statement ; type&& + # block { type&& + # constructor { expression && + start = linenum + line = match.group(1) + match_symbol = None + while start >= 0: + # We want to skip over identifiers and commas to get to a symbol. + # Commas are skipped so that we can find the opening parenthesis + # for function parameter lists. + match_symbol = Match(r'^(.*)([^\w\s,])[\w\s,]*$', line) + if match_symbol: + break + start -= 1 + line = clean_lines.elided[start] + + if not match_symbol: + # Probably the first statement in the file is an rvalue reference + return True + + if match_symbol.group(2) == '}': + # Found closing brace, probably an indicate of this: + # block{} type&& + return True + + if match_symbol.group(2) == ';': + # Found semicolon, probably one of these: + # for(; expression && + # statement; type&& + + # Look for the previous 'for(' in the previous lines. + before_text = match_symbol.group(1) + for i in xrange(start - 1, max(start - 6, 0), -1): + before_text = clean_lines.elided[i] + before_text + if Search(r'for\s*\([^{};]*$', before_text): + # This is the condition inside a for-loop + return False + + # Did not find a for-init-statement before this semicolon, so this + # is probably a new statement and not a condition. + return True + + if match_symbol.group(2) == '{': + # Found opening brace, probably one of these: + # block{ type&& = ... ; } + # constructor{ expression && expression } + + # Look for a closing brace or a semicolon. If we see a semicolon + # first, this is probably a rvalue reference. + line = clean_lines.elided[start][0:len(match_symbol.group(1)) + 1] + end = start + depth = 1 + while True: + for ch in line: + if ch == ';': + return True + elif ch == '{': + depth += 1 + elif ch == '}': + depth -= 1 + if depth == 0: + return False + end += 1 + if end >= clean_lines.NumLines(): + break + line = clean_lines.elided[end] + # Incomplete program? + return False + + if match_symbol.group(2) == '(': + # Opening parenthesis. Need to check what's to the left of the + # parenthesis. Look back one extra line for additional context. + before_text = match_symbol.group(1) + if linenum > 1: + before_text = clean_lines.elided[linenum - 1] + before_text + before_text = match_symbol.group(1) + + # Patterns that are likely to be types: + # [](type&& + # for (type&& + # sizeof(type&& + # operator=(type&& + # + if Search(r'(?:\]|\bfor|\bsizeof|\boperator\s*\S+\s*)\s*$', before_text): + return True + + # Patterns that are likely to be expressions: + # if (expression && + # while (expression && + # : initializer(expression && + # , initializer(expression && + # ( FunctionCall(expression && + # + FunctionCall(expression && + # + (expression && + # + # The last '+' represents operators such as '+' and '-'. + if Search(r'(?:\bif|\bwhile|[-+=%^(]*>)?\s*$', + match_symbol.group(1)) + if match_func: + # Check for constructors, which don't have return types. + if Search(r'\b(?:explicit|inline)$', match_func.group(1)): + return True + implicit_constructor = Match(r'\s*(\w+)\((?:const\s+)?(\w+)', prefix) + if (implicit_constructor and + implicit_constructor.group(1) == implicit_constructor.group(2)): + return True + return IsRValueType(typenames, clean_lines, nesting_state, linenum, + len(match_func.group(1))) + + # Nothing before the function name. If this is inside a block scope, + # this is probably a function call. + return not (nesting_state.previous_stack_top and + nesting_state.previous_stack_top.IsBlockInfo()) + + if match_symbol.group(2) == '>': + # Possibly a closing bracket, check that what's on the other side + # looks like the start of a template. + return IsTemplateParameterList( + clean_lines, start, len(match_symbol.group(1))) + + # Some other symbol, usually something like "a=b&&c". This is most + # likely not a type. + return False + + +def IsDeletedOrDefault(clean_lines, linenum): + """Check if current constructor or operator is deleted or default. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + Returns: + True if this is a deleted or default constructor. + """ + open_paren = clean_lines.elided[linenum].find('(') + if open_paren < 0: + return False + (close_line, _, close_paren) = CloseExpression( + clean_lines, linenum, open_paren) + if close_paren < 0: + return False + return Match(r'\s*=\s*(?:delete|default)\b', close_line[close_paren:]) + + +def IsRValueAllowed(clean_lines, linenum, typenames): + """Check if RValue reference is allowed on a particular line. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + typenames: set of type names from template-argument-list. + Returns: + True if line is within the region where RValue references are allowed. + """ + # Allow region marked by PUSH/POP macros + for i in xrange(linenum, 0, -1): + line = clean_lines.elided[i] + if Match(r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)', line): + if not line.endswith('PUSH'): + return False + for j in xrange(linenum, clean_lines.NumLines(), 1): + line = clean_lines.elided[j] + if Match(r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)', line): + return line.endswith('POP') + + # Allow operator= + line = clean_lines.elided[linenum] + if Search(r'\boperator\s*=\s*\(', line): + return IsDeletedOrDefault(clean_lines, linenum) + + # Allow constructors + match = Match(r'\s*(?:[\w<>]+::)*([\w<>]+)\s*::\s*([\w<>]+)\s*\(', line) + if match and match.group(1) == match.group(2): + return IsDeletedOrDefault(clean_lines, linenum) + if Search(r'\b(?:explicit|inline)\s+[\w<>]+\s*\(', line): + return IsDeletedOrDefault(clean_lines, linenum) + + if Match(r'\s*[\w<>]+\s*\(', line): + previous_line = 'ReturnType' + if linenum > 0: + previous_line = clean_lines.elided[linenum - 1] + if Match(r'^\s*$', previous_line) or Search(r'[{}:;]\s*$', previous_line): + return IsDeletedOrDefault(clean_lines, linenum) + + # Reject types not mentioned in template-argument-list + while line: + match = Match(r'^.*?(\w+)\s*&&(.*)$', line) + if not match: + break + if match.group(1) not in typenames: + return False + line = match.group(2) + + # All RValue types that were in template-argument-list should have + # been removed by now. Those were allowed, assuming that they will + # be forwarded. + # + # If there are no remaining RValue types left (i.e. types that were + # not found in template-argument-list), flag those as not allowed. + return line.find('&&') < 0 + + +def GetTemplateArgs(clean_lines, linenum): + """Find list of template arguments associated with this function declaration. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: Line number containing the start of the function declaration, + usually one line after the end of the template-argument-list. + Returns: + Set of type names, or empty set if this does not appear to have + any template parameters. + """ + # Find start of function + func_line = linenum + while func_line > 0: + line = clean_lines.elided[func_line] + if Match(r'^\s*$', line): + return set() + if line.find('(') >= 0: + break + func_line -= 1 + if func_line == 0: + return set() + + # Collapse template-argument-list into a single string + argument_list = '' + match = Match(r'^(\s*template\s*)<', clean_lines.elided[func_line]) + if match: + # template-argument-list on the same line as function name + start_col = len(match.group(1)) + _, end_line, end_col = CloseExpression(clean_lines, func_line, start_col) + if end_col > -1 and end_line == func_line: + start_col += 1 # Skip the opening bracket + argument_list = clean_lines.elided[func_line][start_col:end_col] + + elif func_line > 1: + # template-argument-list one line before function name + match = Match(r'^(.*)>\s*$', clean_lines.elided[func_line - 1]) + if match: + end_col = len(match.group(1)) + _, start_line, start_col = ReverseCloseExpression( + clean_lines, func_line - 1, end_col) + if start_col > -1: + start_col += 1 # Skip the opening bracket + while start_line < func_line - 1: + argument_list += clean_lines.elided[start_line][start_col:] + start_col = 0 + start_line += 1 + argument_list += clean_lines.elided[func_line - 1][start_col:end_col] + + if not argument_list: + return set() + + # Extract type names + typenames = set() + while True: + match = Match(r'^[,\s]*(?:typename|class)(?:\.\.\.)?\s+(\w+)(.*)$', + argument_list) + if not match: + break + typenames.add(match.group(1)) + argument_list = match.group(2) + return typenames + + +def CheckRValueReference(filename, clean_lines, linenum, nesting_state, error): + """Check for rvalue references. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + nesting_state: A NestingState instance which maintains information about + the current stack of nested blocks being parsed. + error: The function to call with any errors found. + """ + # Find lines missing spaces around &&. + # TODO(unknown): currently we don't check for rvalue references + # with spaces surrounding the && to avoid false positives with + # boolean expressions. + line = clean_lines.elided[linenum] + match = Match(r'^(.*\S)&&', line) + if not match: + match = Match(r'(.*)&&\S', line) + if (not match) or '(&&)' in line or Search(r'\boperator\s*$', match.group(1)): + return + + # Either poorly formed && or an rvalue reference, check the context + # to get a more accurate error message. Mostly we want to determine + # if what's to the left of "&&" is a type or not. + typenames = GetTemplateArgs(clean_lines, linenum) + and_pos = len(match.group(1)) + if IsRValueType(typenames, clean_lines, nesting_state, linenum, and_pos): + if not IsRValueAllowed(clean_lines, linenum, typenames): + error(filename, linenum, 'build/c++11', 3, + 'RValue references are an unapproved C++ feature.') + else: + error(filename, linenum, 'whitespace/operators', 3, + 'Missing spaces around &&') + + +def CheckSectionSpacing(filename, clean_lines, class_info, linenum, error): + """Checks for additional blank line issues related to sections. + + Currently the only thing checked here is blank line before protected/private. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + class_info: A _ClassInfo objects. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + # Skip checks if the class is small, where small means 25 lines or less. + # 25 lines seems like a good cutoff since that's the usual height of + # terminals, and any class that can't fit in one screen can't really + # be considered "small". + # + # Also skip checks if we are on the first line. This accounts for + # classes that look like + # class Foo { public: ... }; + # + # If we didn't find the end of the class, last_line would be zero, + # and the check will be skipped by the first condition. + if (class_info.last_line - class_info.starting_linenum <= 24 or + linenum <= class_info.starting_linenum): + return + + matched = Match(r'\s*(public|protected|private):', clean_lines.lines[linenum]) + if matched: + # Issue warning if the line before public/protected/private was + # not a blank line, but don't do this if the previous line contains + # "class" or "struct". This can happen two ways: + # - We are at the beginning of the class. + # - We are forward-declaring an inner class that is semantically + # private, but needed to be public for implementation reasons. + # Also ignores cases where the previous line ends with a backslash as can be + # common when defining classes in C macros. + prev_line = clean_lines.lines[linenum - 1] + if (not IsBlankLine(prev_line) and + not Search(r'\b(class|struct)\b', prev_line) and + not Search(r'\\$', prev_line)): + # Try a bit harder to find the beginning of the class. This is to + # account for multi-line base-specifier lists, e.g.: + # class Derived + # : public Base { + end_class_head = class_info.starting_linenum + for i in range(class_info.starting_linenum, linenum): + if Search(r'\{\s*$', clean_lines.lines[i]): + end_class_head = i + break + if end_class_head < linenum - 1: + error(filename, linenum, 'whitespace/blank_line', 3, + '"%s:" should be preceded by a blank line' % matched.group(1)) + + +def GetPreviousNonBlankLine(clean_lines, linenum): + """Return the most recent non-blank line and its line number. + + Args: + clean_lines: A CleansedLines instance containing the file contents. + linenum: The number of the line to check. + + Returns: + A tuple with two elements. The first element is the contents of the last + non-blank line before the current line, or the empty string if this is the + first non-blank line. The second is the line number of that line, or -1 + if this is the first non-blank line. + """ + + prevlinenum = linenum - 1 + while prevlinenum >= 0: + prevline = clean_lines.elided[prevlinenum] + if not IsBlankLine(prevline): # if not a blank line... + return (prevline, prevlinenum) + prevlinenum -= 1 + return ('', -1) + + +def CheckBraces(filename, clean_lines, linenum, error): + """Looks for misplaced braces (e.g. at the end of line). + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + + line = clean_lines.elided[linenum] # get rid of comments and strings + + if Match(r'\s*{\s*$', line): + # We allow an open brace to start a line in the case where someone is using + # braces in a block to explicitly create a new scope, which is commonly used + # to control the lifetime of stack-allocated variables. Braces are also + # used for brace initializers inside function calls. We don't detect this + # perfectly: we just don't complain if the last non-whitespace character on + # the previous non-blank line is ',', ';', ':', '(', '{', or '}', or if the + # previous line starts a preprocessor block. + prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] + if (not Search(r'[,;:}{(]\s*$', prevline) and + not Match(r'\s*#', prevline)): + error(filename, linenum, 'whitespace/braces', 4, + '{ should almost always be at the end of the previous line') + + # An else clause should be on the same line as the preceding closing brace. + if Match(r'\s*else\b\s*(?:if\b|\{|$)', line): + prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] + if Match(r'\s*}\s*$', prevline): + error(filename, linenum, 'whitespace/newline', 4, + 'An else should appear on the same line as the preceding }') + + # If braces come on one side of an else, they should be on both. + # However, we have to worry about "else if" that spans multiple lines! + if Search(r'else if\s*\(', line): # could be multi-line if + brace_on_left = bool(Search(r'}\s*else if\s*\(', line)) + # find the ( after the if + pos = line.find('else if') + pos = line.find('(', pos) + if pos > 0: + (endline, _, endpos) = CloseExpression(clean_lines, linenum, pos) + brace_on_right = endline[endpos:].find('{') != -1 + if brace_on_left != brace_on_right: # must be brace after if + error(filename, linenum, 'readability/braces', 5, + 'If an else has a brace on one side, it should have it on both') + elif Search(r'}\s*else[^{]*$', line) or Match(r'[^}]*else\s*{', line): + error(filename, linenum, 'readability/braces', 5, + 'If an else has a brace on one side, it should have it on both') + + # Likewise, an else should never have the else clause on the same line + if Search(r'\belse [^\s{]', line) and not Search(r'\belse if\b', line): + error(filename, linenum, 'whitespace/newline', 4, + 'Else clause should never be on same line as else (use 2 lines)') + + # In the same way, a do/while should never be on one line + if Match(r'\s*do [^\s{]', line): + error(filename, linenum, 'whitespace/newline', 4, + 'do/while clauses should not be on a single line') + + # Check single-line if/else bodies. The style guide says 'curly braces are not + # required for single-line statements'. We additionally allow multi-line, + # single statements, but we reject anything with more than one semicolon in + # it. This means that the first semicolon after the if should be at the end of + # its line, and the line after that should have an indent level equal to or + # lower than the if. We also check for ambiguous if/else nesting without + # braces. + if_else_match = Search(r'\b(if\s*\(|else\b)', line) + if if_else_match and not Match(r'\s*#', line): + if_indent = GetIndentLevel(line) + endline, endlinenum, endpos = line, linenum, if_else_match.end() + if_match = Search(r'\bif\s*\(', line) + if if_match: + # This could be a multiline if condition, so find the end first. + pos = if_match.end() - 1 + (endline, endlinenum, endpos) = CloseExpression(clean_lines, linenum, pos) + # Check for an opening brace, either directly after the if or on the next + # line. If found, this isn't a single-statement conditional. + if (not Match(r'\s*{', endline[endpos:]) + and not (Match(r'\s*$', endline[endpos:]) + and endlinenum < (len(clean_lines.elided) - 1) + and Match(r'\s*{', clean_lines.elided[endlinenum + 1]))): + while (endlinenum < len(clean_lines.elided) + and ';' not in clean_lines.elided[endlinenum][endpos:]): + endlinenum += 1 + endpos = 0 + if endlinenum < len(clean_lines.elided): + endline = clean_lines.elided[endlinenum] + # We allow a mix of whitespace and closing braces (e.g. for one-liner + # methods) and a single \ after the semicolon (for macros) + endpos = endline.find(';') + if not Match(r';[\s}]*(\\?)$', endline[endpos:]): + # Semicolon isn't the last character, there's something trailing. + # Output a warning if the semicolon is not contained inside + # a lambda expression. + if not Match(r'^[^{};]*\[[^\[\]]*\][^{}]*\{[^{}]*\}\s*\)*[;,]\s*$', + endline): + error(filename, linenum, 'readability/braces', 4, + 'If/else bodies with multiple statements require braces') + elif endlinenum < len(clean_lines.elided) - 1: + # Make sure the next line is dedented + next_line = clean_lines.elided[endlinenum + 1] + next_indent = GetIndentLevel(next_line) + # With ambiguous nested if statements, this will error out on the + # if that *doesn't* match the else, regardless of whether it's the + # inner one or outer one. + if (if_match and Match(r'\s*else\b', next_line) + and next_indent != if_indent): + error(filename, linenum, 'readability/braces', 4, + 'Else clause should be indented at the same level as if. ' + 'Ambiguous nested if/else chains require braces.') + elif next_indent > if_indent: + error(filename, linenum, 'readability/braces', 4, + 'If/else bodies with multiple statements require braces') + + +def CheckTrailingSemicolon(filename, clean_lines, linenum, error): + """Looks for redundant trailing semicolon. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + + line = clean_lines.elided[linenum] + + # Block bodies should not be followed by a semicolon. Due to C++11 + # brace initialization, there are more places where semicolons are + # required than not, so we use a whitelist approach to check these + # rather than a blacklist. These are the places where "};" should + # be replaced by just "}": + # 1. Some flavor of block following closing parenthesis: + # for (;;) {}; + # while (...) {}; + # switch (...) {}; + # Function(...) {}; + # if (...) {}; + # if (...) else if (...) {}; + # + # 2. else block: + # if (...) else {}; + # + # 3. const member function: + # Function(...) const {}; + # + # 4. Block following some statement: + # x = 42; + # {}; + # + # 5. Block at the beginning of a function: + # Function(...) { + # {}; + # } + # + # Note that naively checking for the preceding "{" will also match + # braces inside multi-dimensional arrays, but this is fine since + # that expression will not contain semicolons. + # + # 6. Block following another block: + # while (true) {} + # {}; + # + # 7. End of namespaces: + # namespace {}; + # + # These semicolons seems far more common than other kinds of + # redundant semicolons, possibly due to people converting classes + # to namespaces. For now we do not warn for this case. + # + # Try matching case 1 first. + match = Match(r'^(.*\)\s*)\{', line) + if match: + # Matched closing parenthesis (case 1). Check the token before the + # matching opening parenthesis, and don't warn if it looks like a + # macro. This avoids these false positives: + # - macro that defines a base class + # - multi-line macro that defines a base class + # - macro that defines the whole class-head + # + # But we still issue warnings for macros that we know are safe to + # warn, specifically: + # - TEST, TEST_F, TEST_P, MATCHER, MATCHER_P + # - TYPED_TEST + # - INTERFACE_DEF + # - EXCLUSIVE_LOCKS_REQUIRED, SHARED_LOCKS_REQUIRED, LOCKS_EXCLUDED: + # + # We implement a whitelist of safe macros instead of a blacklist of + # unsafe macros, even though the latter appears less frequently in + # google code and would have been easier to implement. This is because + # the downside for getting the whitelist wrong means some extra + # semicolons, while the downside for getting the blacklist wrong + # would result in compile errors. + # + # In addition to macros, we also don't want to warn on + # - Compound literals + # - Lambdas + # - alignas specifier with anonymous structs: + closing_brace_pos = match.group(1).rfind(')') + opening_parenthesis = ReverseCloseExpression( + clean_lines, linenum, closing_brace_pos) + if opening_parenthesis[2] > -1: + line_prefix = opening_parenthesis[0][0:opening_parenthesis[2]] + macro = Search(r'\b([A-Z_]+)\s*$', line_prefix) + func = Match(r'^(.*\])\s*$', line_prefix) + if ((macro and + macro.group(1) not in ( + 'TEST', 'TEST_F', 'MATCHER', 'MATCHER_P', 'TYPED_TEST', + 'EXCLUSIVE_LOCKS_REQUIRED', 'SHARED_LOCKS_REQUIRED', + 'LOCKS_EXCLUDED', 'INTERFACE_DEF')) or + (func and not Search(r'\boperator\s*\[\s*\]', func.group(1))) or + Search(r'\b(?:struct|union)\s+alignas\s*$', line_prefix) or + Search(r'\s+=\s*$', line_prefix)): + match = None + if (match and + opening_parenthesis[1] > 1 and + Search(r'\]\s*$', clean_lines.elided[opening_parenthesis[1] - 1])): + # Multi-line lambda-expression + match = None + + else: + # Try matching cases 2-3. + match = Match(r'^(.*(?:else|\)\s*const)\s*)\{', line) + if not match: + # Try matching cases 4-6. These are always matched on separate lines. + # + # Note that we can't simply concatenate the previous line to the + # current line and do a single match, otherwise we may output + # duplicate warnings for the blank line case: + # if (cond) { + # // blank line + # } + prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] + if prevline and Search(r'[;{}]\s*$', prevline): + match = Match(r'^(\s*)\{', line) + + # Check matching closing brace + if match: + (endline, endlinenum, endpos) = CloseExpression( + clean_lines, linenum, len(match.group(1))) + if endpos > -1 and Match(r'^\s*;', endline[endpos:]): + # Current {} pair is eligible for semicolon check, and we have found + # the redundant semicolon, output warning here. + # + # Note: because we are scanning forward for opening braces, and + # outputting warnings for the matching closing brace, if there are + # nested blocks with trailing semicolons, we will get the error + # messages in reversed order. + error(filename, endlinenum, 'readability/braces', 4, + "You don't need a ; after a }") + + +def CheckEmptyBlockBody(filename, clean_lines, linenum, error): + """Look for empty loop/conditional body with only a single semicolon. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + + # Search for loop keywords at the beginning of the line. Because only + # whitespaces are allowed before the keywords, this will also ignore most + # do-while-loops, since those lines should start with closing brace. + # + # We also check "if" blocks here, since an empty conditional block + # is likely an error. + line = clean_lines.elided[linenum] + matched = Match(r'\s*(for|while|if)\s*\(', line) + if matched: + # Find the end of the conditional expression + (end_line, end_linenum, end_pos) = CloseExpression( + clean_lines, linenum, line.find('(')) + + # Output warning if what follows the condition expression is a semicolon. + # No warning for all other cases, including whitespace or newline, since we + # have a separate check for semicolons preceded by whitespace. + if end_pos >= 0 and Match(r';', end_line[end_pos:]): + if matched.group(1) == 'if': + error(filename, end_linenum, 'whitespace/empty_conditional_body', 5, + 'Empty conditional bodies should use {}') + else: + error(filename, end_linenum, 'whitespace/empty_loop_body', 5, + 'Empty loop bodies should use {} or continue') + + +def FindCheckMacro(line): + """Find a replaceable CHECK-like macro. + + Args: + line: line to search on. + Returns: + (macro name, start position), or (None, -1) if no replaceable + macro is found. + """ + for macro in _CHECK_MACROS: + i = line.find(macro) + if i >= 0: + # Find opening parenthesis. Do a regular expression match here + # to make sure that we are matching the expected CHECK macro, as + # opposed to some other macro that happens to contain the CHECK + # substring. + matched = Match(r'^(.*\b' + macro + r'\s*)\(', line) + if not matched: + continue + return (macro, len(matched.group(1))) + return (None, -1) + + +def CheckCheck(filename, clean_lines, linenum, error): + """Checks the use of CHECK and EXPECT macros. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + + # Decide the set of replacement macros that should be suggested + lines = clean_lines.elided + (check_macro, start_pos) = FindCheckMacro(lines[linenum]) + if not check_macro: + return + + # Find end of the boolean expression by matching parentheses + (last_line, end_line, end_pos) = CloseExpression( + clean_lines, linenum, start_pos) + if end_pos < 0: + return + + # If the check macro is followed by something other than a + # semicolon, assume users will log their own custom error messages + # and don't suggest any replacements. + if not Match(r'\s*;', last_line[end_pos:]): + return + + if linenum == end_line: + expression = lines[linenum][start_pos + 1:end_pos - 1] + else: + expression = lines[linenum][start_pos + 1:] + for i in xrange(linenum + 1, end_line): + expression += lines[i] + expression += last_line[0:end_pos - 1] + + # Parse expression so that we can take parentheses into account. + # This avoids false positives for inputs like "CHECK((a < 4) == b)", + # which is not replaceable by CHECK_LE. + lhs = '' + rhs = '' + operator = None + while expression: + matched = Match(r'^\s*(<<|<<=|>>|>>=|->\*|->|&&|\|\||' + r'==|!=|>=|>|<=|<|\()(.*)$', expression) + if matched: + token = matched.group(1) + if token == '(': + # Parenthesized operand + expression = matched.group(2) + (end, _) = FindEndOfExpressionInLine(expression, 0, ['(']) + if end < 0: + return # Unmatched parenthesis + lhs += '(' + expression[0:end] + expression = expression[end:] + elif token in ('&&', '||'): + # Logical and/or operators. This means the expression + # contains more than one term, for example: + # CHECK(42 < a && a < b); + # + # These are not replaceable with CHECK_LE, so bail out early. + return + elif token in ('<<', '<<=', '>>', '>>=', '->*', '->'): + # Non-relational operator + lhs += token + expression = matched.group(2) + else: + # Relational operator + operator = token + rhs = matched.group(2) + break + else: + # Unparenthesized operand. Instead of appending to lhs one character + # at a time, we do another regular expression match to consume several + # characters at once if possible. Trivial benchmark shows that this + # is more efficient when the operands are longer than a single + # character, which is generally the case. + matched = Match(r'^([^-=!<>()&|]+)(.*)$', expression) + if not matched: + matched = Match(r'^(\s*\S)(.*)$', expression) + if not matched: + break + lhs += matched.group(1) + expression = matched.group(2) + + # Only apply checks if we got all parts of the boolean expression + if not (lhs and operator and rhs): + return + + # Check that rhs do not contain logical operators. We already know + # that lhs is fine since the loop above parses out && and ||. + if rhs.find('&&') > -1 or rhs.find('||') > -1: + return + + # At least one of the operands must be a constant literal. This is + # to avoid suggesting replacements for unprintable things like + # CHECK(variable != iterator) + # + # The following pattern matches decimal, hex integers, strings, and + # characters (in that order). + lhs = lhs.strip() + rhs = rhs.strip() + match_constant = r'^([-+]?(\d+|0[xX][0-9a-fA-F]+)[lLuU]{0,3}|".*"|\'.*\')$' + if Match(match_constant, lhs) or Match(match_constant, rhs): + # Note: since we know both lhs and rhs, we can provide a more + # descriptive error message like: + # Consider using CHECK_EQ(x, 42) instead of CHECK(x == 42) + # Instead of: + # Consider using CHECK_EQ instead of CHECK(a == b) + # + # We are still keeping the less descriptive message because if lhs + # or rhs gets long, the error message might become unreadable. + error(filename, linenum, 'readability/check', 2, + 'Consider using %s instead of %s(a %s b)' % ( + _CHECK_REPLACEMENT[check_macro][operator], + check_macro, operator)) + + +def CheckAltTokens(filename, clean_lines, linenum, error): + """Check alternative keywords being used in boolean expressions. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # Avoid preprocessor lines + if Match(r'^\s*#', line): + return + + # Last ditch effort to avoid multi-line comments. This will not help + # if the comment started before the current line or ended after the + # current line, but it catches most of the false positives. At least, + # it provides a way to workaround this warning for people who use + # multi-line comments in preprocessor macros. + # + # TODO(unknown): remove this once cpplint has better support for + # multi-line comments. + if line.find('/*') >= 0 or line.find('*/') >= 0: + return + + for match in _ALT_TOKEN_REPLACEMENT_PATTERN.finditer(line): + error(filename, linenum, 'readability/alt_tokens', 2, + 'Use operator %s instead of %s' % ( + _ALT_TOKEN_REPLACEMENT[match.group(1)], match.group(1))) + + +def GetLineWidth(line): + """Determines the width of the line in column positions. + + Args: + line: A string, which may be a Unicode string. + + Returns: + The width of the line in column positions, accounting for Unicode + combining characters and wide characters. + """ + if isinstance(line, unicode): + width = 0 + for uc in unicodedata.normalize('NFC', line): + if unicodedata.east_asian_width(uc) in ('W', 'F'): + width += 2 + elif not unicodedata.combining(uc): + width += 1 + return width + else: + return len(line) + + +def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state, + error): + """Checks rules from the 'C++ style rules' section of cppguide.html. + + Most of these rules are hard to test (naming, comment style), but we + do what we can. In particular we check for 2-space indents, line lengths, + tab usage, spaces inside code, etc. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + file_extension: The extension (without the dot) of the filename. + nesting_state: A NestingState instance which maintains information about + the current stack of nested blocks being parsed. + error: The function to call with any errors found. + """ + + # Don't use "elided" lines here, otherwise we can't check commented lines. + # Don't want to use "raw" either, because we don't want to check inside C++11 + # raw strings, + raw_lines = clean_lines.lines_without_raw_strings + line = raw_lines[linenum] + + if line.find('\t') != -1: + error(filename, linenum, 'whitespace/tab', 1, + 'Tab found; better to use spaces') + + # One or three blank spaces at the beginning of the line is weird; it's + # hard to reconcile that with 2-space indents. + # NOTE: here are the conditions rob pike used for his tests. Mine aren't + # as sophisticated, but it may be worth becoming so: RLENGTH==initial_spaces + # if(RLENGTH > 20) complain = 0; + # if(match($0, " +(error|private|public|protected):")) complain = 0; + # if(match(prev, "&& *$")) complain = 0; + # if(match(prev, "\\|\\| *$")) complain = 0; + # if(match(prev, "[\",=><] *$")) complain = 0; + # if(match($0, " <<")) complain = 0; + # if(match(prev, " +for \\(")) complain = 0; + # if(prevodd && match(prevprev, " +for \\(")) complain = 0; + scope_or_label_pattern = r'\s*\w+\s*:\s*\\?$' + classinfo = nesting_state.InnermostClass() + initial_spaces = 0 + cleansed_line = clean_lines.elided[linenum] + while initial_spaces < len(line) and line[initial_spaces] == ' ': + initial_spaces += 1 + if line and line[-1].isspace(): + error(filename, linenum, 'whitespace/end_of_line', 4, + 'Line ends in whitespace. Consider deleting these extra spaces.') + # There are certain situations we allow one space, notably for + # section labels, and also lines containing multi-line raw strings. + elif ((initial_spaces == 1 or initial_spaces == 3) and + not Match(scope_or_label_pattern, cleansed_line) and + not (clean_lines.raw_lines[linenum] != line and + Match(r'^\s*""', line))): + error(filename, linenum, 'whitespace/indent', 3, + 'Weird number of spaces at line-start. ' + 'Are you using a 2-space indent?') + + # Check if the line is a header guard. + is_header_guard = False + if file_extension == 'h': + cppvar = GetHeaderGuardCPPVariable(filename) + if (line.startswith('#ifndef %s' % cppvar) or + line.startswith('#define %s' % cppvar) or + line.startswith('#endif // %s' % cppvar)): + is_header_guard = True + # #include lines and header guards can be long, since there's no clean way to + # split them. + # + # URLs can be long too. It's possible to split these, but it makes them + # harder to cut&paste. + # + # The "$Id:...$" comment may also get very long without it being the + # developers fault. + if (not line.startswith('#include') and not is_header_guard and + not Match(r'^\s*//.*http(s?)://\S*$', line) and + not Match(r'^// \$Id:.*#[0-9]+ \$$', line)): + line_width = GetLineWidth(line) + extended_length = int((_line_length * 1.25)) + if line_width > extended_length: + error(filename, linenum, 'whitespace/line_length', 4, + 'Lines should very rarely be longer than %i characters' % + extended_length) + elif line_width > _line_length: + error(filename, linenum, 'whitespace/line_length', 2, + 'Lines should be <= %i characters long' % _line_length) + + if (cleansed_line.count(';') > 1 and + # for loops are allowed two ;'s (and may run over two lines). + cleansed_line.find('for') == -1 and + (GetPreviousNonBlankLine(clean_lines, linenum)[0].find('for') == -1 or + GetPreviousNonBlankLine(clean_lines, linenum)[0].find(';') != -1) and + # It's ok to have many commands in a switch case that fits in 1 line + not ((cleansed_line.find('case ') != -1 or + cleansed_line.find('default:') != -1) and + cleansed_line.find('break;') != -1)): + error(filename, linenum, 'whitespace/newline', 0, + 'More than one command on the same line') + + # Some more style checks + CheckBraces(filename, clean_lines, linenum, error) + CheckTrailingSemicolon(filename, clean_lines, linenum, error) + CheckEmptyBlockBody(filename, clean_lines, linenum, error) + CheckAccess(filename, clean_lines, linenum, nesting_state, error) + CheckSpacing(filename, clean_lines, linenum, nesting_state, error) + CheckOperatorSpacing(filename, clean_lines, linenum, error) + CheckParenthesisSpacing(filename, clean_lines, linenum, error) + CheckCommaSpacing(filename, clean_lines, linenum, error) + CheckBracesSpacing(filename, clean_lines, linenum, error) + CheckSpacingForFunctionCall(filename, clean_lines, linenum, error) + CheckRValueReference(filename, clean_lines, linenum, nesting_state, error) + CheckCheck(filename, clean_lines, linenum, error) + CheckAltTokens(filename, clean_lines, linenum, error) + classinfo = nesting_state.InnermostClass() + if classinfo: + CheckSectionSpacing(filename, clean_lines, classinfo, linenum, error) + + +_RE_PATTERN_INCLUDE = re.compile(r'^\s*#\s*include\s*([<"])([^>"]*)[>"].*$') +# Matches the first component of a filename delimited by -s and _s. That is: +# _RE_FIRST_COMPONENT.match('foo').group(0) == 'foo' +# _RE_FIRST_COMPONENT.match('foo.cc').group(0) == 'foo' +# _RE_FIRST_COMPONENT.match('foo-bar_baz.cc').group(0) == 'foo' +# _RE_FIRST_COMPONENT.match('foo_bar-baz.cc').group(0) == 'foo' +_RE_FIRST_COMPONENT = re.compile(r'^[^-_.]+') + + +def _DropCommonSuffixes(filename): + """Drops common suffixes like _test.cc or -inl.h from filename. + + For example: + >>> _DropCommonSuffixes('foo/foo-inl.h') + 'foo/foo' + >>> _DropCommonSuffixes('foo/bar/foo.cc') + 'foo/bar/foo' + >>> _DropCommonSuffixes('foo/foo_internal.h') + 'foo/foo' + >>> _DropCommonSuffixes('foo/foo_unusualinternal.h') + 'foo/foo_unusualinternal' + + Args: + filename: The input filename. + + Returns: + The filename with the common suffix removed. + """ + for suffix in ('test.cc', 'regtest.cc', 'unittest.cc', + 'inl.h', 'impl.h', 'internal.h'): + if (filename.endswith(suffix) and len(filename) > len(suffix) and + filename[-len(suffix) - 1] in ('-', '_')): + return filename[:-len(suffix) - 1] + return os.path.splitext(filename)[0] + + +def _IsTestFilename(filename): + """Determines if the given filename has a suffix that identifies it as a test. + + Args: + filename: The input filename. + + Returns: + True if 'filename' looks like a test, False otherwise. + """ + if (filename.endswith('_test.cc') or + filename.endswith('_unittest.cc') or + filename.endswith('_regtest.cc')): + return True + else: + return False + + +def _ClassifyInclude(fileinfo, include, is_system): + """Figures out what kind of header 'include' is. + + Args: + fileinfo: The current file cpplint is running over. A FileInfo instance. + include: The path to a #included file. + is_system: True if the #include used <> rather than "". + + Returns: + One of the _XXX_HEADER constants. + + For example: + >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'stdio.h', True) + _C_SYS_HEADER + >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'string', True) + _CPP_SYS_HEADER + >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/foo.h', False) + _LIKELY_MY_HEADER + >>> _ClassifyInclude(FileInfo('foo/foo_unknown_extension.cc'), + ... 'bar/foo_other_ext.h', False) + _POSSIBLE_MY_HEADER + >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/bar.h', False) + _OTHER_HEADER + """ + # This is a list of all standard c++ header files, except + # those already checked for above. + is_cpp_h = include in _CPP_HEADERS + + if is_system: + if is_cpp_h: + return _CPP_SYS_HEADER + else: + return _C_SYS_HEADER + + # If the target file and the include we're checking share a + # basename when we drop common extensions, and the include + # lives in . , then it's likely to be owned by the target file. + target_dir, target_base = ( + os.path.split(_DropCommonSuffixes(fileinfo.RepositoryName()))) + include_dir, include_base = os.path.split(_DropCommonSuffixes(include)) + if target_base == include_base and ( + include_dir == target_dir or + include_dir == os.path.normpath(target_dir + '/../public')): + return _LIKELY_MY_HEADER + + # If the target and include share some initial basename + # component, it's possible the target is implementing the + # include, so it's allowed to be first, but we'll never + # complain if it's not there. + target_first_component = _RE_FIRST_COMPONENT.match(target_base) + include_first_component = _RE_FIRST_COMPONENT.match(include_base) + if (target_first_component and include_first_component and + target_first_component.group(0) == + include_first_component.group(0)): + return _POSSIBLE_MY_HEADER + + return _OTHER_HEADER + + + +def CheckIncludeLine(filename, clean_lines, linenum, include_state, error): + """Check rules that are applicable to #include lines. + + Strings on #include lines are NOT removed from elided line, to make + certain tasks easier. However, to prevent false positives, checks + applicable to #include lines in CheckLanguage must be put here. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + include_state: An _IncludeState instance in which the headers are inserted. + error: The function to call with any errors found. + """ + fileinfo = FileInfo(filename) + line = clean_lines.lines[linenum] + + # "include" should use the new style "foo/bar.h" instead of just "bar.h" + # Only do this check if the included header follows google naming + # conventions. If not, assume that it's a 3rd party API that + # requires special include conventions. + # + # We also make an exception for Lua headers, which follow google + # naming convention but not the include convention. + match = Match(r'#include\s*"([^/]+\.h)"', line) + if match and not _THIRD_PARTY_HEADERS_PATTERN.match(match.group(1)): + error(filename, linenum, 'build/include', 4, + 'Include the directory when naming .h files') + + # we shouldn't include a file more than once. actually, there are a + # handful of instances where doing so is okay, but in general it's + # not. + match = _RE_PATTERN_INCLUDE.search(line) + if match: + include = match.group(2) + is_system = (match.group(1) == '<') + duplicate_line = include_state.FindHeader(include) + if duplicate_line >= 0: + error(filename, linenum, 'build/include', 4, + '"%s" already included at %s:%s' % + (include, filename, duplicate_line)) + elif (include.endswith('.cc') and + os.path.dirname(fileinfo.RepositoryName()) != os.path.dirname(include)): + error(filename, linenum, 'build/include', 4, + 'Do not include .cc files from other packages') + elif not _THIRD_PARTY_HEADERS_PATTERN.match(include): + include_state.include_list[-1].append((include, linenum)) + + # We want to ensure that headers appear in the right order: + # 1) for foo.cc, foo.h (preferred location) + # 2) c system files + # 3) cpp system files + # 4) for foo.cc, foo.h (deprecated location) + # 5) other google headers + # + # We classify each include statement as one of those 5 types + # using a number of techniques. The include_state object keeps + # track of the highest type seen, and complains if we see a + # lower type after that. + error_message = include_state.CheckNextIncludeOrder( + _ClassifyInclude(fileinfo, include, is_system)) + if error_message: + error(filename, linenum, 'build/include_order', 4, + '%s. Should be: %s.h, c system, c++ system, other.' % + (error_message, fileinfo.BaseName())) + canonical_include = include_state.CanonicalizeAlphabeticalOrder(include) + if not include_state.IsInAlphabeticalOrder( + clean_lines, linenum, canonical_include): + error(filename, linenum, 'build/include_alpha', 4, + 'Include "%s" not in alphabetical order' % include) + include_state.SetLastHeader(canonical_include) + + + +def _GetTextInside(text, start_pattern): + r"""Retrieves all the text between matching open and close parentheses. + + Given a string of lines and a regular expression string, retrieve all the text + following the expression and between opening punctuation symbols like + (, [, or {, and the matching close-punctuation symbol. This properly nested + occurrences of the punctuations, so for the text like + printf(a(), b(c())); + a call to _GetTextInside(text, r'printf\(') will return 'a(), b(c())'. + start_pattern must match string having an open punctuation symbol at the end. + + Args: + text: The lines to extract text. Its comments and strings must be elided. + It can be single line and can span multiple lines. + start_pattern: The regexp string indicating where to start extracting + the text. + Returns: + The extracted text. + None if either the opening string or ending punctuation could not be found. + """ + # TODO(unknown): Audit cpplint.py to see what places could be profitably + # rewritten to use _GetTextInside (and use inferior regexp matching today). + + # Give opening punctuations to get the matching close-punctuations. + matching_punctuation = {'(': ')', '{': '}', '[': ']'} + closing_punctuation = set(matching_punctuation.itervalues()) + + # Find the position to start extracting text. + match = re.search(start_pattern, text, re.M) + if not match: # start_pattern not found in text. + return None + start_position = match.end(0) + + assert start_position > 0, ( + 'start_pattern must ends with an opening punctuation.') + assert text[start_position - 1] in matching_punctuation, ( + 'start_pattern must ends with an opening punctuation.') + # Stack of closing punctuations we expect to have in text after position. + punctuation_stack = [matching_punctuation[text[start_position - 1]]] + position = start_position + while punctuation_stack and position < len(text): + if text[position] == punctuation_stack[-1]: + punctuation_stack.pop() + elif text[position] in closing_punctuation: + # A closing punctuation without matching opening punctuations. + return None + elif text[position] in matching_punctuation: + punctuation_stack.append(matching_punctuation[text[position]]) + position += 1 + if punctuation_stack: + # Opening punctuations left without matching close-punctuations. + return None + # punctuations match. + return text[start_position:position - 1] + + +# Patterns for matching call-by-reference parameters. +# +# Supports nested templates up to 2 levels deep using this messy pattern: +# < (?: < (?: < [^<>]* +# > +# | [^<>] )* +# > +# | [^<>] )* +# > +_RE_PATTERN_IDENT = r'[_a-zA-Z]\w*' # =~ [[:alpha:]][[:alnum:]]* +_RE_PATTERN_TYPE = ( + r'(?:const\s+)?(?:typename\s+|class\s+|struct\s+|union\s+|enum\s+)?' + r'(?:\w|' + r'\s*<(?:<(?:<[^<>]*>|[^<>])*>|[^<>])*>|' + r'::)+') +# A call-by-reference parameter ends with '& identifier'. +_RE_PATTERN_REF_PARAM = re.compile( + r'(' + _RE_PATTERN_TYPE + r'(?:\s*(?:\bconst\b|[*]))*\s*' + r'&\s*' + _RE_PATTERN_IDENT + r')\s*(?:=[^,()]+)?[,)]') +# A call-by-const-reference parameter either ends with 'const& identifier' +# or looks like 'const type& identifier' when 'type' is atomic. +_RE_PATTERN_CONST_REF_PARAM = ( + r'(?:.*\s*\bconst\s*&\s*' + _RE_PATTERN_IDENT + + r'|const\s+' + _RE_PATTERN_TYPE + r'\s*&\s*' + _RE_PATTERN_IDENT + r')') + + +def CheckLanguage(filename, clean_lines, linenum, file_extension, + include_state, nesting_state, error): + """Checks rules from the 'C++ language rules' section of cppguide.html. + + Some of these rules are hard to test (function overloading, using + uint32 inappropriately), but we do the best we can. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + file_extension: The extension (without the dot) of the filename. + include_state: An _IncludeState instance in which the headers are inserted. + nesting_state: A NestingState instance which maintains information about + the current stack of nested blocks being parsed. + error: The function to call with any errors found. + """ + # If the line is empty or consists of entirely a comment, no need to + # check it. + line = clean_lines.elided[linenum] + if not line: + return + + match = _RE_PATTERN_INCLUDE.search(line) + if match: + CheckIncludeLine(filename, clean_lines, linenum, include_state, error) + return + + # Reset include state across preprocessor directives. This is meant + # to silence warnings for conditional includes. + match = Match(r'^\s*#\s*(if|ifdef|ifndef|elif|else|endif)\b', line) + if match: + include_state.ResetSection(match.group(1)) + + # Make Windows paths like Unix. + fullname = os.path.abspath(filename).replace('\\', '/') + + # Perform other checks now that we are sure that this is not an include line + CheckCasts(filename, clean_lines, linenum, error) + CheckGlobalStatic(filename, clean_lines, linenum, error) + CheckPrintf(filename, clean_lines, linenum, error) + + if file_extension == 'h': + # TODO(unknown): check that 1-arg constructors are explicit. + # How to tell it's a constructor? + # (handled in CheckForNonStandardConstructs for now) + # TODO(unknown): check that classes declare or disable copy/assign + # (level 1 error) + pass + + # Check if people are using the verboten C basic types. The only exception + # we regularly allow is "unsigned short port" for port. + if Search(r'\bshort port\b', line): + if not Search(r'\bunsigned short port\b', line): + error(filename, linenum, 'runtime/int', 4, + 'Use "unsigned short" for ports, not "short"') + else: + match = Search(r'\b(short|long(?! +double)|long long)\b', line) + if match: + error(filename, linenum, 'runtime/int', 4, + 'Use int16/int64/etc, rather than the C type %s' % match.group(1)) + + # Check if some verboten operator overloading is going on + # TODO(unknown): catch out-of-line unary operator&: + # class X {}; + # int operator&(const X& x) { return 42; } // unary operator& + # The trick is it's hard to tell apart from binary operator&: + # class Y { int operator&(const Y& x) { return 23; } }; // binary operator& + if Search(r'\boperator\s*&\s*\(\s*\)', line): + error(filename, linenum, 'runtime/operator', 4, + 'Unary operator& is dangerous. Do not use it.') + + # Check for suspicious usage of "if" like + # } if (a == b) { + if Search(r'\}\s*if\s*\(', line): + error(filename, linenum, 'readability/braces', 4, + 'Did you mean "else if"? If not, start a new line for "if".') + + # Check for potential format string bugs like printf(foo). + # We constrain the pattern not to pick things like DocidForPrintf(foo). + # Not perfect but it can catch printf(foo.c_str()) and printf(foo->c_str()) + # TODO(unknown): Catch the following case. Need to change the calling + # convention of the whole function to process multiple line to handle it. + # printf( + # boy_this_is_a_really_long_variable_that_cannot_fit_on_the_prev_line); + printf_args = _GetTextInside(line, r'(?i)\b(string)?printf\s*\(') + if printf_args: + match = Match(r'([\w.\->()]+)$', printf_args) + if match and match.group(1) != '__VA_ARGS__': + function_name = re.search(r'\b((?:string)?printf)\s*\(', + line, re.I).group(1) + error(filename, linenum, 'runtime/printf', 4, + 'Potential format string bug. Do %s("%%s", %s) instead.' + % (function_name, match.group(1))) + + # Check for potential memset bugs like memset(buf, sizeof(buf), 0). + match = Search(r'memset\s*\(([^,]*),\s*([^,]*),\s*0\s*\)', line) + if match and not Match(r"^''|-?[0-9]+|0x[0-9A-Fa-f]$", match.group(2)): + error(filename, linenum, 'runtime/memset', 4, + 'Did you mean "memset(%s, 0, %s)"?' + % (match.group(1), match.group(2))) + + if Search(r'\busing namespace\b', line): + error(filename, linenum, 'build/namespaces', 5, + 'Do not use namespace using-directives. ' + 'Use using-declarations instead.') + + # Detect variable-length arrays. + match = Match(r'\s*(.+::)?(\w+) [a-z]\w*\[(.+)];', line) + if (match and match.group(2) != 'return' and match.group(2) != 'delete' and + match.group(3).find(']') == -1): + # Split the size using space and arithmetic operators as delimiters. + # If any of the resulting tokens are not compile time constants then + # report the error. + tokens = re.split(r'\s|\+|\-|\*|\/|<<|>>]', match.group(3)) + is_const = True + skip_next = False + for tok in tokens: + if skip_next: + skip_next = False + continue + + if Search(r'sizeof\(.+\)', tok): continue + if Search(r'arraysize\(\w+\)', tok): continue + + tok = tok.lstrip('(') + tok = tok.rstrip(')') + if not tok: continue + if Match(r'\d+', tok): continue + if Match(r'0[xX][0-9a-fA-F]+', tok): continue + if Match(r'k[A-Z0-9]\w*', tok): continue + if Match(r'(.+::)?k[A-Z0-9]\w*', tok): continue + if Match(r'(.+::)?[A-Z][A-Z0-9_]*', tok): continue + # A catch all for tricky sizeof cases, including 'sizeof expression', + # 'sizeof(*type)', 'sizeof(const type)', 'sizeof(struct StructName)' + # requires skipping the next token because we split on ' ' and '*'. + if tok.startswith('sizeof'): + skip_next = True + continue + is_const = False + break + if not is_const: + error(filename, linenum, 'runtime/arrays', 1, + 'Do not use variable-length arrays. Use an appropriately named ' + "('k' followed by CamelCase) compile-time constant for the size.") + + # Check for use of unnamed namespaces in header files. Registration + # macros are typically OK, so we allow use of "namespace {" on lines + # that end with backslashes. + if (file_extension == 'h' + and Search(r'\bnamespace\s*{', line) + and line[-1] != '\\'): + error(filename, linenum, 'build/namespaces', 4, + 'Do not use unnamed namespaces in header files. See ' + 'http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Namespaces' + ' for more information.') + + +def CheckGlobalStatic(filename, clean_lines, linenum, error): + """Check for unsafe global or static objects. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # Match two lines at a time to support multiline declarations + if linenum + 1 < clean_lines.NumLines() and not Search(r'[;({]', line): + line += clean_lines.elided[linenum + 1].strip() + + # Check for people declaring static/global STL strings at the top level. + # This is dangerous because the C++ language does not guarantee that + # globals with constructors are initialized before the first access. + match = Match( + r'((?:|static +)(?:|const +))string +([a-zA-Z0-9_:]+)\b(.*)', + line) + + # Remove false positives: + # - String pointers (as opposed to values). + # string *pointer + # const string *pointer + # string const *pointer + # string *const pointer + # + # - Functions and template specializations. + # string Function(... + # string Class::Method(... + # + # - Operators. These are matched separately because operator names + # cross non-word boundaries, and trying to match both operators + # and functions at the same time would decrease accuracy of + # matching identifiers. + # string Class::operator*() + if (match and + not Search(r'\bstring\b(\s+const)?\s*\*\s*(const\s+)?\w', line) and + not Search(r'\boperator\W', line) and + not Match(r'\s*(<.*>)?(::[a-zA-Z0-9_]+)*\s*\(([^"]|$)', match.group(3))): + error(filename, linenum, 'runtime/string', 4, + 'For a static/global string constant, use a C style string instead: ' + '"%schar %s[]".' % + (match.group(1), match.group(2))) + + if Search(r'\b([A-Za-z0-9_]*_)\(\1\)', line): + error(filename, linenum, 'runtime/init', 4, + 'You seem to be initializing a member variable with itself.') + + +def CheckPrintf(filename, clean_lines, linenum, error): + """Check for printf related issues. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # When snprintf is used, the second argument shouldn't be a literal. + match = Search(r'snprintf\s*\(([^,]*),\s*([0-9]*)\s*,', line) + if match and match.group(2) != '0': + # If 2nd arg is zero, snprintf is used to calculate size. + error(filename, linenum, 'runtime/printf', 3, + 'If you can, use sizeof(%s) instead of %s as the 2nd arg ' + 'to snprintf.' % (match.group(1), match.group(2))) + + # Check if some verboten C functions are being used. + if Search(r'\bsprintf\s*\(', line): + error(filename, linenum, 'runtime/printf', 5, + 'Never use sprintf. Use snprintf instead.') + match = Search(r'\b(strcpy|strcat)\s*\(', line) + if match: + error(filename, linenum, 'runtime/printf', 4, + 'Almost always, snprintf is better than %s' % match.group(1)) + + +def IsDerivedFunction(clean_lines, linenum): + """Check if current line contains an inherited function. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + Returns: + True if current line contains a function with "override" + virt-specifier. + """ + # Scan back a few lines for start of current function + for i in xrange(linenum, max(-1, linenum - 10), -1): + match = Match(r'^([^()]*\w+)\(', clean_lines.elided[i]) + if match: + # Look for "override" after the matching closing parenthesis + line, _, closing_paren = CloseExpression( + clean_lines, i, len(match.group(1))) + return (closing_paren >= 0 and + Search(r'\boverride\b', line[closing_paren:])) + return False + + +def IsOutOfLineMethodDefinition(clean_lines, linenum): + """Check if current line contains an out-of-line method definition. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + Returns: + True if current line contains an out-of-line method definition. + """ + # Scan back a few lines for start of current function + for i in xrange(linenum, max(-1, linenum - 10), -1): + if Match(r'^([^()]*\w+)\(', clean_lines.elided[i]): + return Match(r'^[^()]*\w+::\w+\(', clean_lines.elided[i]) is not None + return False + + +def IsInitializerList(clean_lines, linenum): + """Check if current line is inside constructor initializer list. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + Returns: + True if current line appears to be inside constructor initializer + list, False otherwise. + """ + for i in xrange(linenum, 1, -1): + line = clean_lines.elided[i] + if i == linenum: + remove_function_body = Match(r'^(.*)\{\s*$', line) + if remove_function_body: + line = remove_function_body.group(1) + + if Search(r'\s:\s*\w+[({]', line): + # A lone colon tend to indicate the start of a constructor + # initializer list. It could also be a ternary operator, which + # also tend to appear in constructor initializer lists as + # opposed to parameter lists. + return True + if Search(r'\}\s*,\s*$', line): + # A closing brace followed by a comma is probably the end of a + # brace-initialized member in constructor initializer list. + return True + if Search(r'[{};]\s*$', line): + # Found one of the following: + # - A closing brace or semicolon, probably the end of the previous + # function. + # - An opening brace, probably the start of current class or namespace. + # + # Current line is probably not inside an initializer list since + # we saw one of those things without seeing the starting colon. + return False + + # Got to the beginning of the file without seeing the start of + # constructor initializer list. + return False + + +def CheckForNonConstReference(filename, clean_lines, linenum, + nesting_state, error): + """Check for non-const references. + + Separate from CheckLanguage since it scans backwards from current + line, instead of scanning forward. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + nesting_state: A NestingState instance which maintains information about + the current stack of nested blocks being parsed. + error: The function to call with any errors found. + """ + # Do nothing if there is no '&' on current line. + line = clean_lines.elided[linenum] + if '&' not in line: + return + + # If a function is inherited, current function doesn't have much of + # a choice, so any non-const references should not be blamed on + # derived function. + if IsDerivedFunction(clean_lines, linenum): + return + + # Don't warn on out-of-line method definitions, as we would warn on the + # in-line declaration, if it isn't marked with 'override'. + if IsOutOfLineMethodDefinition(clean_lines, linenum): + return + + # Long type names may be broken across multiple lines, usually in one + # of these forms: + # LongType + # ::LongTypeContinued &identifier + # LongType:: + # LongTypeContinued &identifier + # LongType< + # ...>::LongTypeContinued &identifier + # + # If we detected a type split across two lines, join the previous + # line to current line so that we can match const references + # accordingly. + # + # Note that this only scans back one line, since scanning back + # arbitrary number of lines would be expensive. If you have a type + # that spans more than 2 lines, please use a typedef. + if linenum > 1: + previous = None + if Match(r'\s*::(?:[\w<>]|::)+\s*&\s*\S', line): + # previous_line\n + ::current_line + previous = Search(r'\b((?:const\s*)?(?:[\w<>]|::)+[\w<>])\s*$', + clean_lines.elided[linenum - 1]) + elif Match(r'\s*[a-zA-Z_]([\w<>]|::)+\s*&\s*\S', line): + # previous_line::\n + current_line + previous = Search(r'\b((?:const\s*)?(?:[\w<>]|::)+::)\s*$', + clean_lines.elided[linenum - 1]) + if previous: + line = previous.group(1) + line.lstrip() + else: + # Check for templated parameter that is split across multiple lines + endpos = line.rfind('>') + if endpos > -1: + (_, startline, startpos) = ReverseCloseExpression( + clean_lines, linenum, endpos) + if startpos > -1 and startline < linenum: + # Found the matching < on an earlier line, collect all + # pieces up to current line. + line = '' + for i in xrange(startline, linenum + 1): + line += clean_lines.elided[i].strip() + + # Check for non-const references in function parameters. A single '&' may + # found in the following places: + # inside expression: binary & for bitwise AND + # inside expression: unary & for taking the address of something + # inside declarators: reference parameter + # We will exclude the first two cases by checking that we are not inside a + # function body, including one that was just introduced by a trailing '{'. + # TODO(unknown): Doesn't account for 'catch(Exception& e)' [rare]. + if (nesting_state.previous_stack_top and + not (isinstance(nesting_state.previous_stack_top, _ClassInfo) or + isinstance(nesting_state.previous_stack_top, _NamespaceInfo))): + # Not at toplevel, not within a class, and not within a namespace + return + + # Avoid initializer lists. We only need to scan back from the + # current line for something that starts with ':'. + # + # We don't need to check the current line, since the '&' would + # appear inside the second set of parentheses on the current line as + # opposed to the first set. + if linenum > 0: + for i in xrange(linenum - 1, max(0, linenum - 10), -1): + previous_line = clean_lines.elided[i] + if not Search(r'[),]\s*$', previous_line): + break + if Match(r'^\s*:\s+\S', previous_line): + return + + # Avoid preprocessors + if Search(r'\\\s*$', line): + return + + # Avoid constructor initializer lists + if IsInitializerList(clean_lines, linenum): + return + + # We allow non-const references in a few standard places, like functions + # called "swap()" or iostream operators like "<<" or ">>". Do not check + # those function parameters. + # + # We also accept & in static_assert, which looks like a function but + # it's actually a declaration expression. + whitelisted_functions = (r'(?:[sS]wap(?:<\w:+>)?|' + r'operator\s*[<>][<>]|' + r'static_assert|COMPILE_ASSERT' + r')\s*\(') + if Search(whitelisted_functions, line): + return + elif not Search(r'\S+\([^)]*$', line): + # Don't see a whitelisted function on this line. Actually we + # didn't see any function name on this line, so this is likely a + # multi-line parameter list. Try a bit harder to catch this case. + for i in xrange(2): + if (linenum > i and + Search(whitelisted_functions, clean_lines.elided[linenum - i - 1])): + return + + decls = ReplaceAll(r'{[^}]*}', ' ', line) # exclude function body + for parameter in re.findall(_RE_PATTERN_REF_PARAM, decls): + if not Match(_RE_PATTERN_CONST_REF_PARAM, parameter): + error(filename, linenum, 'runtime/references', 2, + 'Is this a non-const reference? ' + 'If so, make const or use a pointer: ' + + ReplaceAll(' *<', '<', parameter)) + + +def CheckCasts(filename, clean_lines, linenum, error): + """Various cast related checks. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # Check to see if they're using an conversion function cast. + # I just try to capture the most common basic types, though there are more. + # Parameterless conversion functions, such as bool(), are allowed as they are + # probably a member operator declaration or default constructor. + match = Search( + r'(\bnew\s+|\S<\s*(?:const\s+)?)?\b' + r'(int|float|double|bool|char|int32|uint32|int64|uint64)' + r'(\([^)].*)', line) + expecting_function = ExpectingFunctionArgs(clean_lines, linenum) + if match and not expecting_function: + matched_type = match.group(2) + + # matched_new_or_template is used to silence two false positives: + # - New operators + # - Template arguments with function types + # + # For template arguments, we match on types immediately following + # an opening bracket without any spaces. This is a fast way to + # silence the common case where the function type is the first + # template argument. False negative with less-than comparison is + # avoided because those operators are usually followed by a space. + # + # function // bracket + no space = false positive + # value < double(42) // bracket + space = true positive + matched_new_or_template = match.group(1) + + # Avoid arrays by looking for brackets that come after the closing + # parenthesis. + if Match(r'\([^()]+\)\s*\[', match.group(3)): + return + + # Other things to ignore: + # - Function pointers + # - Casts to pointer types + # - Placement new + # - Alias declarations + matched_funcptr = match.group(3) + if (matched_new_or_template is None and + not (matched_funcptr and + (Match(r'\((?:[^() ]+::\s*\*\s*)?[^() ]+\)\s*\(', + matched_funcptr) or + matched_funcptr.startswith('(*)'))) and + not Match(r'\s*using\s+\S+\s*=\s*' + matched_type, line) and + not Search(r'new\(\S+\)\s*' + matched_type, line)): + error(filename, linenum, 'readability/casting', 4, + 'Using deprecated casting style. ' + 'Use static_cast<%s>(...) instead' % + matched_type) + + if not expecting_function: + CheckCStyleCast(filename, clean_lines, linenum, 'static_cast', + r'\((int|float|double|bool|char|u?int(16|32|64))\)', error) + + # This doesn't catch all cases. Consider (const char * const)"hello". + # + # (char *) "foo" should always be a const_cast (reinterpret_cast won't + # compile). + if CheckCStyleCast(filename, clean_lines, linenum, 'const_cast', + r'\((char\s?\*+\s?)\)\s*"', error): + pass + else: + # Check pointer casts for other than string constants + CheckCStyleCast(filename, clean_lines, linenum, 'reinterpret_cast', + r'\((\w+\s?\*+\s?)\)', error) + + # In addition, we look for people taking the address of a cast. This + # is dangerous -- casts can assign to temporaries, so the pointer doesn't + # point where you think. + # + # Some non-identifier character is required before the '&' for the + # expression to be recognized as a cast. These are casts: + # expression = &static_cast(temporary()); + # function(&(int*)(temporary())); + # + # This is not a cast: + # reference_type&(int* function_param); + match = Search( + r'(?:[^\w]&\(([^)*][^)]*)\)[\w(])|' + r'(?:[^\w]&(static|dynamic|down|reinterpret)_cast\b)', line) + if match: + # Try a better error message when the & is bound to something + # dereferenced by the casted pointer, as opposed to the casted + # pointer itself. + parenthesis_error = False + match = Match(r'^(.*&(?:static|dynamic|down|reinterpret)_cast\b)<', line) + if match: + _, y1, x1 = CloseExpression(clean_lines, linenum, len(match.group(1))) + if x1 >= 0 and clean_lines.elided[y1][x1] == '(': + _, y2, x2 = CloseExpression(clean_lines, y1, x1) + if x2 >= 0: + extended_line = clean_lines.elided[y2][x2:] + if y2 < clean_lines.NumLines() - 1: + extended_line += clean_lines.elided[y2 + 1] + if Match(r'\s*(?:->|\[)', extended_line): + parenthesis_error = True + + if parenthesis_error: + error(filename, linenum, 'readability/casting', 4, + ('Are you taking an address of something dereferenced ' + 'from a cast? Wrapping the dereferenced expression in ' + 'parentheses will make the binding more obvious')) + else: + error(filename, linenum, 'runtime/casting', 4, + ('Are you taking an address of a cast? ' + 'This is dangerous: could be a temp var. ' + 'Take the address before doing the cast, rather than after')) + + +def CheckCStyleCast(filename, clean_lines, linenum, cast_type, pattern, error): + """Checks for a C-style cast by looking for the pattern. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + cast_type: The string for the C++ cast to recommend. This is either + reinterpret_cast, static_cast, or const_cast, depending. + pattern: The regular expression used to find C-style casts. + error: The function to call with any errors found. + + Returns: + True if an error was emitted. + False otherwise. + """ + line = clean_lines.elided[linenum] + match = Search(pattern, line) + if not match: + return False + + # Exclude lines with keywords that tend to look like casts + context = line[0:match.start(1) - 1] + if Match(r'.*\b(?:sizeof|alignof|alignas|[_A-Z][_A-Z0-9]*)\s*$', context): + return False + + # Try expanding current context to see if we one level of + # parentheses inside a macro. + if linenum > 0: + for i in xrange(linenum - 1, max(0, linenum - 5), -1): + context = clean_lines.elided[i] + context + if Match(r'.*\b[_A-Z][_A-Z0-9]*\s*\((?:\([^()]*\)|[^()])*$', context): + return False + + # operator++(int) and operator--(int) + if context.endswith(' operator++') or context.endswith(' operator--'): + return False + + # A single unnamed argument for a function tends to look like old + # style cast. If we see those, don't issue warnings for deprecated + # casts, instead issue warnings for unnamed arguments where + # appropriate. + # + # These are things that we want warnings for, since the style guide + # explicitly require all parameters to be named: + # Function(int); + # Function(int) { + # ConstMember(int) const; + # ConstMember(int) const { + # ExceptionMember(int) throw (...); + # ExceptionMember(int) throw (...) { + # PureVirtual(int) = 0; + # [](int) -> bool { + # + # These are functions of some sort, where the compiler would be fine + # if they had named parameters, but people often omit those + # identifiers to reduce clutter: + # (FunctionPointer)(int); + # (FunctionPointer)(int) = value; + # Function((function_pointer_arg)(int)) + # Function((function_pointer_arg)(int), int param) + # ; + # <(FunctionPointerTemplateArgument)(int)>; + remainder = line[match.end(0):] + if Match(r'^\s*(?:;|const\b|throw\b|final\b|override\b|[=>{),]|->)', + remainder): + # Looks like an unnamed parameter. + + # Don't warn on any kind of template arguments. + if Match(r'^\s*>', remainder): + return False + + # Don't warn on assignments to function pointers, but keep warnings for + # unnamed parameters to pure virtual functions. Note that this pattern + # will also pass on assignments of "0" to function pointers, but the + # preferred values for those would be "nullptr" or "NULL". + matched_zero = Match(r'^\s=\s*(\S+)\s*;', remainder) + if matched_zero and matched_zero.group(1) != '0': + return False + + # Don't warn on function pointer declarations. For this we need + # to check what came before the "(type)" string. + if Match(r'.*\)\s*$', line[0:match.start(0)]): + return False + + # Don't warn if the parameter is named with block comments, e.g.: + # Function(int /*unused_param*/); + raw_line = clean_lines.raw_lines[linenum] + if '/*' in raw_line: + return False + + # Passed all filters, issue warning here. + error(filename, linenum, 'readability/function', 3, + 'All parameters should be named in a function') + return True + + # At this point, all that should be left is actual casts. + error(filename, linenum, 'readability/casting', 4, + 'Using C-style cast. Use %s<%s>(...) instead' % + (cast_type, match.group(1))) + + return True + + +def ExpectingFunctionArgs(clean_lines, linenum): + """Checks whether where function type arguments are expected. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + + Returns: + True if the line at 'linenum' is inside something that expects arguments + of function types. + """ + line = clean_lines.elided[linenum] + return (Match(r'^\s*MOCK_(CONST_)?METHOD\d+(_T)?\(', line) or + (linenum >= 2 and + (Match(r'^\s*MOCK_(?:CONST_)?METHOD\d+(?:_T)?\((?:\S+,)?\s*$', + clean_lines.elided[linenum - 1]) or + Match(r'^\s*MOCK_(?:CONST_)?METHOD\d+(?:_T)?\(\s*$', + clean_lines.elided[linenum - 2]) or + Search(r'\bstd::m?function\s*\<\s*$', + clean_lines.elided[linenum - 1])))) + + +_HEADERS_CONTAINING_TEMPLATES = ( + ('', ('deque',)), + ('', ('unary_function', 'binary_function', + 'plus', 'minus', 'multiplies', 'divides', 'modulus', + 'negate', + 'equal_to', 'not_equal_to', 'greater', 'less', + 'greater_equal', 'less_equal', + 'logical_and', 'logical_or', 'logical_not', + 'unary_negate', 'not1', 'binary_negate', 'not2', + 'bind1st', 'bind2nd', + 'pointer_to_unary_function', + 'pointer_to_binary_function', + 'ptr_fun', + 'mem_fun_t', 'mem_fun', 'mem_fun1_t', 'mem_fun1_ref_t', + 'mem_fun_ref_t', + 'const_mem_fun_t', 'const_mem_fun1_t', + 'const_mem_fun_ref_t', 'const_mem_fun1_ref_t', + 'mem_fun_ref', + )), + ('', ('numeric_limits',)), + ('', ('list',)), + ('', ('map', 'multimap',)), + ('', ('allocator',)), + ('', ('queue', 'priority_queue',)), + ('', ('set', 'multiset',)), + ('', ('stack',)), + ('', ('char_traits', 'basic_string',)), + ('', ('tuple',)), + ('', ('pair',)), + ('', ('vector',)), + + # gcc extensions. + # Note: std::hash is their hash, ::hash is our hash + ('', ('hash_map', 'hash_multimap',)), + ('', ('hash_set', 'hash_multiset',)), + ('', ('slist',)), + ) + +_RE_PATTERN_STRING = re.compile(r'\bstring\b') + +_re_pattern_algorithm_header = [] +for _template in ('copy', 'max', 'min', 'min_element', 'sort', 'swap', + 'transform'): + # Match max(..., ...), max(..., ...), but not foo->max, foo.max or + # type::max(). + _re_pattern_algorithm_header.append( + (re.compile(r'[^>.]\b' + _template + r'(<.*?>)?\([^\)]'), + _template, + '')) + +_re_pattern_templates = [] +for _header, _templates in _HEADERS_CONTAINING_TEMPLATES: + for _template in _templates: + _re_pattern_templates.append( + (re.compile(r'(\<|\b)' + _template + r'\s*\<'), + _template + '<>', + _header)) + + +def FilesBelongToSameModule(filename_cc, filename_h): + """Check if these two filenames belong to the same module. + + The concept of a 'module' here is a as follows: + foo.h, foo-inl.h, foo.cc, foo_test.cc and foo_unittest.cc belong to the + same 'module' if they are in the same directory. + some/path/public/xyzzy and some/path/internal/xyzzy are also considered + to belong to the same module here. + + If the filename_cc contains a longer path than the filename_h, for example, + '/absolute/path/to/base/sysinfo.cc', and this file would include + 'base/sysinfo.h', this function also produces the prefix needed to open the + header. This is used by the caller of this function to more robustly open the + header file. We don't have access to the real include paths in this context, + so we need this guesswork here. + + Known bugs: tools/base/bar.cc and base/bar.h belong to the same module + according to this implementation. Because of this, this function gives + some false positives. This should be sufficiently rare in practice. + + Args: + filename_cc: is the path for the .cc file + filename_h: is the path for the header path + + Returns: + Tuple with a bool and a string: + bool: True if filename_cc and filename_h belong to the same module. + string: the additional prefix needed to open the header file. + """ + + if not filename_cc.endswith('.cc'): + return (False, '') + filename_cc = filename_cc[:-len('.cc')] + if filename_cc.endswith('_unittest'): + filename_cc = filename_cc[:-len('_unittest')] + elif filename_cc.endswith('_test'): + filename_cc = filename_cc[:-len('_test')] + filename_cc = filename_cc.replace('/public/', '/') + filename_cc = filename_cc.replace('/internal/', '/') + + if not filename_h.endswith('.h'): + return (False, '') + filename_h = filename_h[:-len('.h')] + if filename_h.endswith('-inl'): + filename_h = filename_h[:-len('-inl')] + filename_h = filename_h.replace('/public/', '/') + filename_h = filename_h.replace('/internal/', '/') + + files_belong_to_same_module = filename_cc.endswith(filename_h) + common_path = '' + if files_belong_to_same_module: + common_path = filename_cc[:-len(filename_h)] + return files_belong_to_same_module, common_path + + +def UpdateIncludeState(filename, include_dict, io=codecs): + """Fill up the include_dict with new includes found from the file. + + Args: + filename: the name of the header to read. + include_dict: a dictionary in which the headers are inserted. + io: The io factory to use to read the file. Provided for testability. + + Returns: + True if a header was successfully added. False otherwise. + """ + headerfile = None + try: + headerfile = io.open(filename, 'r', 'utf8', 'replace') + except IOError: + return False + linenum = 0 + for line in headerfile: + linenum += 1 + clean_line = CleanseComments(line) + match = _RE_PATTERN_INCLUDE.search(clean_line) + if match: + include = match.group(2) + include_dict.setdefault(include, linenum) + return True + + +def CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error, + io=codecs): + """Reports for missing stl includes. + + This function will output warnings to make sure you are including the headers + necessary for the stl containers and functions that you use. We only give one + reason to include a header. For example, if you use both equal_to<> and + less<> in a .h file, only one (the latter in the file) of these will be + reported as a reason to include the . + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + include_state: An _IncludeState instance. + error: The function to call with any errors found. + io: The IO factory to use to read the header file. Provided for unittest + injection. + """ + required = {} # A map of header name to linenumber and the template entity. + # Example of required: { '': (1219, 'less<>') } + + for linenum in xrange(clean_lines.NumLines()): + line = clean_lines.elided[linenum] + if not line or line[0] == '#': + continue + + # String is special -- it is a non-templatized type in STL. + matched = _RE_PATTERN_STRING.search(line) + if matched: + # Don't warn about strings in non-STL namespaces: + # (We check only the first match per line; good enough.) + prefix = line[:matched.start()] + if prefix.endswith('std::') or not prefix.endswith('::'): + required[''] = (linenum, 'string') + + for pattern, template, header in _re_pattern_algorithm_header: + if pattern.search(line): + required[header] = (linenum, template) + + # The following function is just a speed up, no semantics are changed. + if not '<' in line: # Reduces the cpu time usage by skipping lines. + continue + + for pattern, template, header in _re_pattern_templates: + if pattern.search(line): + required[header] = (linenum, template) + + # The policy is that if you #include something in foo.h you don't need to + # include it again in foo.cc. Here, we will look at possible includes. + # Let's flatten the include_state include_list and copy it into a dictionary. + include_dict = dict([item for sublist in include_state.include_list + for item in sublist]) + + # Did we find the header for this file (if any) and successfully load it? + header_found = False + + # Use the absolute path so that matching works properly. + abs_filename = FileInfo(filename).FullName() + + # For Emacs's flymake. + # If cpplint is invoked from Emacs's flymake, a temporary file is generated + # by flymake and that file name might end with '_flymake.cc'. In that case, + # restore original file name here so that the corresponding header file can be + # found. + # e.g. If the file name is 'foo_flymake.cc', we should search for 'foo.h' + # instead of 'foo_flymake.h' + abs_filename = re.sub(r'_flymake\.cc$', '.cc', abs_filename) + + # include_dict is modified during iteration, so we iterate over a copy of + # the keys. + header_keys = include_dict.keys() + for header in header_keys: + (same_module, common_path) = FilesBelongToSameModule(abs_filename, header) + fullpath = common_path + header + if same_module and UpdateIncludeState(fullpath, include_dict, io): + header_found = True + + # If we can't find the header file for a .cc, assume it's because we don't + # know where to look. In that case we'll give up as we're not sure they + # didn't include it in the .h file. + # TODO(unknown): Do a better job of finding .h files so we are confident that + # not having the .h file means there isn't one. + if filename.endswith('.cc') and not header_found: + return + + # All the lines have been processed, report the errors found. + for required_header_unstripped in required: + template = required[required_header_unstripped][1] + if required_header_unstripped.strip('<>"') not in include_dict: + error(filename, required[required_header_unstripped][0], + 'build/include_what_you_use', 4, + 'Add #include ' + required_header_unstripped + ' for ' + template) + + +_RE_PATTERN_EXPLICIT_MAKEPAIR = re.compile(r'\bmake_pair\s*<') + + +def CheckMakePairUsesDeduction(filename, clean_lines, linenum, error): + """Check that make_pair's template arguments are deduced. + + G++ 4.6 in C++11 mode fails badly if make_pair's template arguments are + specified explicitly, and such use isn't intended in any case. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + match = _RE_PATTERN_EXPLICIT_MAKEPAIR.search(line) + if match: + error(filename, linenum, 'build/explicit_make_pair', + 4, # 4 = high confidence + 'For C++11-compatibility, omit template arguments from make_pair' + ' OR use pair directly OR if appropriate, construct a pair directly') + + +def CheckDefaultLambdaCaptures(filename, clean_lines, linenum, error): + """Check that default lambda captures are not used. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # A lambda introducer specifies a default capture if it starts with "[=" + # or if it starts with "[&" _not_ followed by an identifier. + match = Match(r'^(.*)\[\s*(?:=|&[^\w])', line) + if match: + # Found a potential error, check what comes after the lambda-introducer. + # If it's not open parenthesis (for lambda-declarator) or open brace + # (for compound-statement), it's not a lambda. + line, _, pos = CloseExpression(clean_lines, linenum, len(match.group(1))) + if pos >= 0 and Match(r'^\s*[{(]', line[pos:]): + error(filename, linenum, 'build/c++11', + 4, # 4 = high confidence + 'Default lambda captures are an unapproved C++ feature.') + + +def CheckRedundantVirtual(filename, clean_lines, linenum, error): + """Check if line contains a redundant "virtual" function-specifier. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + # Look for "virtual" on current line. + line = clean_lines.elided[linenum] + virtual = Match(r'^(.*)(\bvirtual\b)(.*)$', line) + if not virtual: return + + # Ignore "virtual" keywords that are near access-specifiers. These + # are only used in class base-specifier and do not apply to member + # functions. + if (Search(r'\b(public|protected|private)\s+$', virtual.group(1)) or + Match(r'^\s+(public|protected|private)\b', virtual.group(3))): + return + + # Ignore the "virtual" keyword from virtual base classes. Usually + # there is a column on the same line in these cases (virtual base + # classes are rare in google3 because multiple inheritance is rare). + if Match(r'^.*[^:]:[^:].*$', line): return + + # Look for the next opening parenthesis. This is the start of the + # parameter list (possibly on the next line shortly after virtual). + # TODO(unknown): doesn't work if there are virtual functions with + # decltype() or other things that use parentheses, but csearch suggests + # that this is rare. + end_col = -1 + end_line = -1 + start_col = len(virtual.group(2)) + for start_line in xrange(linenum, min(linenum + 3, clean_lines.NumLines())): + line = clean_lines.elided[start_line][start_col:] + parameter_list = Match(r'^([^(]*)\(', line) + if parameter_list: + # Match parentheses to find the end of the parameter list + (_, end_line, end_col) = CloseExpression( + clean_lines, start_line, start_col + len(parameter_list.group(1))) + break + start_col = 0 + + if end_col < 0: + return # Couldn't find end of parameter list, give up + + # Look for "override" or "final" after the parameter list + # (possibly on the next few lines). + for i in xrange(end_line, min(end_line + 3, clean_lines.NumLines())): + line = clean_lines.elided[i][end_col:] + match = Search(r'\b(override|final)\b', line) + if match: + error(filename, linenum, 'readability/inheritance', 4, + ('"virtual" is redundant since function is ' + 'already declared as "%s"' % match.group(1))) + + # Set end_col to check whole lines after we are done with the + # first line. + end_col = 0 + if Search(r'[^\w]\s*$', line): + break + + +def CheckRedundantOverrideOrFinal(filename, clean_lines, linenum, error): + """Check if line contains a redundant "override" or "final" virt-specifier. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + # Look for closing parenthesis nearby. We need one to confirm where + # the declarator ends and where the virt-specifier starts to avoid + # false positives. + line = clean_lines.elided[linenum] + declarator_end = line.rfind(')') + if declarator_end >= 0: + fragment = line[declarator_end:] + else: + if linenum > 1 and clean_lines.elided[linenum - 1].rfind(')') >= 0: + fragment = line + else: + return + + # Check that at most one of "override" or "final" is present, not both + if Search(r'\boverride\b', fragment) and Search(r'\bfinal\b', fragment): + error(filename, linenum, 'readability/inheritance', 4, + ('"override" is redundant since function is ' + 'already declared as "final"')) + + + + +# Returns true if we are at a new block, and it is directly +# inside of a namespace. +def IsBlockInNameSpace(nesting_state, is_forward_declaration): + """Checks that the new block is directly in a namespace. + + Args: + nesting_state: The _NestingState object that contains info about our state. + is_forward_declaration: If the class is a forward declared class. + Returns: + Whether or not the new block is directly in a namespace. + """ + if is_forward_declaration: + if len(nesting_state.stack) >= 1 and ( + isinstance(nesting_state.stack[-1], _NamespaceInfo)): + return True + else: + return False + + return (len(nesting_state.stack) > 1 and + nesting_state.stack[-1].check_namespace_indentation and + isinstance(nesting_state.stack[-2], _NamespaceInfo)) + + +def ShouldCheckNamespaceIndentation(nesting_state, is_namespace_indent_item, + raw_lines_no_comments, linenum): + """This method determines if we should apply our namespace indentation check. + + Args: + nesting_state: The current nesting state. + is_namespace_indent_item: If we just put a new class on the stack, True. + If the top of the stack is not a class, or we did not recently + add the class, False. + raw_lines_no_comments: The lines without the comments. + linenum: The current line number we are processing. + + Returns: + True if we should apply our namespace indentation check. Currently, it + only works for classes and namespaces inside of a namespace. + """ + + is_forward_declaration = IsForwardClassDeclaration(raw_lines_no_comments, + linenum) + + if not (is_namespace_indent_item or is_forward_declaration): + return False + + # If we are in a macro, we do not want to check the namespace indentation. + if IsMacroDefinition(raw_lines_no_comments, linenum): + return False + + return IsBlockInNameSpace(nesting_state, is_forward_declaration) + + +# Call this method if the line is directly inside of a namespace. +# If the line above is blank (excluding comments) or the start of +# an inner namespace, it cannot be indented. +def CheckItemIndentationInNamespace(filename, raw_lines_no_comments, linenum, + error): + line = raw_lines_no_comments[linenum] + if Match(r'^\s+', line): + error(filename, linenum, 'runtime/indentation_namespace', 4, + 'Do not indent within a namespace') + + +def ProcessLine(filename, file_extension, clean_lines, line, + include_state, function_state, nesting_state, error, + extra_check_functions=[]): + """Processes a single line in the file. + + Args: + filename: Filename of the file that is being processed. + file_extension: The extension (dot not included) of the file. + clean_lines: An array of strings, each representing a line of the file, + with comments stripped. + line: Number of line being processed. + include_state: An _IncludeState instance in which the headers are inserted. + function_state: A _FunctionState instance which counts function lines, etc. + nesting_state: A NestingState instance which maintains information about + the current stack of nested blocks being parsed. + error: A callable to which errors are reported, which takes 4 arguments: + filename, line number, error level, and message + extra_check_functions: An array of additional check functions that will be + run on each source line. Each function takes 4 + arguments: filename, clean_lines, line, error + """ + raw_lines = clean_lines.raw_lines + ParseNolintSuppressions(filename, raw_lines[line], line, error) + nesting_state.Update(filename, clean_lines, line, error) + CheckForNamespaceIndentation(filename, nesting_state, clean_lines, line, + error) + if nesting_state.InAsmBlock(): return + CheckForFunctionLengths(filename, clean_lines, line, function_state, error) + CheckForMultilineCommentsAndStrings(filename, clean_lines, line, error) + CheckStyle(filename, clean_lines, line, file_extension, nesting_state, error) + CheckLanguage(filename, clean_lines, line, file_extension, include_state, + nesting_state, error) + CheckForNonConstReference(filename, clean_lines, line, nesting_state, error) + CheckForNonStandardConstructs(filename, clean_lines, line, + nesting_state, error) + CheckVlogArguments(filename, clean_lines, line, error) + CheckPosixThreading(filename, clean_lines, line, error) + CheckInvalidIncrement(filename, clean_lines, line, error) + CheckMakePairUsesDeduction(filename, clean_lines, line, error) + CheckDefaultLambdaCaptures(filename, clean_lines, line, error) + CheckRedundantVirtual(filename, clean_lines, line, error) + CheckRedundantOverrideOrFinal(filename, clean_lines, line, error) + for check_fn in extra_check_functions: + check_fn(filename, clean_lines, line, error) + +def FlagCxx11Features(filename, clean_lines, linenum, error): + """Flag those c++11 features that we only allow in certain places. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # Flag unapproved C++11 headers. + include = Match(r'\s*#\s*include\s+[<"]([^<"]+)[">]', line) + if include and include.group(1) in ('cfenv', + 'condition_variable', + 'fenv.h', + 'future', + 'mutex', + 'thread', + 'chrono', + 'ratio', + 'regex', + 'system_error', + ): + error(filename, linenum, 'build/c++11', 5, + ('<%s> is an unapproved C++11 header.') % include.group(1)) + + # The only place where we need to worry about C++11 keywords and library + # features in preprocessor directives is in macro definitions. + if Match(r'\s*#', line) and not Match(r'\s*#\s*define\b', line): return + + # These are classes and free functions. The classes are always + # mentioned as std::*, but we only catch the free functions if + # they're not found by ADL. They're alphabetical by header. + for top_name in ( + # type_traits + 'alignment_of', + 'aligned_union', + ): + if Search(r'\bstd::%s\b' % top_name, line): + error(filename, linenum, 'build/c++11', 5, + ('std::%s is an unapproved C++11 class or function. Send c-style ' + 'an example of where it would make your code more readable, and ' + 'they may let you use it.') % top_name) + + +def ProcessFileData(filename, file_extension, lines, error, + extra_check_functions=[]): + """Performs lint checks and reports any errors to the given error function. + + Args: + filename: Filename of the file that is being processed. + file_extension: The extension (dot not included) of the file. + lines: An array of strings, each representing a line of the file, with the + last element being empty if the file is terminated with a newline. + error: A callable to which errors are reported, which takes 4 arguments: + filename, line number, error level, and message + extra_check_functions: An array of additional check functions that will be + run on each source line. Each function takes 4 + arguments: filename, clean_lines, line, error + """ + lines = (['// marker so line numbers and indices both start at 1'] + lines + + ['// marker so line numbers end in a known way']) + + include_state = _IncludeState() + function_state = _FunctionState() + nesting_state = NestingState() + + ResetNolintSuppressions() + + CheckForCopyright(filename, lines, error) + + RemoveMultiLineComments(filename, lines, error) + clean_lines = CleansedLines(lines) + + if file_extension == 'h': + CheckForHeaderGuard(filename, clean_lines, error) + + for line in xrange(clean_lines.NumLines()): + ProcessLine(filename, file_extension, clean_lines, line, + include_state, function_state, nesting_state, error, + extra_check_functions) + FlagCxx11Features(filename, clean_lines, line, error) + nesting_state.CheckCompletedBlocks(filename, error) + + CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error) + + # Check that the .cc file has included its header if it exists. + if file_extension == 'cc': + CheckHeaderFileIncluded(filename, include_state, error) + + # We check here rather than inside ProcessLine so that we see raw + # lines rather than "cleaned" lines. + CheckForBadCharacters(filename, lines, error) + + CheckForNewlineAtEOF(filename, lines, error) + +def ProcessConfigOverrides(filename): + """ Loads the configuration files and processes the config overrides. + + Args: + filename: The name of the file being processed by the linter. + + Returns: + False if the current |filename| should not be processed further. + """ + + abs_filename = os.path.abspath(filename) + cfg_filters = [] + keep_looking = True + while keep_looking: + abs_path, base_name = os.path.split(abs_filename) + if not base_name: + break # Reached the root directory. + + cfg_file = os.path.join(abs_path, "CPPLINT.cfg") + abs_filename = abs_path + if not os.path.isfile(cfg_file): + continue + + try: + with open(cfg_file) as file_handle: + for line in file_handle: + line, _, _ = line.partition('#') # Remove comments. + if not line.strip(): + continue + + name, _, val = line.partition('=') + name = name.strip() + val = val.strip() + if name == 'set noparent': + keep_looking = False + elif name == 'filter': + cfg_filters.append(val) + elif name == 'exclude_files': + # When matching exclude_files pattern, use the base_name of + # the current file name or the directory name we are processing. + # For example, if we are checking for lint errors in /foo/bar/baz.cc + # and we found the .cfg file at /foo/CPPLINT.cfg, then the config + # file's "exclude_files" filter is meant to be checked against "bar" + # and not "baz" nor "bar/baz.cc". + if base_name: + pattern = re.compile(val) + if pattern.match(base_name): + sys.stderr.write('Ignoring "%s": file excluded by "%s". ' + 'File path component "%s" matches ' + 'pattern "%s"\n' % + (filename, cfg_file, base_name, val)) + return False + elif name == 'linelength': + global _line_length + try: + _line_length = int(val) + except ValueError: + sys.stderr.write('Line length must be numeric.') + else: + sys.stderr.write( + 'Invalid configuration option (%s) in file %s\n' % + (name, cfg_file)) + + except IOError: + sys.stderr.write( + "Skipping config file '%s': Can't open for reading\n" % cfg_file) + keep_looking = False + + # Apply all the accumulated filters in reverse order (top-level directory + # config options having the least priority). + for filter in reversed(cfg_filters): + _AddFilters(filter) + + return True + + +def ProcessFile(filename, vlevel, extra_check_functions=[]): + """Does google-lint on a single file. + + Args: + filename: The name of the file to parse. + + vlevel: The level of errors to report. Every error of confidence + >= verbose_level will be reported. 0 is a good default. + + extra_check_functions: An array of additional check functions that will be + run on each source line. Each function takes 4 + arguments: filename, clean_lines, line, error + """ + + _SetVerboseLevel(vlevel) + _BackupFilters() + + if not ProcessConfigOverrides(filename): + _RestoreFilters() + return + + lf_lines = [] + crlf_lines = [] + try: + # Support the UNIX convention of using "-" for stdin. Note that + # we are not opening the file with universal newline support + # (which codecs doesn't support anyway), so the resulting lines do + # contain trailing '\r' characters if we are reading a file that + # has CRLF endings. + # If after the split a trailing '\r' is present, it is removed + # below. + if filename == '-': + lines = codecs.StreamReaderWriter(sys.stdin, + codecs.getreader('utf8'), + codecs.getwriter('utf8'), + 'replace').read().split('\n') + else: + lines = codecs.open(filename, 'r', 'utf8', 'replace').read().split('\n') + + # Remove trailing '\r'. + # The -1 accounts for the extra trailing blank line we get from split() + for linenum in range(len(lines) - 1): + if lines[linenum].endswith('\r'): + lines[linenum] = lines[linenum].rstrip('\r') + crlf_lines.append(linenum + 1) + else: + lf_lines.append(linenum + 1) + + except IOError: + sys.stderr.write( + "Skipping input '%s': Can't open for reading\n" % filename) + _RestoreFilters() + return + + # Note, if no dot is found, this will give the entire filename as the ext. + file_extension = filename[filename.rfind('.') + 1:] + + # When reading from stdin, the extension is unknown, so no cpplint tests + # should rely on the extension. + if filename != '-' and file_extension not in _valid_extensions: + sys.stderr.write('Ignoring %s; not a valid file name ' + '(%s)\n' % (filename, ', '.join(_valid_extensions))) + else: + ProcessFileData(filename, file_extension, lines, Error, + extra_check_functions) + + # If end-of-line sequences are a mix of LF and CR-LF, issue + # warnings on the lines with CR. + # + # Don't issue any warnings if all lines are uniformly LF or CR-LF, + # since critique can handle these just fine, and the style guide + # doesn't dictate a particular end of line sequence. + # + # We can't depend on os.linesep to determine what the desired + # end-of-line sequence should be, since that will return the + # server-side end-of-line sequence. + if lf_lines and crlf_lines: + # Warn on every line with CR. An alternative approach might be to + # check whether the file is mostly CRLF or just LF, and warn on the + # minority, we bias toward LF here since most tools prefer LF. + for linenum in crlf_lines: + Error(filename, linenum, 'whitespace/newline', 1, + 'Unexpected \\r (^M) found; better to use only \\n') + + sys.stderr.write('Done processing %s\n' % filename) + _RestoreFilters() + + +def PrintUsage(message): + """Prints a brief usage string and exits, optionally with an error message. + + Args: + message: The optional error message. + """ + sys.stderr.write(_USAGE) + if message: + sys.exit('\nFATAL ERROR: ' + message) + else: + sys.exit(1) + + +def PrintCategories(): + """Prints a list of all the error-categories used by error messages. + + These are the categories used to filter messages via --filter. + """ + sys.stderr.write(''.join(' %s\n' % cat for cat in _ERROR_CATEGORIES)) + sys.exit(0) + + +def ParseArguments(args): + """Parses the command line arguments. + + This may set the output format and verbosity level as side-effects. + + Args: + args: The command line arguments: + + Returns: + The list of filenames to lint. + """ + try: + (opts, filenames) = getopt.getopt(args, '', ['help', 'output=', 'verbose=', + 'counting=', + 'filter=', + 'root=', + 'linelength=', + 'extensions=']) + except getopt.GetoptError: + PrintUsage('Invalid arguments.') + + verbosity = _VerboseLevel() + output_format = _OutputFormat() + filters = '' + counting_style = '' + + for (opt, val) in opts: + if opt == '--help': + PrintUsage(None) + elif opt == '--output': + if val not in ('emacs', 'vs7', 'eclipse'): + PrintUsage('The only allowed output formats are emacs, vs7 and eclipse.') + output_format = val + elif opt == '--verbose': + verbosity = int(val) + elif opt == '--filter': + filters = val + if not filters: + PrintCategories() + elif opt == '--counting': + if val not in ('total', 'toplevel', 'detailed'): + PrintUsage('Valid counting options are total, toplevel, and detailed') + counting_style = val + elif opt == '--root': + global _root + _root = val + elif opt == '--linelength': + global _line_length + try: + _line_length = int(val) + except ValueError: + PrintUsage('Line length must be digits.') + elif opt == '--extensions': + global _valid_extensions + try: + _valid_extensions = set(val.split(',')) + except ValueError: + PrintUsage('Extensions must be comma seperated list.') + + if not filenames: + PrintUsage('No files were specified.') + + _SetOutputFormat(output_format) + _SetVerboseLevel(verbosity) + _SetFilters(filters) + _SetCountingStyle(counting_style) + + return filenames + + +def main(): + filenames = ParseArguments(sys.argv[1:]) + + # Change stderr to write with replacement characters so we don't die + # if we try to print something containing non-ASCII characters. + sys.stderr = codecs.StreamReaderWriter(sys.stderr, + codecs.getreader('utf8'), + codecs.getwriter('utf8'), + 'replace') + + _cpplint_state.ResetErrorCounts() + for filename in filenames: + ProcessFile(filename, _cpplint_state.verbose_level) + _cpplint_state.PrintErrorCounts() + + sys.exit(_cpplint_state.error_count > 0) + + +if __name__ == '__main__': + main() From b8995eca119b6c7dd30792ddf10f1d687085e115 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 18 Jan 2016 12:06:20 -0500 Subject: [PATCH 076/212] add first stab of new API to header files this adds the new proposed API to the header files and also splits them out into distinct files. --- include/restclient-cpp/connection.h | 102 +++++++++++++++++++++ include/restclient-cpp/helpers.h | 74 +++++++++++++++ include/restclient-cpp/restclient.h | 137 +++++++++------------------- 3 files changed, 219 insertions(+), 94 deletions(-) create mode 100644 include/restclient-cpp/connection.h create mode 100644 include/restclient-cpp/helpers.h diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h new file mode 100644 index 00000000..240f7a5c --- /dev/null +++ b/include/restclient-cpp/connection.h @@ -0,0 +1,102 @@ +/** + * @file connection.h + * @brief header definitions for restclient-cpp connection class + * @author Daniel Schauenberg + * @version + * @date 2010-10-11 + */ + +#ifndef INCLUDE_RESTCLIENT_CPP_CONNECTION_H_ +#define INCLUDE_RESTCLIENT_CPP_CONNECTION_H_ + +#include +#include +#include +#include + +#include "restclient-cpp/version.h" + +/** + * @brief namespace for all RestClient definitions + */ +namespace RestClient { + +/** + * @brief Connection object for advanced usage + */ +class Connection { + public: + /** + * @brief enum to hold identifiers for HTTP verbs + */ + enum HttpVerb { + GET, + POST, + PUT, + DELETE + }; + + /** + * @struct Info + * @brief holds some diagnostics information + * about the connection object it came from + */ + typedef struct { + std::string base_url; + HeaderFields headers; + int timeout; + struct { + std::string username; + std::string password; + } basicAuth; + std::string customUserAgent; + } Info; + + + explicit Connection(const std::string& baseUrl); + ~Connection(); + + // Instance configuration methods + // configure basic auth + void SetBasicAuth(const std::string& username, + const std::string& password); + + // set connection timeout to 5s + void SetTimeout(int seconds); + + // set custom user agent + // (this will result in the UA "foo/cool restclient-cpp/VERSION") + void SetUserAgent(const std::string& userAgent); + + // set headers + void SetHeaders(headermap headers); + + // append additional headers + void AppendHeader(const std::string& key, + const std::string& value); + + + // Basic HTTP verb methods + response get(const std::string& uri); + response post(const std::string& uri, + const std::string& contentType, + const std::string& data); + response put(const std::string& uri, + const std::string& contentType, + const std::string& data); + response del(const std::string& uri); + + private: + CURL* curlHandle = NULL; + std::string baseUrl; + headermap headers; + int timeout; + struct { + std::string username; + std::string password; + } basicAuth; + std::string customUserAgent; +}; +}; // namespace RestClient + +#endif // INCLUDE_RESTCLIENT_CPP_CONNECTION_H_ diff --git a/include/restclient-cpp/helpers.h b/include/restclient-cpp/helpers.h new file mode 100644 index 00000000..c198630b --- /dev/null +++ b/include/restclient-cpp/helpers.h @@ -0,0 +1,74 @@ +/** + * @file helpers.h + * @brief header file for restclient-cpp helpers + * @author Daniel Schauenberg + * @version + * @date 2010-10-11 + */ + +#ifndef INCLUDE_RESTCLIENT_CPP_HELPERS_H_ +#define INCLUDE_RESTCLIENT_CPP_HELPERS_H_ + +#include +#include +#include + +#include "restclient-cpp/version.h" + +/** + * @brief namespace for all RestClient definitions + */ +namespace RestClient { + +/** + * @brief: namespace for all helper functions + */ +namespace Helpers { + + /** @struct upload_object + * @brief This structure represents the payload to upload on POST + * requests + * @var upload_object::data + * Member 'data' contains the data to upload + * @var upload_object::length + * Member 'length' contains the length of the data to upload + */ + typedef struct { + const char* data; + size_t length; + } UploadObject; + + // writedata callback function + static size_t write_callback(void *ptr, size_t size, size_t nmemb, + void *userdata); + + // header callback function + static size_t header_callback(void *ptr, size_t size, size_t nmemb, + void *userdata); + // read callback function + static size_t read_callback(void *ptr, size_t size, size_t nmemb, + void *userdata); + + // trim from start + static inline std::string <rim(const std::string &s) { + s.erase(s.begin(), std::find_if(s.begin(), s.end(), + std::not1(std::ptr_fun(std::isspace)))); + return s; + } + + // trim from end + static inline std::string &rtrim(const std::string &s) { + s.erase(std::find_if(s.rbegin(), s.rend(), + std::not1(std::ptr_fun(std::isspace))).base(), s.end()); + return s; + } + + // trim from both ends + static inline std::string &trim(const std::string &s) { + return ltrim(rtrim(s)); + } +}; // namespace Helpers + +}; // namespace RestClient + +#endif // INCLUDE_RESTCLIENT_CPP_HELPERS_H_ diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index f53cd7f1..9716b1b0 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -6,110 +6,59 @@ * @date 2010-10-11 */ -#ifndef INCLUDE_RESTCLIENT_H_ -#define INCLUDE_RESTCLIENT_H_ +#ifndef INCLUDE_RESTCLIENT_CPP_RESTCLIENT_H_ +#define INCLUDE_RESTCLIENT_CPP_RESTCLIENT_H_ +#include #include #include #include -#include #include "restclient-cpp/version.h" -class RestClient -{ - public: - /** - * public data definitions - */ - typedef std::map headermap; - - /** @struct response - * @brief This structure represents the HTTP response data - * @var response::code - * Member 'code' contains the HTTP response code - * @var response::body - * Member 'body' contains the HTTP response body - * @var response::headers - * Member 'headers' contains the HTTP response headers - */ - typedef struct - { - int code; - std::string body; - headermap headers; - } response; - - /** @struct upload_object - * @brief This structure represents the payload to upload on POST - * requests - * @var upload_object::data - * Member 'data' contains the data to upload - * @var upload_object::length - * Member 'length' contains the length of the data to upload - */ - typedef struct - { - const char* data; - size_t length; - } upload_object; - - /** public methods */ - // Auth - static void clearAuth(); - static void setAuth(const std::string& user,const std::string& password); - // HTTP GET - static response get(const std::string& url, const size_t timeout = 0); - static response get(const std::string& url, const headermap& headers, - const size_t timeout = 0); - // HTTP POST - static response post(const std::string& url, const std::string& ctype, - const std::string& data, const size_t timeout = 0); - static response post(const std::string& url, const std::string& ctype, - const std::string& data, const headermap& headers, - const size_t timeout = 0); - // HTTP PUT - static response put(const std::string& url, const std::string& ctype, - const std::string& data, const size_t timeout = 0); - static response put(const std::string& url, const std::string& ctype, - const std::string& data, const headermap& headers, - const size_t timeout = 0); - // HTTP DELETE - static response del(const std::string& url, const size_t timeout = 0); - static response del(const std::string& url, const headermap& headers, - const size_t timeout = 0); - - private: - // writedata callback function - static size_t write_callback(void *ptr, size_t size, size_t nmemb, - void *userdata); +/** + * @brief namespace for all RestClient definitions + */ +namespace RestClient { - // header callback function - static size_t header_callback(void *ptr, size_t size, size_t nmemb, - void *userdata); - // read callback function - static size_t read_callback(void *ptr, size_t size, size_t nmemb, - void *userdata); - static const char* user_agent; - static std::string user_pass; +/** + * public data definitions + */ +typedef std::map HeaderFields; - // trim from start - static inline std::string <rim(std::string &s) { - s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun(std::isspace)))); - return s; - } +/** @struct response + * @brief This structure represents the HTTP response data + * @var response::code + * Member 'code' contains the HTTP response code + * @var response::body + * Member 'body' contains the HTTP response body + * @var response::headers + * Member 'headers' contains the HTTP response headers + */ +typedef struct { + int code; + std::string body; + HeaderFields headers; +} Response; - // trim from end - static inline std::string &rtrim(std::string &s) { - s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun(std::isspace))).base(), s.end()); - return s; - } +// init function +void init(); +void disable(); - // trim from both ends - static inline std::string &trim(std::string &s) { - return ltrim(rtrim(s)); - } +/** + * public methods for the simple API. These don't allow a lot of + * configuration but are meant for simple HTTP calls. + * + */ +Response get(const std::string& url); +Response post(const std::string& url, + const std::string& content_type, + const std::string& data); +Response put(const std::string& url, + const std::string& content_type, + const std::string& data); +Response del(const std::string& url); -}; +}; // namespace RestClient -#endif // INCLUDE_RESTCLIENT_H_ +#endif // INCLUDE_RESTCLIENT_CPP_RESTCLIENT_H_ From 76c221ba90178741d6883f32b8e4bcceeee603d9 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 18 Jan 2016 12:07:28 -0500 Subject: [PATCH 077/212] document Connection constructor with base URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e6c837fd..fd4c331a 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ timeouts or authentication, there is also a different, more configurable way. RestClient::init(); // get a connection object -RestClient::Connection conn = new RestClient::Connection(); +RestClient::Connection conn = new RestClient::Connection("http://url.com"); // configure basic auth conn->SetBasicAuth("WarMachine68", "WARMACHINEROX"); @@ -69,10 +69,10 @@ conn->SetHeaders(headers) // append additional headers conn->AppendHeader("X-MY-HEADER", "foo") -RestClient::response r = conn->get("http://url.com") -RestClient::response r = conn->post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}") -RestClient::response r = conn->put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}") -RestClient::response r = conn->del("http://url.com/delete") +RestClient::response r = conn->get("/get") +RestClient::response r = conn->post("/post", "text/json", "{\"foo\": \"bla\"}") +RestClient::response r = conn->put("/put", "text/json", "{\"foo\": \"bla\"}") +RestClient::response r = conn->del("/delete") // deinit RestClient. After calling this you have to call RestClient::init() // again before you can use it From c72a9e61f01a44258f5a866e8e0885a2287a5670 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 18 Jan 2016 13:04:49 -0500 Subject: [PATCH 078/212] make version.h.m4 conform to cpplint --- m4/version.h.m4 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/m4/version.h.m4 b/m4/version.h.m4 index c983fe6f..5740cd1d 100644 --- a/m4/version.h.m4 +++ b/m4/version.h.m4 @@ -1,5 +1,6 @@ changecom(`@@')dnl -#ifndef RESTCLIENT_VERSION +#ifndef INCLUDE_RESTCLIENT_CPP_VERSION_H_ +#define INCLUDE_RESTCLIENT_CPP_VERSION_H_ #define RESTCLIENT_VERSION "M4_RESTCLIENT_VERSION" -#endif +#endif // INCLUDE_RESTCLIENT_CPP_VERSION_H_ changecom(`#')dnl From 7084c02afe463cc54d7f8ae6aac46e4b6eb8a50b Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 18 Jan 2016 16:33:26 -0500 Subject: [PATCH 079/212] first super rough draft of an implementation for the new API --- include/restclient-cpp/connection.h | 57 ++- source/connection.cc | 206 +++++++++++ source/helpers.cc | 87 +++++ source/restclient.cc | 73 ++++ source/restclient.cpp | 555 ---------------------------- 5 files changed, 410 insertions(+), 568 deletions(-) create mode 100644 source/connection.cc create mode 100644 source/helpers.cc create mode 100644 source/restclient.cc delete mode 100644 source/restclient.cpp diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index 240f7a5c..fcecef31 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -43,17 +43,42 @@ class Connection { */ typedef struct { std::string base_url; - HeaderFields headers; + RestClients::HeaderFields headers; int timeout; struct { std::string username; std::string password; } basicAuth; std::string customUserAgent; + struct { + // total time of the last request in seconds Total time of previous + // transfer. See CURLINFO_TOTAL_TIME + int totalTime; + // time spent in DNS lookup in seconds Time from start until name + // resolving completed. See CURLINFO_NAMELOOKUP_TIME + int nameLookupTime; + // time it took until Time from start until remote host or proxy + // completed. See CURLINFO_CONNECT_TIME + int connectTime; + // Time from start until SSL/SSH handshake completed. See + // CURLINFO_APPCONNECT_TIME + int appConnectTime; + // Time from start until just before the transfer begins. See + // CURLINFO_PRETRANSFER_TIME + int preTransferTime; + // Time from start until just when the first byte is received. See + // CURLINFO_STARTTRANSFER_TIME + int startTransferTime; + // Time taken for all redirect steps before the final transfer. See + // CURLINFO_REDIRECT_TIME + int redirectTime; + // number of redirects followed. See CURLINFO_REDIRECT_COUNT + int redirectCount; + } lastRequest; } Info; - explicit Connection(const std::string& baseUrl); + explicit Connection(const std::string baseUrl); ~Connection(); // Instance configuration methods @@ -61,15 +86,20 @@ class Connection { void SetBasicAuth(const std::string& username, const std::string& password); - // set connection timeout to 5s + // set connection timeout to seconds void SetTimeout(int seconds); // set custom user agent // (this will result in the UA "foo/cool restclient-cpp/VERSION") void SetUserAgent(const std::string& userAgent); + std::string GetUserAgent(); + // set headers - void SetHeaders(headermap headers); + void SetHeaders(RestClient::HeaderFields headers); + + // get headers + RestClient::HeaderFields GetHeaders(); // append additional headers void AppendHeader(const std::string& key, @@ -77,25 +107,26 @@ class Connection { // Basic HTTP verb methods - response get(const std::string& uri); - response post(const std::string& uri, - const std::string& contentType, - const std::string& data); - response put(const std::string& uri, - const std::string& contentType, - const std::string& data); - response del(const std::string& uri); + RestClient::Response get(const std::string& uri); + RestClient::Response post(const std::string& uri, + const std::string& data); + RestClient::Response put(const std::string& uri, + const std::string& data); + RestCLient::Response del(const std::string& uri); private: CURL* curlHandle = NULL; std::string baseUrl; - headermap headers; + RestClient::HeaderFields headerFields; int timeout; struct { std::string username; std::string password; } basicAuth; std::string customUserAgent; + Info infoStruct; + int performCurlRequest(const std::string& uri, + RestClient::Response& ret); }; }; // namespace RestClient diff --git a/source/connection.cc b/source/connection.cc new file mode 100644 index 00000000..bed868b9 --- /dev/null +++ b/source/connection.cc @@ -0,0 +1,206 @@ +/** + * @file connection.cpp + * @brief implementation of the connection class + * @author Daniel Schauenberg + */ + +#include "restclient-cpp/connection.h" + +#include + +#include +#include +#include +#include +#include + +#include "restclient-cpp/restclient.h" +#include "restclient-cpp/helpers.h" +#include "restclient-cpp/version.h" + +using namespace RestClient; + +Connection::Connection(const std::string baseUrl) { + this->curlHandle = curl_easy_init(); + if (!this->curlHandle) { + throw std::runtime_error("Couldn't initialize curl handle"); + } + this->baseUrl = baseUrl; + this->infoStruct = new Info(); +} + +Connection::~Connection() { + if (this->curlHandle) { + curl_easy_cleanup(this->curlHandle); + } +} + +// getters/setters + + +/** + * @brief helper function to get called from the actual request methods to + * prepare the curlHandle for transfer with generic options, perform the + * request and record some stats from the last request and then reset the + * handle with curl_easy_reset to its default state. This will keep things + * like connections and session ID intact but makes sure you can change + * parameters on the object for another request. + * + * @param uri URI to query + * @param ret Reference to the Response struct that should be filled + * + * @return 0 on success and 1 on error + */ +int Connection::performCurlRequest(const std::string& uri, + RestClient::Response& ret) { + + std::string url = std::string(this->baseUrl + uri); + std::string headerString; + CURLcode res = CURLE_OK; + curl_slist* headerList = NULL; + + /** set query URL */ + curl_easy_setopt(this->curlHandle, CURLOPT_URL, url.c_str()); + /** set callback function */ + curl_easy_setopt(this->curlHandle, CURLOPT_WRITEFUNCTION, Helpers::write_callback); + /** set data object to pass to callback function */ + curl_easy_setopt(this->curlHandle, CURLOPT_WRITEDATA, &ret); + /** set the header callback function */ + curl_easy_setopt(this->curlHandle, CURLOPT_HEADERFUNCTION, Helpers::header_callback); + /** callback object for headers */ + curl_easy_setopt(this->curlHandle, CURLOPT_HEADERDATA, &ret); + /** set http headers */ + for (HeaderFields::const_iterator it = this->headerFields.begin(); + it != this->headerFields.end(); ++it) { + headerString = it->first; + headerString += ": "; + headerString += it->second; + headerList = curl_slist_append(headerList, headerString.c_str()); + } + curl_easy_setopt(this->curlHandle, CURLOPT_HTTPHEADER, headerList); + /** set user agent */ + curl_easy_setopt(this->curlHandle, CURLOPT_USERAGENT, this->GetUserAgent().c_str()); + + // set timeout + if (this->timeout) { + curl_easy_setopt(this->curlHandle, CURLOPT_TIMEOUT, this->timeout); + // dont want to get a sig alarm on timeout + curl_easy_setopt(this->curlHandle, CURLOPT_NOSIGNAL, 1); + } + res = curl_easy_perform(this->curlHandle); + if (res != CURLE_OK) { + if (res == CURLE_OPERATION_TIMEDOUT) { + ret.code = res; + ret.body = "Operation Timeout."; + } + + ret.body = "Failed to query."; + ret.code = -1; + } + int64_t http_code = 0; + curl_easy_getinfo(this->curlHandle, CURLINFO_RESPONSE_CODE, &http_code); + ret.code = static_cast(http_code); + + // TODO: get metrics from curl handle + // free header list + curl_slist_free_all(headerList); + // reset curl handle + curl_easy_reset(this->curlHandle); + return 0; +} + +/** + * @brief HTTP GET method + * + * @param url to query + * + * @return response struct + */ +Response Connection::get(const std::string& url) { + /** create return struct */ + Response ret = {}; + CURLcode res = CURLE_OK; + + this->performCurlRequest(url, &ret); + return ret; +} +/** + * @brief HTTP POST method + * + * @param url to query + * @param ctype content type as string + * @param data HTTP POST body + * + * @return response struct + */ +Response Connection::post(const std::string& url, + const std::string& data) { + /** create return struct */ + RestClient::Response ret = {}; + + /** Now specify we want to POST data */ + curl_easy_setopt(this->curlHandle, CURLOPT_POST, 1L); + /** set post fields */ + curl_easy_setopt(this->curlHandle, CURLOPT_POSTFIELDS, data.c_str()); + curl_easy_setopt(this->curlHandle, CURLOPT_POSTFIELDSIZE, data.size()); + + this->performCurlRequest(url, &ret); + return ret; +} +/** + * @brief HTTP PUT method + * + * @param url to query + * @param ctype content type as string + * @param data HTTP PUT body + * + * @return response struct + */ +RestClient::Response Connection::put(const std::string& url, + const std::string& data) { + /** create return struct */ + RestClient::Response ret = {}; + CURLcode res = CURLE_OK; + + /** initialize upload object */ + RestClient::Helpers::UploadObject up_obj; + up_obj.data = data.c_str(); + up_obj.length = data.size(); + + /** Now specify we want to PUT data */ + curl_easy_setopt(this->curlHandle, CURLOPT_PUT, 1L); + curl_easy_setopt(this->curlHandle, CURLOPT_UPLOAD, 1L); + /** set read callback function */ + curl_easy_setopt(this->curlHandle, CURLOPT_READFUNCTION, + RestClient::Helpers::read_callback); + /** set data object to pass to callback function */ + curl_easy_setopt(this->curlHandle, CURLOPT_READDATA, &up_obj); + /** set data size */ + curl_easy_setopt(this->curlHandle, CURLOPT_INFILESIZE, + static_cast(up_obj.length)); + + this->performCurlRequest(url, ret); + return ret; +} +/** + * @brief HTTP DELETE method + * + * @param url to query + * + * @return response struct + */ +RestClient::Response Connection::del(const std::string& url) { + /** create return struct */ + RestClient::Response ret = {}; + CURLcode res = CURLE_OK; + + /** we want HTTP DELETE */ + const char* http_delete = "DELETE"; + + /** set HTTP DELETE METHOD */ + curl_easy_setopt(this->curlHandle, CURLOPT_CUSTOMREQUEST, http_delete); + + this->performCurlRequest(url, ret); + return ret; +} + diff --git a/source/helpers.cc b/source/helpers.cc new file mode 100644 index 00000000..f24e694b --- /dev/null +++ b/source/helpers.cc @@ -0,0 +1,87 @@ +/** + * @file helpers.cpp + * @brief implementation of the restclient helpers + * @author Daniel Schauenberg + */ + +#include "restclient-cpp/helpers.h" +#include "restclient-cpp/restclient.h" + +/** + * @brief write callback function for libcurl + * + * @param data returned data of size (size*nmemb) + * @param size size parameter + * @param nmemb memblock parameter + * @param userdata pointer to user data to save/work with return data + * + * @return (size * nmemb) + */ +size_t RestClient::Helpers::write_callback(void *data, size_t size, + size_t nmemb, void *userdata) { + RestClient::Response* r; + r = reinterpret_cast(userdata); + r->body.append(reinterpret_cast(data), size*nmemb); + + return (size * nmemb); +} + +/** + * @brief header callback for libcurl + * + * @param data returned (header line) + * @param size of data + * @param nmemb memblock + * @param userdata pointer to user data object to save headr data + * @return size * nmemb; + */ +size_t RestClient::Helpers::header_callback(void *data, size_t size, + size_t nmemb, void *userdata) { + RestClient::Response* r; + r = reinterpret_cast(userdata); + std::string header(reinterpret_cast(data), size*nmemb); + size_t seperator = header.find_first_of(":"); + if ( std::string::npos == seperator ) { + // roll with non seperated headers... + trim(header); + if (0 == header.length()) { + return (size * nmemb); // blank line; + } + r->headers[header] = "present"; + } else { + std::string key = header.substr(0, seperator); + trim(key); + std::string value = header.substr(seperator + 1); + trim(value); + r->headers[key] = value; + } + + return (size * nmemb); +} + +/** + * @brief read callback function for libcurl + * + * @param pointer of max size (size*nmemb) to write data to + * @param size size parameter + * @param nmemb memblock parameter + * @param userdata pointer to user data to read data from + * + * @return (size * nmemb) + */ +size_t RestClient::Helpers::read_callback(void *data, size_t size, + size_t nmemb, void *userdata) { + /** get upload struct */ + RestClient::upload_object* u; + u = reinterpret_cast(userdata); + /** set correct sizes */ + size_t curl_size = size * nmemb; + size_t copy_size = (u->length < curl_size) ? u->length : curl_size; + /** copy data to buffer */ + memcpy(data, u->data, copy_size); + /** decrement length and increment data pointer */ + u->length -= copy_size; + u->data += copy_size; + /** return copied size */ + return copy_size; +} diff --git a/source/restclient.cc b/source/restclient.cc new file mode 100644 index 00000000..9577daf3 --- /dev/null +++ b/source/restclient.cc @@ -0,0 +1,73 @@ +/** + * @file restclient.cpp + * @brief implementation of the restclient class + * + * This just provides static wrappers around the Connection class REST + * methods. However since I didn't want to have to pull in a whole URI parsing + * library just now, the Connection constructor is passed an empty string and + * the full URL is passed to the REST methods. All those methods to is + * concatenate them anyways. So this should do for now. + * + * @author Daniel Schauenberg + */ + +#include "restclient-cpp/restclient.h" +#include "restclient-cpp/version.h" + + +/** + * @brief HTTP GET method + * + * @param url to query + * + * @return response struct + */ +RestClient::response RestClient::get(const std::string& url) { + Connection *conn = new Connection(""); + return conn->get(url); +} + +/** + * @brief HTTP POST method + * + * @param url to query + * @param ctype content type as string + * @param data HTTP POST body + * + * @return response struct + */ +RestClient::response RestClient::post(const std::string& url, + const std::string& ctype, + const std::string& data) { + Connection *conn = new Connection(""); + return conn->post(url, ctype, data); +} + +/** + * @brief HTTP PUT method + * + * @param url to query + * @param ctype content type as string + * @param data HTTP PUT body + * + * @return response struct + */ +RestClient::response RestClient::put(const std::string& url, + const std::string& ctype, + const std::string& data) { + Connection *conn = new Connection(""); + return conn->put(url, ctype, data); +} + +/** + * @brief HTTP DELETE method + * + * @param url to query + * + * @return response struct + */ +RestClient::response RestClient::del(const std::string& url) { + Connection *conn = new Connection(""); + return conn->del(url); +} + diff --git a/source/restclient.cpp b/source/restclient.cpp deleted file mode 100644 index 6b77444a..00000000 --- a/source/restclient.cpp +++ /dev/null @@ -1,555 +0,0 @@ -/** - * @file restclient.cpp - * @brief implementation of the restclient class - * @author Daniel Schauenberg - */ - -/*======================== - INCLUDES - ========================*/ -#include "restclient-cpp/restclient.h" -#include "restclient-cpp/version.h" - -#include -#include -#include -#include -#include - -/** initialize user agent string */ -const char* RestClient::user_agent = "restclient-cpp/" RESTCLIENT_VERSION; -/** initialize authentication variable */ -std::string RestClient::user_pass = std::string(); - -/** - * @brief method to clear auth set on the static class - * - * @return void - */ -void RestClient::clearAuth(){ - RestClient::user_pass.clear(); -} - -/** - * @brief method to set basic auth data on the class - * - * @param user - user name to use for basic auth - * @param password - password to use for basic auth - * - * @return void - */ -void RestClient::setAuth(const std::string& user, const std::string& password){ - RestClient::user_pass.clear(); - RestClient::user_pass += user+":"+password; -} - -/** - * @brief HTTP GET method - * - * @param url to query - * @param timeout in seconds for this request - * - * @return response struct - */ -RestClient::response RestClient::get(const std::string& url, const size_t timeout) -{ - headermap emptyMap; - return RestClient::get(url, emptyMap, timeout); -} - -/** - * @brief HTTP GET method - * - * @param url to query - * @param headers HTTP headers - * @param timeout in seconds for this request - * - * @return response struct - */ -RestClient::response RestClient::get(const std::string& url, const headermap& headers, const size_t timeout) -{ - /** create return struct */ - RestClient::response ret = {}; - - // use libcurl - CURL *curl = NULL; - CURLcode res = CURLE_OK; - std::string header; - - curl = curl_easy_init(); - if (curl) - { - /** set basic authentication if present*/ - if(RestClient::user_pass.length()>0){ - curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_easy_setopt(curl, CURLOPT_USERPWD, RestClient::user_pass.c_str()); - } - /** set user agent */ - curl_easy_setopt(curl, CURLOPT_USERAGENT, RestClient::user_agent); - /** set query URL */ - curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); - /** set callback function */ - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, RestClient::write_callback); - /** set data object to pass to callback function */ - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ret); - /** set the header callback function */ - curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, RestClient::header_callback); - /** callback object for headers */ - curl_easy_setopt(curl, CURLOPT_HEADERDATA, &ret); - /** set http headers */ - curl_slist* hlist = NULL; - for (headermap::const_iterator it = headers.begin(); it != headers.end(); ++it) { - header = it->first; - header += ": "; - header += it->second; - hlist = curl_slist_append(hlist, header.c_str()); - } - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hlist); - /** perform the actual query */ - - //set timeout - if (timeout) { - curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // dont want to get a sig alarm on timeout - } - - res = curl_easy_perform(curl); - if (res != CURLE_OK) - { - if (res == CURLE_OPERATION_TIMEDOUT) { - ret.code = res; - ret.body = "Operation Timeout."; - return ret; - } - - ret.body = "Failed to query."; - ret.code = -1; - return ret; - } - long http_code = 0; - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); - ret.code = static_cast(http_code); - - curl_slist_free_all(hlist); - curl_easy_cleanup(curl); - } - - return ret; -} -/** - * @brief HTTP POST method - * - * @param url to query - * @param ctype content type as string - * @param data HTTP POST body - * @param timeout in seconds for this request - * - * @return response struct - */ -RestClient::response RestClient::post(const std::string& url, - const std::string& ctype, - const std::string& data, - const size_t timeout) -{ - headermap emptyMap; - return RestClient::post(url, ctype, data, emptyMap, timeout); -} - -/** - * @brief HTTP POST method - * - * @param url to query - * @param ctype content type as string - * @param data HTTP POST body - * @param headers HTTP headers - * @param timeout in seconds for this request - * - * @return response struct - */ -RestClient::response RestClient::post(const std::string& url, - const std::string& ctype, - const std::string& data, - const headermap& headers, - const size_t timeout) -{ - /** create return struct */ - RestClient::response ret = {}; - /** build content-type header string */ - std::string ctype_header = "Content-Type: " + ctype; - std::string header; - - // use libcurl - CURL *curl = NULL; - CURLcode res = CURLE_OK; - - curl = curl_easy_init(); - if (curl) - { - /** set basic authentication if present*/ - if(RestClient::user_pass.length()>0){ - curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_easy_setopt(curl, CURLOPT_USERPWD, RestClient::user_pass.c_str()); - } - /** set user agent */ - curl_easy_setopt(curl, CURLOPT_USERAGENT, RestClient::user_agent); - /** set query URL */ - curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); - /** Now specify we want to POST data */ - curl_easy_setopt(curl, CURLOPT_POST, 1L); - /** set post fields */ - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str()); - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, data.size()); - /** set callback function */ - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, RestClient::write_callback); - /** set data object to pass to callback function */ - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ret); - /** set the header callback function */ - curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, RestClient::header_callback); - /** callback object for headers */ - curl_easy_setopt(curl, CURLOPT_HEADERDATA, &ret); - /** set content-type header */ - curl_slist* hlist = NULL; - hlist = curl_slist_append(hlist, ctype_header.c_str()); - for (headermap::const_iterator it = headers.begin(); it != headers.end(); ++it) { - header = it->first; - header += ": "; - header += it->second; - hlist = curl_slist_append(hlist, header.c_str()); - } - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hlist); - - //set timeout - if (timeout) { - curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // dont want to get a sig alarm on timeout - } - - /** perform the actual query */ - res = curl_easy_perform(curl); - if (res != CURLE_OK) - { - if (res == CURLE_OPERATION_TIMEDOUT) { - ret.code = res; - ret.body = "Operation Timeout."; - return ret; - } - - ret.body = "Failed to query."; - ret.code = -1; - return ret; - } - long http_code = 0; - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); - ret.code = static_cast(http_code); - - curl_slist_free_all(hlist); - curl_easy_cleanup(curl); - } - - return ret; -} -/** - * @brief HTTP PUT method - * - * @param url to query - * @param ctype content type as string - * @param data HTTP PUT body - * @param timeout in seconds for this request - * - * @return response struct - */ -RestClient::response RestClient::put(const std::string& url, - const std::string& ctype, - const std::string& data, - const size_t timeout) -{ - headermap emptyMap; - return RestClient::put(url, ctype, data, emptyMap, timeout); -} - -/** - * @brief HTTP PUT method - * - * @param url to query - * @param ctype content type as string - * @param data HTTP PUT body - * @param headers HTTP headers - * @param timeout in seconds for this request - * - * @return response struct - */ -RestClient::response RestClient::put(const std::string& url, - const std::string& ctype, - const std::string& data, - const headermap& headers, - const size_t timeout) -{ - /** create return struct */ - RestClient::response ret = {}; - /** build content-type header string */ - std::string ctype_header = "Content-Type: " + ctype; - std::string header; - - /** initialize upload object */ - RestClient::upload_object up_obj; - up_obj.data = data.c_str(); - up_obj.length = data.size(); - - // use libcurl - CURL *curl = NULL; - CURLcode res = CURLE_OK; - - curl = curl_easy_init(); - if (curl) - { - /** set basic authentication if present*/ - if(RestClient::user_pass.length()>0){ - curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_easy_setopt(curl, CURLOPT_USERPWD, RestClient::user_pass.c_str()); - } - /** set user agent */ - curl_easy_setopt(curl, CURLOPT_USERAGENT, RestClient::user_agent); - /** set query URL */ - curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); - /** Now specify we want to PUT data */ - curl_easy_setopt(curl, CURLOPT_PUT, 1L); - curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); - /** set read callback function */ - curl_easy_setopt(curl, CURLOPT_READFUNCTION, RestClient::read_callback); - /** set data object to pass to callback function */ - curl_easy_setopt(curl, CURLOPT_READDATA, &up_obj); - /** set callback function */ - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, RestClient::write_callback); - /** set data object to pass to callback function */ - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ret); - /** set the header callback function */ - curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, RestClient::header_callback); - /** callback object for headers */ - curl_easy_setopt(curl, CURLOPT_HEADERDATA, &ret); - /** set data size */ - curl_easy_setopt(curl, CURLOPT_INFILESIZE, - static_cast(up_obj.length)); - - /** set content-type header */ - curl_slist* hlist = NULL; - hlist = curl_slist_append(hlist, ctype_header.c_str()); - for (headermap::const_iterator it = headers.begin(); it != headers.end(); ++it) { - header = it->first; - header += ": "; - header += it->second; - hlist = curl_slist_append(hlist, header.c_str()); - } - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hlist); - - //set timeout - if (timeout) { - curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // dont want to get a sig alarm on timeout - } - - /** perform the actual query */ - res = curl_easy_perform(curl); - if (res != CURLE_OK) - { - if (res == CURLE_OPERATION_TIMEDOUT) { - ret.code = res; - ret.body = "Operation Timeout."; - return ret; - } - - ret.body = "Failed to query."; - ret.code = -1; - return ret; - } - long http_code = 0; - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); - ret.code = static_cast(http_code); - - curl_slist_free_all(hlist); - curl_easy_cleanup(curl); - } - - return ret; -} -/** - * @brief HTTP DELETE method - * - * @param url to query - * @param timeout in seconds for this request - * - * @return response struct - */ -RestClient::response RestClient::del(const std::string& url, const size_t timeout) -{ - headermap emptyMap; - return RestClient::del(url, emptyMap, timeout); -} - -/** - * @brief HTTP DELETE method - * - * @param url to query - * @param headers HTTP headers - * @param timeout in seconds for this request - * - * @return response struct - */ -RestClient::response RestClient::del(const std::string& url, - const headermap& headers, - const size_t timeout) -{ - /** create return struct */ - RestClient::response ret = {}; - - /** we want HTTP DELETE */ - const char* http_delete = "DELETE"; - - // use libcurl - CURL *curl = NULL; - CURLcode res = CURLE_OK; - std::string header; - - curl = curl_easy_init(); - if (curl) - { - /** set basic authentication if present*/ - if(RestClient::user_pass.length()>0){ - curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_easy_setopt(curl, CURLOPT_USERPWD, RestClient::user_pass.c_str()); - } - /** set user agent */ - curl_easy_setopt(curl, CURLOPT_USERAGENT, RestClient::user_agent); - /** set query URL */ - curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); - /** set HTTP DELETE METHOD */ - curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, http_delete); - /** set callback function */ - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, RestClient::write_callback); - /** set data object to pass to callback function */ - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ret); - /** set the header callback function */ - curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, RestClient::header_callback); - /** callback object for headers */ - curl_easy_setopt(curl, CURLOPT_HEADERDATA, &ret); - /** set http headers */ - curl_slist* hlist = NULL; - for (headermap::const_iterator it = headers.begin(); it != headers.end(); ++it) { - header = it->first; - header += ": "; - header += it->second; - hlist = curl_slist_append(hlist, header.c_str()); - } - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hlist); - - //set timeout - if (timeout) { - curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // dont want to get a sig alarm on timeout - } - - /** perform the actual query */ - res = curl_easy_perform(curl); - if (res != CURLE_OK) - { - if (res == CURLE_OPERATION_TIMEDOUT) { - ret.code = res; - ret.body = "Operation Timeout."; - return ret; - } - - ret.body = "Failed to query."; - ret.code = -1; - return ret; - } - long http_code = 0; - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); - ret.code = static_cast(http_code); - - curl_slist_free_all(hlist); - curl_easy_cleanup(curl); - } - - return ret; -} - -/** - * @brief write callback function for libcurl - * - * @param data returned data of size (size*nmemb) - * @param size size parameter - * @param nmemb memblock parameter - * @param userdata pointer to user data to save/work with return data - * - * @return (size * nmemb) - */ -size_t RestClient::write_callback(void *data, size_t size, size_t nmemb, - void *userdata) -{ - RestClient::response* r; - r = reinterpret_cast(userdata); - r->body.append(reinterpret_cast(data), size*nmemb); - - return (size * nmemb); -} - -/** - * @brief header callback for libcurl - * - * @param data returned (header line) - * @param size of data - * @param nmemb memblock - * @param userdata pointer to user data object to save headr data - * @return size * nmemb; - */ -size_t RestClient::header_callback(void *data, size_t size, size_t nmemb, - void *userdata) -{ - RestClient::response* r; - r = reinterpret_cast(userdata); - std::string header(reinterpret_cast(data), size*nmemb); - size_t seperator = header.find_first_of(":"); - if ( std::string::npos == seperator ) { - //roll with non seperated headers... - trim(header); - if ( 0 == header.length() ){ - return (size * nmemb); //blank line; - } - r->headers[header] = "present"; - } else { - std::string key = header.substr(0, seperator); - trim(key); - std::string value = header.substr(seperator + 1); - trim (value); - r->headers[key] = value; - } - - return (size * nmemb); -} - -/** - * @brief read callback function for libcurl - * - * @param pointer of max size (size*nmemb) to write data to - * @param size size parameter - * @param nmemb memblock parameter - * @param userdata pointer to user data to read data from - * - * @return (size * nmemb) - */ -size_t RestClient::read_callback(void *data, size_t size, size_t nmemb, - void *userdata) -{ - /** get upload struct */ - RestClient::upload_object* u; - u = reinterpret_cast(userdata); - /** set correct sizes */ - size_t curl_size = size * nmemb; - size_t copy_size = (u->length < curl_size) ? u->length : curl_size; - /** copy data to buffer */ - memcpy(data, u->data, copy_size); - /** decrement length and increment data pointer */ - u->length -= copy_size; - u->data += copy_size; - /** return copied size */ - return copy_size; -} From b806b52cc72d8a3db3181daae107a3e30270ecce Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 18 Jan 2016 16:34:36 -0500 Subject: [PATCH 080/212] document Connection::Info usage in README --- README.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/README.md b/README.md index fd4c331a..ad667ac3 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,48 @@ RestClient::response.body // HTTP response body RestClient::response.headers // HTTP response headers ``` +The connection object also provides a simple way to get some diagnostics and +metrics information via `conn->GetInfo()`. The result is a +`RestClient::ConnectionInfo` struct and looks like this: + +```cpp +typedef struct { + std::string base_url; + RestClients::HeaderFields headers; + int timeout; + struct { + std::string username; + std::string password; + } basicAuth; + std::string customUserAgent; + struct { + // total time of the last request in seconds Total time of previous + // transfer. See CURLINFO_TOTAL_TIME + int totalTime; + // time spent in DNS lookup in seconds Time from start until name + // resolving completed. See CURLINFO_NAMELOOKUP_TIME + int nameLookupTime; + // time it took until Time from start until remote host or proxy + // completed. See CURLINFO_CONNECT_TIME + int connectTime; + // Time from start until SSL/SSH handshake completed. See + // CURLINFO_APPCONNECT_TIME + int appConnectTime; + // Time from start until just before the transfer begins. See + // CURLINFO_PRETRANSFER_TIME + int preTransferTime; + // Time from start until just when the first byte is received. See + // CURLINFO_STARTTRANSFER_TIME + int startTransferTime; + // Time taken for all redirect steps before the final transfer. See + // CURLINFO_REDIRECT_TIME + int redirectTime; + // number of redirects followed. See CURLINFO_REDIRECT_COUNT + int redirectCount; + } lastRequest; +} Info; +``` + #### Persistent connections/Keep-Alive The connection object stores the curl easy handle in an instance variable and uses that for lifetime of the object. This means curl will [automatically From 63daede666c0c48b27eaf14da208b99587ce2e1c Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 18 Jan 2016 17:06:46 -0500 Subject: [PATCH 081/212] account for source rename in Makefile --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index e7d7acab..f8d95680 100644 --- a/Makefile.am +++ b/Makefile.am @@ -10,7 +10,7 @@ test_program_LDFLAGS=-Lvendor/gtest-1.7.0/lib/.libs -lgtest test_program_CPPFLAGS=-Iinclude -Ivendor/gtest-1.7.0/include -Ivendor/jsoncpp-0.10.5/dist lib_LTLIBRARIES=librestclient-cpp.la -librestclient_cpp_la_SOURCES=source/restclient.cpp +librestclient_cpp_la_SOURCES=source/restclient.cc source/connection.cc source/helpers.cc librestclient_cpp_la_CXXFLAGS=-fPIC librestclient_cpp_la_LDFLAGS=-version-info 1:0:1 From 2214d6a8558a4888adceecb0da162192706cb903 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 18 Jan 2016 17:07:01 -0500 Subject: [PATCH 082/212] make refactor compile --- include/restclient-cpp/connection.h | 19 +++------- include/restclient-cpp/helpers.h | 12 +++---- source/connection.cc | 56 ++++++++++++++--------------- source/helpers.cc | 4 +-- source/restclient.cc | 23 ++++++------ 5 files changed, 52 insertions(+), 62 deletions(-) diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index fcecef31..68663291 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -14,6 +14,7 @@ #include #include +#include "restclient-cpp/restclient.h" #include "restclient-cpp/version.h" /** @@ -26,15 +27,6 @@ namespace RestClient { */ class Connection { public: - /** - * @brief enum to hold identifiers for HTTP verbs - */ - enum HttpVerb { - GET, - POST, - PUT, - DELETE - }; /** * @struct Info @@ -43,7 +35,7 @@ class Connection { */ typedef struct { std::string base_url; - RestClients::HeaderFields headers; + RestClient::HeaderFields headers; int timeout; struct { std::string username; @@ -112,10 +104,10 @@ class Connection { const std::string& data); RestClient::Response put(const std::string& uri, const std::string& data); - RestCLient::Response del(const std::string& uri); + RestClient::Response del(const std::string& uri); private: - CURL* curlHandle = NULL; + CURL* curlHandle; std::string baseUrl; RestClient::HeaderFields headerFields; int timeout; @@ -125,8 +117,7 @@ class Connection { } basicAuth; std::string customUserAgent; Info infoStruct; - int performCurlRequest(const std::string& uri, - RestClient::Response& ret); + RestClient::Response performCurlRequest(const std::string& uri); }; }; // namespace RestClient diff --git a/include/restclient-cpp/helpers.h b/include/restclient-cpp/helpers.h index c198630b..5ae5670e 100644 --- a/include/restclient-cpp/helpers.h +++ b/include/restclient-cpp/helpers.h @@ -39,32 +39,32 @@ namespace Helpers { } UploadObject; // writedata callback function - static size_t write_callback(void *ptr, size_t size, size_t nmemb, + size_t write_callback(void *ptr, size_t size, size_t nmemb, void *userdata); // header callback function - static size_t header_callback(void *ptr, size_t size, size_t nmemb, + size_t header_callback(void *ptr, size_t size, size_t nmemb, void *userdata); // read callback function - static size_t read_callback(void *ptr, size_t size, size_t nmemb, + size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userdata); // trim from start - static inline std::string <rim(const std::string &s) { + static inline std::string <rim(std::string &s) { s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun(std::isspace)))); return s; } // trim from end - static inline std::string &rtrim(const std::string &s) { + static inline std::string &rtrim(std::string &s) { s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun(std::isspace))).base(), s.end()); return s; } // trim from both ends - static inline std::string &trim(const std::string &s) { + static inline std::string &trim(std::string &s) { return ltrim(rtrim(s)); } }; // namespace Helpers diff --git a/source/connection.cc b/source/connection.cc index bed868b9..bece5526 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -20,13 +20,12 @@ using namespace RestClient; -Connection::Connection(const std::string baseUrl) { +Connection::Connection(const std::string baseUrl) : infoStruct(), headerFields() { this->curlHandle = curl_easy_init(); if (!this->curlHandle) { throw std::runtime_error("Couldn't initialize curl handle"); } this->baseUrl = baseUrl; - this->infoStruct = new Info(); } Connection::~Connection() { @@ -37,6 +36,21 @@ Connection::~Connection() { // getters/setters +/** + * @brief append a header to the internal map + * + * @param key for the header field + * @param value for the header field + * + */ +void Connection::AppendHeader(const std::string& key, + const std::string& value) { + + this->headerFields[key] = value; +} + + + /** * @brief helper function to get called from the actual request methods to @@ -51,8 +65,9 @@ Connection::~Connection() { * * @return 0 on success and 1 on error */ -int Connection::performCurlRequest(const std::string& uri, - RestClient::Response& ret) { +Response Connection::performCurlRequest(const std::string& uri) { + + Response ret = {}; std::string url = std::string(this->baseUrl + uri); std::string headerString; @@ -106,7 +121,7 @@ int Connection::performCurlRequest(const std::string& uri, curl_slist_free_all(headerList); // reset curl handle curl_easy_reset(this->curlHandle); - return 0; + return ret; } /** @@ -117,12 +132,7 @@ int Connection::performCurlRequest(const std::string& uri, * @return response struct */ Response Connection::get(const std::string& url) { - /** create return struct */ - Response ret = {}; - CURLcode res = CURLE_OK; - - this->performCurlRequest(url, &ret); - return ret; + return this->performCurlRequest(url); } /** * @brief HTTP POST method @@ -135,17 +145,13 @@ Response Connection::get(const std::string& url) { */ Response Connection::post(const std::string& url, const std::string& data) { - /** create return struct */ - RestClient::Response ret = {}; - /** Now specify we want to POST data */ curl_easy_setopt(this->curlHandle, CURLOPT_POST, 1L); /** set post fields */ curl_easy_setopt(this->curlHandle, CURLOPT_POSTFIELDS, data.c_str()); curl_easy_setopt(this->curlHandle, CURLOPT_POSTFIELDSIZE, data.size()); - this->performCurlRequest(url, &ret); - return ret; + return this->performCurlRequest(url); } /** * @brief HTTP PUT method @@ -156,12 +162,8 @@ Response Connection::post(const std::string& url, * * @return response struct */ -RestClient::Response Connection::put(const std::string& url, +Response Connection::put(const std::string& url, const std::string& data) { - /** create return struct */ - RestClient::Response ret = {}; - CURLcode res = CURLE_OK; - /** initialize upload object */ RestClient::Helpers::UploadObject up_obj; up_obj.data = data.c_str(); @@ -179,8 +181,7 @@ RestClient::Response Connection::put(const std::string& url, curl_easy_setopt(this->curlHandle, CURLOPT_INFILESIZE, static_cast(up_obj.length)); - this->performCurlRequest(url, ret); - return ret; + return this->performCurlRequest(url); } /** * @brief HTTP DELETE method @@ -189,18 +190,13 @@ RestClient::Response Connection::put(const std::string& url, * * @return response struct */ -RestClient::Response Connection::del(const std::string& url) { - /** create return struct */ - RestClient::Response ret = {}; - CURLcode res = CURLE_OK; - +Response Connection::del(const std::string& url) { /** we want HTTP DELETE */ const char* http_delete = "DELETE"; /** set HTTP DELETE METHOD */ curl_easy_setopt(this->curlHandle, CURLOPT_CUSTOMREQUEST, http_delete); - this->performCurlRequest(url, ret); - return ret; + return this->performCurlRequest(url); } diff --git a/source/helpers.cc b/source/helpers.cc index f24e694b..6b9adee2 100644 --- a/source/helpers.cc +++ b/source/helpers.cc @@ -72,8 +72,8 @@ size_t RestClient::Helpers::header_callback(void *data, size_t size, size_t RestClient::Helpers::read_callback(void *data, size_t size, size_t nmemb, void *userdata) { /** get upload struct */ - RestClient::upload_object* u; - u = reinterpret_cast(userdata); + RestClient::Helpers::UploadObject* u; + u = reinterpret_cast(userdata); /** set correct sizes */ size_t curl_size = size * nmemb; size_t copy_size = (u->length < curl_size) ? u->length : curl_size; diff --git a/source/restclient.cc b/source/restclient.cc index 9577daf3..bbfbc834 100644 --- a/source/restclient.cc +++ b/source/restclient.cc @@ -14,6 +14,7 @@ #include "restclient-cpp/restclient.h" #include "restclient-cpp/version.h" +#include "restclient-cpp/connection.h" /** * @brief HTTP GET method @@ -22,8 +23,8 @@ * * @return response struct */ -RestClient::response RestClient::get(const std::string& url) { - Connection *conn = new Connection(""); +RestClient::Response RestClient::get(const std::string& url) { + RestClient::Connection *conn = new RestClient::Connection(""); return conn->get(url); } @@ -36,11 +37,12 @@ RestClient::response RestClient::get(const std::string& url) { * * @return response struct */ -RestClient::response RestClient::post(const std::string& url, +RestClient::Response RestClient::post(const std::string& url, const std::string& ctype, const std::string& data) { - Connection *conn = new Connection(""); - return conn->post(url, ctype, data); + RestClient::Connection *conn = new RestClient::Connection(""); + conn->AppendHeader("Content-Type", ctype); + return conn->post(url, data); } /** @@ -52,11 +54,12 @@ RestClient::response RestClient::post(const std::string& url, * * @return response struct */ -RestClient::response RestClient::put(const std::string& url, +RestClient::Response RestClient::put(const std::string& url, const std::string& ctype, const std::string& data) { - Connection *conn = new Connection(""); - return conn->put(url, ctype, data); + RestClient::Connection *conn = new RestClient::Connection(""); + conn->AppendHeader("Content-Type", ctype); + return conn->put(url, data); } /** @@ -66,8 +69,8 @@ RestClient::response RestClient::put(const std::string& url, * * @return response struct */ -RestClient::response RestClient::del(const std::string& url) { - Connection *conn = new Connection(""); +RestClient::Response RestClient::del(const std::string& url) { + RestClient::Connection *conn = new RestClient::Connection(""); return conn->del(url); } From 1ce547421f76ef82626119ff0aaae8ddbec98438 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 18 Jan 2016 21:33:38 -0500 Subject: [PATCH 083/212] adapt unit tests to new API this also consolidates unit tests into a test file per source file --- Makefile.am | 2 +- test/test_restclient.cc | 149 ++++++++++++++++++++++++++++++++ test/test_restclient_delete.cpp | 70 --------------- test/test_restclient_get.cpp | 112 ------------------------ test/test_restclient_post.cpp | 70 --------------- test/test_restclient_put.cpp | 69 --------------- 6 files changed, 150 insertions(+), 322 deletions(-) create mode 100644 test/test_restclient.cc delete mode 100644 test/test_restclient_delete.cpp delete mode 100644 test/test_restclient_get.cpp delete mode 100644 test/test_restclient_post.cpp delete mode 100644 test/test_restclient_put.cpp diff --git a/Makefile.am b/Makefile.am index f8d95680..16037137 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4,7 +4,7 @@ check_PROGRAMS = test-program pkginclude_HEADERS = include/restclient-cpp/restclient.h include/restclient-cpp/version.h BUILT_SOURCES = include/restclient-cpp/version.h -test_program_SOURCES = vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp test/test_restclient_delete.cpp test/test_restclient_get.cpp test/test_restclient_post.cpp test/test_restclient_put.cpp test/tests.cpp +test_program_SOURCES = vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp test/tests.cpp test/test_restclient.cc test_program_LDADD = .libs/librestclient-cpp.a test_program_LDFLAGS=-Lvendor/gtest-1.7.0/lib/.libs -lgtest test_program_CPPFLAGS=-Iinclude -Ivendor/gtest-1.7.0/include -Ivendor/jsoncpp-0.10.5/dist diff --git a/test/test_restclient.cc b/test/test_restclient.cc new file mode 100644 index 00000000..b1d7be60 --- /dev/null +++ b/test/test_restclient.cc @@ -0,0 +1,149 @@ +#include "restclient-cpp/restclient.h" +#include +#include +#include + +class RestClientTest : public ::testing::Test +{ + protected: + + RestClientTest() + { + } + + virtual ~RestClientTest() + { + } + + virtual void SetUp() + { + } + + virtual void TearDown() + { + } + +}; + +// DELETE Tests +// check return code +TEST_F(RestClientTest, TestRestClientDeleteCode) +{ + RestClient::Response res = RestClient::del("http://httpbin.org/delete"); + EXPECT_EQ(200, res.code); +} +TEST_F(RestClientTest, TestRestClientDeleteBody) +{ + RestClient::Response res = RestClient::del("http://httpbin.org/delete"); + Json::Value root; + std::istringstream str(res.body); + str >> root; + + EXPECT_EQ("http://httpbin.org/delete", root.get("url", "no url set").asString()); + EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); +} + +// check for failure +TEST_F(RestClientTest, TestRestClientDeleteFailureCode) +{ + std::string u = "http://nonexistent"; + RestClient::Response res = RestClient::del(u); + EXPECT_EQ(-1, res.code); +} +TEST_F(RestClientTest, TestRestClientDeleteHeaders) +{ + RestClient::Response res = RestClient::del("http://httpbin.org/delete"); + EXPECT_EQ("keep-alive", res.headers["Connection"]); +} + +// GET Tests +TEST_F(RestClientTest, TestRestClientGETCode) +{ + RestClient::Response res = RestClient::get("http://httpbin.org/get"); + EXPECT_EQ(200, res.code); +} +TEST_F(RestClientTest, TestRestClientGETBodyCode) +{ + RestClient::Response res = RestClient::get("http://httpbin.org/get"); + Json::Value root; + std::istringstream str(res.body); + str >> root; + + EXPECT_EQ("http://httpbin.org/get", root.get("url", "no url set").asString()); + EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); +} + +// check for failure +TEST_F(RestClientTest, TestRestClientGETFailureCode) +{ + std::string u = "http://nonexistent"; + RestClient::Response res = RestClient::get(u); + EXPECT_EQ("Failed to query.", res.body); + EXPECT_EQ(-1, res.code); +} + +TEST_F(RestClientTest, TestRestClientGETHeaders) +{ + RestClient::Response res = RestClient::get("http://httpbin.org/get"); + EXPECT_EQ("keep-alive", res.headers["Connection"]); +} + +// POST Tests +// check return code +TEST_F(RestClientTest, TestRestClientPOSTCode) +{ + RestClient::Response res = RestClient::post("http://httpbin.org/post", "text/text", "data"); + EXPECT_EQ(200, res.code); +} +TEST_F(RestClientTest, TestRestClientPostBody) +{ + RestClient::Response res = RestClient::post("http://httpbin.org/post", "text/text", "data"); + Json::Value root; + std::istringstream str(res.body); + str >> root; + + EXPECT_EQ("http://httpbin.org/post", root.get("url", "no url set").asString()); + EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); +} +// check for failure +TEST_F(RestClientTest, TestRestClientPOSTFailureCode) +{ + std::string u = "http://nonexistent"; + RestClient::Response res = RestClient::post(u, "text/text", "data"); + EXPECT_EQ(-1, res.code); +} +TEST_F(RestClientTest, TestRestClientPOSTHeaders) +{ + RestClient::Response res = RestClient::post("http://httpbin.org/post", "text/text", "data"); + EXPECT_EQ("keep-alive", res.headers["Connection"]); +} + +// PUT Tests +// check return code +TEST_F(RestClientTest, TestRestClientPUTCode) +{ + RestClient::Response res = RestClient::put("http://httpbin.org/put", "text/text", "data"); + EXPECT_EQ(200, res.code); +} +TEST_F(RestClientTest, TestRestClientPutBody) +{ + RestClient::Response res = RestClient::put("http://httpbin.org/put", "text/text", "data"); + Json::Value root; + std::istringstream str(res.body); + str >> root; + + EXPECT_EQ("http://httpbin.org/put", root.get("url", "no url set").asString()); + EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); +} +// check for failure +TEST_F(RestClientTest, TestRestClientPUTFailureCode) +{ + std::string u = "http://nonexistent"; + RestClient::Response res = RestClient::put(u, "text/text", "data"); + EXPECT_EQ(-1, res.code); +} +TEST_F(RestClientTest, TestRestClientPUTHeaders) +{ + RestClient::Response res = RestClient::put("http://httpbin.org/put", "text/text", "data"); + EXPECT_EQ("keep-alive", res.headers["Connection"]); +} diff --git a/test/test_restclient_delete.cpp b/test/test_restclient_delete.cpp deleted file mode 100644 index 507a550b..00000000 --- a/test/test_restclient_delete.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "restclient-cpp/restclient.h" -#include -#include -#include - -class RestClientDeleteTest : public ::testing::Test -{ - protected: - std::string url; - std::string ctype; - std::string data; - - RestClientDeleteTest() - { - } - - virtual ~RestClientDeleteTest() - { - } - - virtual void SetUp() - { - url = "http://httpbin.org/delete"; - ctype = ""; - data = ""; - } - - virtual void TearDown() - { - } - -}; - -// Tests -// check return code -TEST_F(RestClientDeleteTest, TestRestClientDeleteCode) -{ - RestClient::response res = RestClient::del(url); - EXPECT_EQ(200, res.code); -} -TEST_F(RestClientDeleteTest, TestRestClientDeleteBody) -{ - RestClient::response res = RestClient::del(url); - Json::Value root; - std::istringstream str(res.body); - str >> root; - - EXPECT_EQ("http://httpbin.org/delete", root.get("url", "no url set").asString()); - EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); -} -// check for failure -TEST_F(RestClientDeleteTest, TestRestClientFailureCode) -{ - std::string u = "http://nonexistent"; - RestClient::response res = RestClient::del(u); - EXPECT_EQ(-1, res.code); -} -TEST_F(RestClientDeleteTest, TestRestClientDeleteHeaders) -{ - RestClient::response res = RestClient::del(url); - EXPECT_EQ("keep-alive", res.headers["Connection"]); -} - -/*TEST_F(RestClientDeleteTest, TestRestClientDeleteTimeout) -{ - std::string u = "http://httpbin.org/delay/10"; - RestClient::response res = RestClient::del(u, 5); - EXPECT_EQ(28, res.code); -}*/ - diff --git a/test/test_restclient_get.cpp b/test/test_restclient_get.cpp deleted file mode 100644 index 3c2c1339..00000000 --- a/test/test_restclient_get.cpp +++ /dev/null @@ -1,112 +0,0 @@ -#include "restclient-cpp/restclient.h" -#include -#include -#include - -class RestClientGetTest : public ::testing::Test -{ - protected: - std::string url; - std::string ctype; - std::string data; - - RestClientGetTest() - { - } - - virtual ~RestClientGetTest() - { - } - - virtual void SetUp() - { - url = "http://httpbin.org/get"; - ctype = ""; - data = ""; - } - - virtual void TearDown() - { - } - -}; - -// Tests -// check return code -TEST_F(RestClientGetTest, TestRestClientGETCode) -{ - RestClient::response res = RestClient::get(url); - EXPECT_EQ(200, res.code); -} -TEST_F(RestClientGetTest, TestRestClientGETBodyCode) -{ - RestClient::response res = RestClient::get(url); - Json::Value root; - std::istringstream str(res.body); - str >> root; - - EXPECT_EQ("http://httpbin.org/get", root.get("url", "no url set").asString()); - EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); -} -//check if additional http headers were sent -TEST_F(RestClientGetTest, TestRestClientGETAdditionalHeaders) -{ - RestClient::headermap headers; - - headers["Accept"] = "text/json"; - headers["Accept-Charset"] = "iso8859-2"; - headers["Accept-Language"] = "en-US"; - headers["User-Agent"] = "restclient-cpp"; - - RestClient::response res = RestClient::get("http://httpbin.org/headers", headers); - - EXPECT_EQ(200, res.code); - - Json::Value root; - std::istringstream str(res.body); - str >> root; - - const Json::Value r_headers = root["headers"]; - for ( RestClient::headermap::const_iterator it = headers.begin(); it != headers.end(); ++it) { - EXPECT_EQ(it->second, r_headers.get(it->first, "Header " + it->first + " not found").asString()); - } -} -// check for failure -TEST_F(RestClientGetTest, TestRestClientFailureCode) -{ - std::string u = "http://nonexistent"; - RestClient::response res = RestClient::get(u); - EXPECT_EQ(-1, res.code); -} - -TEST_F(RestClientGetTest, TestRestClientGETHeaders) -{ - RestClient::response res = RestClient::get(url); - EXPECT_EQ("keep-alive", res.headers["Connection"]); -} - -TEST_F(RestClientGetTest, TestRestClientGETTimeout) -{ - std::string u = "http://httpbin.org/delay/10"; - RestClient::response res = RestClient::get(u, 5); - EXPECT_EQ(28, res.code); -} - -TEST_F(RestClientGetTest, TestRestClientGETAuth) -{ - RestClient::setAuth("foo", "bar"); - RestClient::response res = RestClient::get("http://httpbin.org/basic-auth/foo/bar"); - EXPECT_EQ(200, res.code); - - Json::Value root; - std::istringstream str(res.body); - str >> root; - - EXPECT_EQ("foo", root.get("user", "no user").asString()); - EXPECT_EQ(true, root.get("authenticated", false).asBool()); - - RestClient::clearAuth(); - res = RestClient::get("http://httpbin.org/basic-auth/foo/bar"); - EXPECT_EQ(401, res.code); -} - diff --git a/test/test_restclient_post.cpp b/test/test_restclient_post.cpp deleted file mode 100644 index fdf34df7..00000000 --- a/test/test_restclient_post.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "restclient-cpp/restclient.h" -#include -#include -#include - -class RestClientPostTest : public ::testing::Test -{ - protected: - std::string url; - std::string ctype; - std::string data; - - RestClientPostTest() - { - } - - virtual ~RestClientPostTest() - { - } - - virtual void SetUp() - { - url = "http://httpbin.org/post"; - ctype = "Content-Type: text/text"; - data = "data"; - } - - virtual void TearDown() - { - } - -}; - -// Tests -// check return code -TEST_F(RestClientPostTest, TestRestClientPOSTCode) -{ - RestClient::response res = RestClient::post(url, ctype, data); - EXPECT_EQ(200, res.code); -} -TEST_F(RestClientPostTest, TestRestClientPostBody) -{ - RestClient::response res = RestClient::post(url, ctype, data); - Json::Value root; - std::istringstream str(res.body); - str >> root; - - EXPECT_EQ("http://httpbin.org/post", root.get("url", "no url set").asString()); - EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); -} -// check for failure -TEST_F(RestClientPostTest, TestRestClientFailureCode) -{ - std::string u = "http://nonexistent"; - RestClient::response res = RestClient::post(u, ctype, data); - EXPECT_EQ(-1, res.code); -} -TEST_F(RestClientPostTest, TestRestClientPOSTHeaders) -{ - RestClient::response res = RestClient::post(url, ctype, data); - EXPECT_EQ("keep-alive", res.headers["Connection"]); -} - -/*TEST_F(RestClientPostTest, TestRestClientPOSTTimeout) -{ - std::string u = "http://httpbin.org/delay/10"; - RestClient::response res = RestClient::post(u, ctype, data, 5); - EXPECT_EQ(28, res.code); -}*/ - diff --git a/test/test_restclient_put.cpp b/test/test_restclient_put.cpp deleted file mode 100644 index cdb94093..00000000 --- a/test/test_restclient_put.cpp +++ /dev/null @@ -1,69 +0,0 @@ -#include "restclient-cpp/restclient.h" -#include -#include -#include - -class RestClientPutTest : public ::testing::Test -{ - protected: - std::string url; - std::string ctype; - std::string data; - - RestClientPutTest() - { - } - - virtual ~RestClientPutTest() - { - } - - virtual void SetUp() - { - url = "http://httpbin.org/put"; - ctype = "Content-Type: text/text"; - data = "data"; - } - - virtual void TearDown() - { - } - -}; - -// Tests -// check return code -TEST_F(RestClientPutTest, TestRestClientPUTCode) -{ - RestClient::response res = RestClient::put(url, ctype, data); - EXPECT_EQ(200, res.code); -} -TEST_F(RestClientPutTest, TestRestClientPutBody) -{ - RestClient::response res = RestClient::put(url, ctype, data); - Json::Value root; - std::istringstream str(res.body); - str >> root; - - EXPECT_EQ("http://httpbin.org/put", root.get("url", "no url set").asString()); - EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); -} -// check for failure -TEST_F(RestClientPutTest, TestRestClientFailureCode) -{ - std::string u = "http://nonexistent"; - RestClient::response res = RestClient::put(u, ctype, data); - EXPECT_EQ(-1, res.code); -} -TEST_F(RestClientPutTest, TestRestClientPUTHeaders) -{ - RestClient::response res = RestClient::put(url, ctype, data); - EXPECT_EQ("keep-alive", res.headers["Connection"]); -} - -/*TEST_F(RestClientPutTest, TestRestClientPUTTimeout) -{ - std::string u = "http://httpbin.org/delay/10"; - RestClient::response res = RestClient::put(u, ctype, data, 5); - EXPECT_EQ(28, res.code); -}*/ From c39ad6069db6d97dee242f5b31b08b16b5bf0507 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 18 Jan 2016 21:34:43 -0500 Subject: [PATCH 084/212] exclude the trim functions from linting --- include/restclient-cpp/helpers.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/restclient-cpp/helpers.h b/include/restclient-cpp/helpers.h index 5ae5670e..a80b21cf 100644 --- a/include/restclient-cpp/helpers.h +++ b/include/restclient-cpp/helpers.h @@ -50,21 +50,21 @@ namespace Helpers { void *userdata); // trim from start - static inline std::string <rim(std::string &s) { + static inline std::string <rim(std::string &s) { // NOLINT s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun(std::isspace)))); return s; } // trim from end - static inline std::string &rtrim(std::string &s) { + static inline std::string &rtrim(std::string &s) { // NOLINT s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun(std::isspace))).base(), s.end()); return s; } // trim from both ends - static inline std::string &trim(std::string &s) { + static inline std::string &trim(std::string &s) { // NOLINT return ltrim(rtrim(s)); } }; // namespace Helpers From 9f9a55c3b1b207f9b2cd294fbdb59d0ad39fd2f5 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 18 Jan 2016 21:37:00 -0500 Subject: [PATCH 085/212] make connection.cc pass cpplint --- include/restclient-cpp/connection.h | 1 - source/connection.cc | 48 +++++++++++++++++------------ 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index 68663291..7ac60a7e 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -27,7 +27,6 @@ namespace RestClient { */ class Connection { public: - /** * @struct Info * @brief holds some diagnostics information diff --git a/source/connection.cc b/source/connection.cc index bece5526..d9008540 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -18,9 +18,8 @@ #include "restclient-cpp/helpers.h" #include "restclient-cpp/version.h" -using namespace RestClient; - -Connection::Connection(const std::string baseUrl) : infoStruct(), headerFields() { +RestClient::Connection::Connection(const std::string baseUrl) + : infoStruct(), headerFields() { this->curlHandle = curl_easy_init(); if (!this->curlHandle) { throw std::runtime_error("Couldn't initialize curl handle"); @@ -28,7 +27,7 @@ Connection::Connection(const std::string baseUrl) : infoStruct(), headerFields() this->baseUrl = baseUrl; } -Connection::~Connection() { +RestClient::Connection::~Connection() { if (this->curlHandle) { curl_easy_cleanup(this->curlHandle); } @@ -43,9 +42,9 @@ Connection::~Connection() { * @param value for the header field * */ -void Connection::AppendHeader(const std::string& key, +void +RestClient::Connection::AppendHeader(const std::string& key, const std::string& value) { - this->headerFields[key] = value; } @@ -65,9 +64,10 @@ void Connection::AppendHeader(const std::string& key, * * @return 0 on success and 1 on error */ -Response Connection::performCurlRequest(const std::string& uri) { - - Response ret = {}; +RestClient::Response +RestClient::Connection::performCurlRequest(const std::string& uri) { + // init return type + RestClient::Response ret = {}; std::string url = std::string(this->baseUrl + uri); std::string headerString; @@ -77,11 +77,13 @@ Response Connection::performCurlRequest(const std::string& uri) { /** set query URL */ curl_easy_setopt(this->curlHandle, CURLOPT_URL, url.c_str()); /** set callback function */ - curl_easy_setopt(this->curlHandle, CURLOPT_WRITEFUNCTION, Helpers::write_callback); + curl_easy_setopt(this->curlHandle, CURLOPT_WRITEFUNCTION, + Helpers::write_callback); /** set data object to pass to callback function */ curl_easy_setopt(this->curlHandle, CURLOPT_WRITEDATA, &ret); /** set the header callback function */ - curl_easy_setopt(this->curlHandle, CURLOPT_HEADERFUNCTION, Helpers::header_callback); + curl_easy_setopt(this->curlHandle, CURLOPT_HEADERFUNCTION, + Helpers::header_callback); /** callback object for headers */ curl_easy_setopt(this->curlHandle, CURLOPT_HEADERDATA, &ret); /** set http headers */ @@ -92,9 +94,11 @@ Response Connection::performCurlRequest(const std::string& uri) { headerString += it->second; headerList = curl_slist_append(headerList, headerString.c_str()); } - curl_easy_setopt(this->curlHandle, CURLOPT_HTTPHEADER, headerList); + curl_easy_setopt(this->curlHandle, CURLOPT_HTTPHEADER, + headerList); /** set user agent */ - curl_easy_setopt(this->curlHandle, CURLOPT_USERAGENT, this->GetUserAgent().c_str()); + curl_easy_setopt(this->curlHandle, CURLOPT_USERAGENT, + this->GetUserAgent().c_str()); // set timeout if (this->timeout) { @@ -116,7 +120,7 @@ Response Connection::performCurlRequest(const std::string& uri) { curl_easy_getinfo(this->curlHandle, CURLINFO_RESPONSE_CODE, &http_code); ret.code = static_cast(http_code); - // TODO: get metrics from curl handle + // TODO(mrtazz): get metrics from curl handle // free header list curl_slist_free_all(headerList); // reset curl handle @@ -131,7 +135,8 @@ Response Connection::performCurlRequest(const std::string& uri) { * * @return response struct */ -Response Connection::get(const std::string& url) { +RestClient::Response +RestClient::Connection::get(const std::string& url) { return this->performCurlRequest(url); } /** @@ -143,8 +148,9 @@ Response Connection::get(const std::string& url) { * * @return response struct */ -Response Connection::post(const std::string& url, - const std::string& data) { +RestClient::Response +RestClient::Connection::post(const std::string& url, + const std::string& data) { /** Now specify we want to POST data */ curl_easy_setopt(this->curlHandle, CURLOPT_POST, 1L); /** set post fields */ @@ -162,8 +168,9 @@ Response Connection::post(const std::string& url, * * @return response struct */ -Response Connection::put(const std::string& url, - const std::string& data) { +RestClient::Response +RestClient::Connection::put(const std::string& url, + const std::string& data) { /** initialize upload object */ RestClient::Helpers::UploadObject up_obj; up_obj.data = data.c_str(); @@ -190,7 +197,8 @@ Response Connection::put(const std::string& url, * * @return response struct */ -Response Connection::del(const std::string& url) { +RestClient::Response +RestClient::Connection::del(const std::string& url) { /** we want HTTP DELETE */ const char* http_delete = "DELETE"; From 4d82b227fa5653ab081f450727c5b91ab3b18d04 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 18 Jan 2016 21:37:27 -0500 Subject: [PATCH 086/212] properly delete the connection object this properly gets rid of the connection object in the static API methods --- source/restclient.cc | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/source/restclient.cc b/source/restclient.cc index bbfbc834..5b1b07e0 100644 --- a/source/restclient.cc +++ b/source/restclient.cc @@ -24,8 +24,11 @@ * @return response struct */ RestClient::Response RestClient::get(const std::string& url) { + RestClient::Response ret; RestClient::Connection *conn = new RestClient::Connection(""); - return conn->get(url); + ret = conn->get(url); + delete conn; + return ret; } /** @@ -40,9 +43,12 @@ RestClient::Response RestClient::get(const std::string& url) { RestClient::Response RestClient::post(const std::string& url, const std::string& ctype, const std::string& data) { + RestClient::Response ret; RestClient::Connection *conn = new RestClient::Connection(""); conn->AppendHeader("Content-Type", ctype); - return conn->post(url, data); + ret = conn->post(url, data); + delete conn; + return ret; } /** @@ -57,9 +63,12 @@ RestClient::Response RestClient::post(const std::string& url, RestClient::Response RestClient::put(const std::string& url, const std::string& ctype, const std::string& data) { + RestClient::Response ret; RestClient::Connection *conn = new RestClient::Connection(""); conn->AppendHeader("Content-Type", ctype); - return conn->put(url, data); + ret = conn->put(url, data); + delete conn; + return ret; } /** @@ -70,7 +79,10 @@ RestClient::Response RestClient::put(const std::string& url, * @return response struct */ RestClient::Response RestClient::del(const std::string& url) { + RestClient::Response ret; RestClient::Connection *conn = new RestClient::Connection(""); - return conn->del(url); + ret = conn->del(url); + delete conn; + return ret; } From 194b3aaff56c5b9fb189585d893abf0af3c3e83c Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 18 Jan 2016 21:38:10 -0500 Subject: [PATCH 087/212] implement method for GetUserAgent() --- source/connection.cc | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/source/connection.cc b/source/connection.cc index d9008540..7d1f87e3 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -48,7 +48,19 @@ RestClient::Connection::AppendHeader(const std::string& key, this->headerFields[key] = value; } - +/** + * @brief get the user agent to add to the request + * + * @return user agent as std::string + */ +std::string +RestClient::Connection::GetUserAgent() { + std::string prefix; + if (this->customUserAgent.length() > 0) { + prefix = this->customUserAgent + " "; + } + return std::string(prefix + "restclient-cpp/" + RESTCLIENT_VERSION); +} /** From 2eaf08d5ce36ecf7fe22f38035866621dd290e2e Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 18 Jan 2016 21:38:23 -0500 Subject: [PATCH 088/212] fix a bug for failed query this would previously always set the ret.code to the curl response code, even if the query failed. Maybe we want to switch to that in the future, but for now we return -1 for invalid queries still. --- source/connection.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/connection.cc b/source/connection.cc index 7d1f87e3..650bfbfe 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -127,10 +127,11 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { ret.body = "Failed to query."; ret.code = -1; + } else { + int64_t http_code = 0; + curl_easy_getinfo(this->curlHandle, CURLINFO_RESPONSE_CODE, &http_code); + ret.code = static_cast(http_code); } - int64_t http_code = 0; - curl_easy_getinfo(this->curlHandle, CURLINFO_RESPONSE_CODE, &http_code); - ret.code = static_cast(http_code); // TODO(mrtazz): get metrics from curl handle // free header list From d17258006a8f30909b5d0baee9ac214b2dc6e337 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 19 Jan 2016 06:49:50 -0500 Subject: [PATCH 089/212] properly include cstring and reference std::memcpy --- source/helpers.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/helpers.cc b/source/helpers.cc index 6b9adee2..a337f263 100644 --- a/source/helpers.cc +++ b/source/helpers.cc @@ -5,6 +5,9 @@ */ #include "restclient-cpp/helpers.h" + +#include + #include "restclient-cpp/restclient.h" /** @@ -78,7 +81,7 @@ size_t RestClient::Helpers::read_callback(void *data, size_t size, size_t curl_size = size * nmemb; size_t copy_size = (u->length < curl_size) ? u->length : curl_size; /** copy data to buffer */ - memcpy(data, u->data, copy_size); + std::memcpy(data, u->data, copy_size); /** decrement length and increment data pointer */ u->length -= copy_size; u->data += copy_size; From 7913f8b9627148a7c59ea48f2542013c873531a3 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 19 Jan 2016 07:03:39 -0500 Subject: [PATCH 090/212] add unit test for URL based basic auth in simple API --- test/test_restclient.cc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/test_restclient.cc b/test/test_restclient.cc index b1d7be60..1ac520d7 100644 --- a/test/test_restclient.cc +++ b/test/test_restclient.cc @@ -147,3 +147,18 @@ TEST_F(RestClientTest, TestRestClientPUTHeaders) RestClient::Response res = RestClient::put("http://httpbin.org/put", "text/text", "data"); EXPECT_EQ("keep-alive", res.headers["Connection"]); } +TEST_F(RestClientTest, TestRestClientAuth) +{ + RestClient::Response res = RestClient::get("http://foo:bar@httpbin.org/basic-auth/foo/bar"); + EXPECT_EQ(200, res.code); + + Json::Value root; + std::istringstream str(res.body); + str >> root; + + EXPECT_EQ("foo", root.get("user", "no user").asString()); + EXPECT_EQ(true, root.get("authenticated", false).asBool()); + + res = RestClient::get("http://httpbin.org/basic-auth/foo/bar"); + EXPECT_EQ(401, res.code); +} From e66150d7e5b55f1bdb1bd69340a993c0737d789d Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 19 Jan 2016 07:04:12 -0500 Subject: [PATCH 091/212] add unit test suite for RestClient::Connection this adds a timeout test as the first unit test --- Makefile.am | 2 +- source/connection.cc | 11 +++++++++++ test/test_connection.cc | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 test/test_connection.cc diff --git a/Makefile.am b/Makefile.am index 16037137..89ba7b36 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4,7 +4,7 @@ check_PROGRAMS = test-program pkginclude_HEADERS = include/restclient-cpp/restclient.h include/restclient-cpp/version.h BUILT_SOURCES = include/restclient-cpp/version.h -test_program_SOURCES = vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp test/tests.cpp test/test_restclient.cc +test_program_SOURCES = vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp test/tests.cpp test/test_restclient.cc test/test_connection.cc test_program_LDADD = .libs/librestclient-cpp.a test_program_LDFLAGS=-Lvendor/gtest-1.7.0/lib/.libs -lgtest test_program_CPPFLAGS=-Iinclude -Ivendor/gtest-1.7.0/include -Ivendor/jsoncpp-0.10.5/dist diff --git a/source/connection.cc b/source/connection.cc index 650bfbfe..87e912d8 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -62,6 +62,17 @@ RestClient::Connection::GetUserAgent() { return std::string(prefix + "restclient-cpp/" + RESTCLIENT_VERSION); } +/** + * @brief set timeout for connection + * + * @param timeout in seconds + * + */ +void +RestClient::Connection::SetTimeout(int seconds) { + this->timeout = seconds; +} + /** * @brief helper function to get called from the actual request methods to diff --git a/test/test_connection.cc b/test/test_connection.cc new file mode 100644 index 00000000..c029ad44 --- /dev/null +++ b/test/test_connection.cc @@ -0,0 +1,40 @@ +#include "restclient-cpp/restclient.h" +#include "restclient-cpp/connection.h" +#include +#include +#include + +class ConnectionTest : public ::testing::Test +{ + protected: + + RestClient::Connection* conn; + + ConnectionTest() + { + conn = NULL; + } + + virtual ~ConnectionTest() + { + } + + virtual void SetUp() + { + conn = new RestClient::Connection("http://httpbin.org"); + } + + virtual void TearDown() + { + delete conn; + } + +}; + +TEST_F(ConnectionTest, TestTimeout) +{ + std::string uri = "/delay/5"; + conn->SetTimeout(2); + RestClient::Response res = conn->get(uri); + EXPECT_EQ(28, res.code); +} From 5ed96d575b268f96fe5865d00847d117011870af Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 19 Jan 2016 07:04:51 -0500 Subject: [PATCH 092/212] fix return code for the timeout case --- source/connection.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/connection.cc b/source/connection.cc index 87e912d8..4fa55145 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -134,10 +134,10 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { if (res == CURLE_OPERATION_TIMEDOUT) { ret.code = res; ret.body = "Operation Timeout."; + } else { + ret.body = "Failed to query."; + ret.code = -1; } - - ret.body = "Failed to query."; - ret.code = -1; } else { int64_t http_code = 0; curl_easy_getinfo(this->curlHandle, CURLINFO_RESPONSE_CODE, &http_code); From cdf2d974a588f97a1d6fb3ad6c121e7a6574e612 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 25 Jan 2016 07:14:41 -0500 Subject: [PATCH 093/212] implement custom user agent feature --- source/connection.cc | 15 +++++++++++++-- test/test_connection.cc | 25 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/source/connection.cc b/source/connection.cc index 4fa55145..282477b0 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -48,6 +48,18 @@ RestClient::Connection::AppendHeader(const std::string& key, this->headerFields[key] = value; } +/** + * @brief set custom user agent for connection. This gets prepended to the + * default restclient-cpp/RESTCLIENT_VERSION string + * + * @param userAgent - custom userAgent prefix + * + */ +void +RestClient::Connection::SetUserAgent(const std::string& userAgent) { + this->customUserAgent = userAgent; +} + /** * @brief get the user agent to add to the request * @@ -59,7 +71,7 @@ RestClient::Connection::GetUserAgent() { if (this->customUserAgent.length() > 0) { prefix = this->customUserAgent + " "; } - return std::string(prefix + "restclient-cpp/" + RESTCLIENT_VERSION); + return std::string(prefix + "restclient-cpp/" + RESTCLIENT_VERSION); } /** @@ -73,7 +85,6 @@ RestClient::Connection::SetTimeout(int seconds) { this->timeout = seconds; } - /** * @brief helper function to get called from the actual request methods to * prepare the curlHandle for transfer with generic options, perform the diff --git a/test/test_connection.cc b/test/test_connection.cc index c029ad44..d555e08e 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -38,3 +38,28 @@ TEST_F(ConnectionTest, TestTimeout) RestClient::Response res = conn->get(uri); EXPECT_EQ(28, res.code); } + +TEST_F(ConnectionTest, TestDefaultUserAgent) +{ + RestClient::Response res = conn->get("/get"); + Json::Value root; + std::istringstream str(res.body); + str >> root; + + EXPECT_EQ("http://httpbin.org/get", root.get("url", "no url set").asString()); + EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, + root["headers"].get("User-Agent", "nope/nope").asString()); +} + +TEST_F(ConnectionTest, TestCustomUserAgent) +{ + conn->SetUserAgent("foobar/1.2.3"); + RestClient::Response res = conn->get("/get"); + Json::Value root; + std::istringstream str(res.body); + str >> root; + + EXPECT_EQ("http://httpbin.org/get", root.get("url", "no url set").asString()); + EXPECT_EQ("foobar/1.2.3 restclient-cpp/" RESTCLIENT_VERSION, + root["headers"].get("User-Agent", "nope/nope").asString()); +} From a8cb9c589ca4534de8d419ca93a67a44e6c125a9 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 25 Jan 2016 07:25:09 -0500 Subject: [PATCH 094/212] implement Basic Auth on Connection object --- source/connection.cc | 22 ++++++++++++++++++++++ test/test_connection.cc | 18 ++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/source/connection.cc b/source/connection.cc index 282477b0..b660ebad 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -85,6 +85,20 @@ RestClient::Connection::SetTimeout(int seconds) { this->timeout = seconds; } +/** + * @brief set username and password for basic auth + * + * @param username + * @param password + * + */ +void +RestClient::Connection::SetBasicAuth(const std::string& username, + const std::string& password) { + this->basicAuth.username = username; + this->basicAuth.password = password; +} + /** * @brief helper function to get called from the actual request methods to * prepare the curlHandle for transfer with generic options, perform the @@ -130,6 +144,14 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { } curl_easy_setopt(this->curlHandle, CURLOPT_HTTPHEADER, headerList); + + // set basic auth if configured + if (this->basicAuth.username.length() > 0) { + std::string authString = std::string(this->basicAuth.username + ":" + + this->basicAuth.password); + curl_easy_setopt(this->curlHandle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + curl_easy_setopt(this->curlHandle, CURLOPT_USERPWD, authString.c_str()); + } /** set user agent */ curl_easy_setopt(this->curlHandle, CURLOPT_USERAGENT, this->GetUserAgent().c_str()); diff --git a/test/test_connection.cc b/test/test_connection.cc index d555e08e..a9551f97 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -63,3 +63,21 @@ TEST_F(ConnectionTest, TestCustomUserAgent) EXPECT_EQ("foobar/1.2.3 restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "nope/nope").asString()); } + +TEST_F(ConnectionTest, TestBasicAuth) +{ + RestClient::Response res = conn->get("/basic-auth/foo/bar"); + EXPECT_EQ(401, res.code); + + conn->SetBasicAuth("foo", "bar"); + res = conn->get("/basic-auth/foo/bar"); + EXPECT_EQ(200, res.code); + + Json::Value root; + std::istringstream str(res.body); + str >> root; + + EXPECT_EQ("foo", root.get("user", "no user").asString()); + EXPECT_EQ(true, root.get("authenticated", false).asBool()); + +} From b88ab3b9e7bfaf16819afa5e84622bead0ee56dc Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 26 Jan 2016 07:31:58 -0500 Subject: [PATCH 095/212] implement RestClient::init() and RestClient::disable() --- include/restclient-cpp/restclient.h | 4 ++-- source/restclient.cc | 24 +++++++++++++++++++++++- test/test_restclient.cc | 2 ++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index 9716b1b0..18969922 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -41,8 +41,8 @@ typedef struct { HeaderFields headers; } Response; -// init function -void init(); +// init and disable functions +int init(); void disable(); /** diff --git a/source/restclient.cc b/source/restclient.cc index 5b1b07e0..f5fd8ed8 100644 --- a/source/restclient.cc +++ b/source/restclient.cc @@ -12,10 +12,32 @@ */ #include "restclient-cpp/restclient.h" -#include "restclient-cpp/version.h" +#include + +#include "restclient-cpp/version.h" #include "restclient-cpp/connection.h" +/** + * @brief global init function. Call this before you start any threads. + */ +int RestClient::init() { + CURLcode res = curl_global_init(CURL_GLOBAL_ALL); + if (res == CURLE_OK) { + return 0; + } else { + return 1; + } +} + +/** + * @brief global disable function. Call this before you terminate your + * program. + */ +void RestClient::disable() { + curl_global_cleanup(); +} + /** * @brief HTTP GET method * diff --git a/test/test_restclient.cc b/test/test_restclient.cc index 1ac520d7..122148fc 100644 --- a/test/test_restclient.cc +++ b/test/test_restclient.cc @@ -17,10 +17,12 @@ class RestClientTest : public ::testing::Test virtual void SetUp() { + RestClient::init(); } virtual void TearDown() { + RestClient::disable(); } }; From 23ae9876ef4e025cc541be2e45dd1c2cf85af919 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 30 Jan 2016 15:55:20 -0500 Subject: [PATCH 096/212] fix README for SetHeaders() example --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ad667ac3..91fec66d 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ conn->SetTimeout(5); conn->SetUserAgent("foo/cool"); // set headers -RestClient::headermap headers; +RestClient::HeaderFields headers; headers["Accept"] = "application/json"; conn->SetHeaders(headers) From f331155d25c3c2f708a35cd030cb1c59bccd299e Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 30 Jan 2016 15:55:40 -0500 Subject: [PATCH 097/212] implement SetHeader/GetHeader for Connection --- source/connection.cc | 24 +++++++++++++++++++++- test/test_connection.cc | 44 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/source/connection.cc b/source/connection.cc index b660ebad..ae882566 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -44,10 +44,32 @@ RestClient::Connection::~Connection() { */ void RestClient::Connection::AppendHeader(const std::string& key, - const std::string& value) { + const std::string& value) { this->headerFields[key] = value; } +/** + * @brief set the custom headers map. This will replace the currently + * configured headers with the provided ones. If you want to add additional + * headers, use AppendHeader() + * + * @param headers to set + */ +void +RestClient::Connection::SetHeaders(RestClient::HeaderFields headers) { + this->headerFields = headers; +} + +/** + * @brief get all custom headers set on the connection + * + * @returns a RestClient::HeaderFields map containing the custom headers + */ +RestClient::HeaderFields +RestClient::Connection::GetHeaders() { + return this->headerFields; +} + /** * @brief set custom user agent for connection. This gets prepended to the * default restclient-cpp/RESTCLIENT_VERSION string diff --git a/test/test_connection.cc b/test/test_connection.cc index a9551f97..b64d7d80 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -81,3 +81,47 @@ TEST_F(ConnectionTest, TestBasicAuth) EXPECT_EQ(true, root.get("authenticated", false).asBool()); } + +TEST_F(ConnectionTest, TestSetHeaders) +{ + RestClient::HeaderFields headers; + headers["Foo"] = "bar"; + headers["Bla"] = "lol"; + conn->SetHeaders(headers); + RestClient::Response res = conn->get("/headers"); + EXPECT_EQ(200, res.code); + + Json::Value root; + std::istringstream str(res.body); + str >> root; + EXPECT_EQ("bar", root["headers"].get("Foo", "").asString()); + EXPECT_EQ("lol", root["headers"].get("Bla", "").asString()); + + // let's replace the headers now + RestClient::HeaderFields headers_again; + headers_again["foo"] = "bob"; + conn->SetHeaders(headers_again); + res = conn->get("/headers"); + EXPECT_EQ(200, res.code); + + std::istringstream str2(res.body); + str2 >> root; + EXPECT_EQ("bob", root["headers"].get("Foo", "").asString()); + // this shouldn't be set anymore + EXPECT_EQ("", root["headers"].get("Bla", "").asString()); +} + +TEST_F(ConnectionTest, TestGetHeaders) +{ + RestClient::HeaderFields headers; + headers["Foo"] = "bar"; + headers["Bla"] = "lol"; + conn->SetHeaders(headers); + RestClient::Response res = conn->get("/headers"); + EXPECT_EQ(200, res.code); + + RestClient::HeaderFields headers_returned = conn->GetHeaders(); + EXPECT_EQ("bar", headers_returned["Foo"]); + EXPECT_EQ("lol", headers_returned["Bla"]); + +} From 7bec775aee7b510162b296062bef3978e1f68b0a Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 31 Jan 2016 11:31:59 -0500 Subject: [PATCH 098/212] implement connection info retrieval this implements the method to return an Info struct from the connection object. It contains the configuration of the object as well as metrics about the last request. --- include/restclient-cpp/connection.h | 53 ++++++++++++++++++----------- source/connection.cc | 38 +++++++++++++++++++-- test/test_connection.cc | 34 ++++++++++++++++-- 3 files changed, 100 insertions(+), 25 deletions(-) diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index 7ac60a7e..8dd80a41 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -28,44 +28,51 @@ namespace RestClient { class Connection { public: /** - * @struct Info + * @struct RequestInfo * @brief holds some diagnostics information - * about the connection object it came from + * about a request */ typedef struct { - std::string base_url; - RestClient::HeaderFields headers; - int timeout; - struct { - std::string username; - std::string password; - } basicAuth; - std::string customUserAgent; - struct { // total time of the last request in seconds Total time of previous // transfer. See CURLINFO_TOTAL_TIME - int totalTime; + double totalTime; // time spent in DNS lookup in seconds Time from start until name // resolving completed. See CURLINFO_NAMELOOKUP_TIME - int nameLookupTime; + double nameLookupTime; // time it took until Time from start until remote host or proxy // completed. See CURLINFO_CONNECT_TIME - int connectTime; + double connectTime; // Time from start until SSL/SSH handshake completed. See // CURLINFO_APPCONNECT_TIME - int appConnectTime; + double appConnectTime; // Time from start until just before the transfer begins. See // CURLINFO_PRETRANSFER_TIME - int preTransferTime; + double preTransferTime; // Time from start until just when the first byte is received. See // CURLINFO_STARTTRANSFER_TIME - int startTransferTime; + double startTransferTime; // Time taken for all redirect steps before the final transfer. See // CURLINFO_REDIRECT_TIME - int redirectTime; + double redirectTime; // number of redirects followed. See CURLINFO_REDIRECT_COUNT int redirectCount; - } lastRequest; + } RequestInfo; + /** + * @struct Info + * @brief holds some diagnostics information + * about the connection object it came from + */ + typedef struct { + std::string baseUrl; + RestClient::HeaderFields headers; + int timeout; + bool followRedirects; + struct { + std::string username; + std::string password; + } basicAuth; + std::string customUserAgent; + RequestInfo lastRequest; } Info; @@ -80,12 +87,18 @@ class Connection { // set connection timeout to seconds void SetTimeout(int seconds); + // set whether to follow redirects + // TODO(mrtazz): implement this + void FollowRedirects(bool follow); + // set custom user agent // (this will result in the UA "foo/cool restclient-cpp/VERSION") void SetUserAgent(const std::string& userAgent); std::string GetUserAgent(); + RestClient::Connection::Info GetInfo(); + // set headers void SetHeaders(RestClient::HeaderFields headers); @@ -115,7 +128,7 @@ class Connection { std::string password; } basicAuth; std::string customUserAgent; - Info infoStruct; + RequestInfo lastRequest; RestClient::Response performCurlRequest(const std::string& uri); }; }; // namespace RestClient diff --git a/source/connection.cc b/source/connection.cc index ae882566..beffe134 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -19,7 +19,7 @@ #include "restclient-cpp/version.h" RestClient::Connection::Connection(const std::string baseUrl) - : infoStruct(), headerFields() { + : lastRequest(), headerFields() { this->curlHandle = curl_easy_init(); if (!this->curlHandle) { throw std::runtime_error("Couldn't initialize curl handle"); @@ -35,6 +35,25 @@ RestClient::Connection::~Connection() { // getters/setters +/** + * @brief get diagnostic information about the connection object + * + * @return RestClient::Connection::Info struct + */ +RestClient::Connection::Info +RestClient::Connection::GetInfo() { + RestClient::Connection::Info ret; + ret.baseUrl = this->baseUrl; + ret.headers = this->GetHeaders(); + ret.timeout = this->timeout; + ret.basicAuth.username = this->basicAuth.username; + ret.basicAuth.password = this->basicAuth.password; + ret.customUserAgent = this->customUserAgent; + ret.lastRequest = this->lastRequest; + + return ret; +} + /** * @brief append a header to the internal map * @@ -199,7 +218,22 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { ret.code = static_cast(http_code); } - // TODO(mrtazz): get metrics from curl handle + curl_easy_getinfo(this->curlHandle, CURLINFO_TOTAL_TIME, + &this->lastRequest.totalTime); + curl_easy_getinfo(this->curlHandle, CURLINFO_NAMELOOKUP_TIME, + &this->lastRequest.nameLookupTime); + curl_easy_getinfo(this->curlHandle, CURLINFO_CONNECT_TIME, + &this->lastRequest.connectTime); + curl_easy_getinfo(this->curlHandle, CURLINFO_APPCONNECT_TIME, + &this->lastRequest.appConnectTime); + curl_easy_getinfo(this->curlHandle, CURLINFO_PRETRANSFER_TIME, + &this->lastRequest.preTransferTime); + curl_easy_getinfo(this->curlHandle, CURLINFO_STARTTRANSFER_TIME, + &this->lastRequest.startTransferTime); + curl_easy_getinfo(this->curlHandle, CURLINFO_REDIRECT_TIME, + &this->lastRequest.redirectTime); + curl_easy_getinfo(this->curlHandle, CURLINFO_REDIRECT_COUNT, + &this->lastRequest.redirectCount); // free header list curl_slist_free_all(headerList); // reset curl handle diff --git a/test/test_connection.cc b/test/test_connection.cc index b64d7d80..535d5788 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -21,7 +21,7 @@ class ConnectionTest : public ::testing::Test virtual void SetUp() { - conn = new RestClient::Connection("http://httpbin.org"); + conn = new RestClient::Connection("https://httpbin.org"); } virtual void TearDown() @@ -46,7 +46,7 @@ TEST_F(ConnectionTest, TestDefaultUserAgent) std::istringstream str(res.body); str >> root; - EXPECT_EQ("http://httpbin.org/get", root.get("url", "no url set").asString()); + EXPECT_EQ("https://httpbin.org/get", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "nope/nope").asString()); } @@ -59,7 +59,7 @@ TEST_F(ConnectionTest, TestCustomUserAgent) std::istringstream str(res.body); str >> root; - EXPECT_EQ("http://httpbin.org/get", root.get("url", "no url set").asString()); + EXPECT_EQ("https://httpbin.org/get", root.get("url", "no url set").asString()); EXPECT_EQ("foobar/1.2.3 restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "nope/nope").asString()); } @@ -125,3 +125,31 @@ TEST_F(ConnectionTest, TestGetHeaders) EXPECT_EQ("lol", headers_returned["Bla"]); } + +TEST_F(ConnectionTest, TestGetInfo) +{ + RestClient::HeaderFields headers; + headers["Foo"] = "bar"; + headers["Bla"] = "lol"; + conn->SetHeaders(headers); + conn->SetBasicAuth("foo", "bar"); + conn->SetTimeout(2); + conn->SetUserAgent("foobar/1.2.3"); + conn->get("/get"); + RestClient::Connection::Info info = conn->GetInfo(); + EXPECT_EQ("bar", info.headers["Foo"]); + EXPECT_EQ("lol", info.headers["Bla"]); + EXPECT_EQ("foo", info.basicAuth.username); + EXPECT_EQ("bar", info.basicAuth.password); + EXPECT_EQ("foobar/1.2.3", info.customUserAgent); + EXPECT_EQ(2, info.timeout); + EXPECT_EQ("https://httpbin.org", info.baseUrl); + EXPECT_NE(0, info.lastRequest.totalTime); + EXPECT_NE(0, info.lastRequest.connectTime); + EXPECT_NE(0, info.lastRequest.nameLookupTime); + EXPECT_NE(0, info.lastRequest.appConnectTime); + EXPECT_NE(0, info.lastRequest.preTransferTime); + EXPECT_NE(0, info.lastRequest.startTransferTime); + EXPECT_EQ(0, info.lastRequest.redirectTime); + EXPECT_EQ(0, info.lastRequest.redirectCount); +} From fda9c945b9b78e76c7f2b616817c83e785b2c532 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 31 Jan 2016 11:41:49 -0500 Subject: [PATCH 099/212] implement FollowRedirects --- README.md | 3 +++ include/restclient-cpp/connection.h | 1 + source/connection.cc | 14 ++++++++++++++ test/test_connection.cc | 19 +++++++++++++++++++ 4 files changed, 37 insertions(+) diff --git a/README.md b/README.md index 91fec66d..5f5c7857 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,9 @@ conn->SetTimeout(5); // (this will result in the UA "foo/cool restclient-cpp/VERSION") conn->SetUserAgent("foo/cool"); +// enable following of redirects (default is off) +conn->FollowRedirects(true); + // set headers RestClient::HeaderFields headers; headers["Accept"] = "application/json"; diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index 8dd80a41..78f261cb 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -123,6 +123,7 @@ class Connection { std::string baseUrl; RestClient::HeaderFields headerFields; int timeout; + bool followRedirects; struct { std::string username; std::string password; diff --git a/source/connection.cc b/source/connection.cc index beffe134..93148b2c 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -89,6 +89,16 @@ RestClient::Connection::GetHeaders() { return this->headerFields; } +/** + * @brief configure whether to follow redirects on this connection + * + * @param follow - boolean whether to follow redirects + */ +void +RestClient::Connection::FollowRedirects(bool follow) { + this->followRedirects = follow; +} + /** * @brief set custom user agent for connection. This gets prepended to the * default restclient-cpp/RESTCLIENT_VERSION string @@ -203,6 +213,10 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { // dont want to get a sig alarm on timeout curl_easy_setopt(this->curlHandle, CURLOPT_NOSIGNAL, 1); } + // set follow redirect + if (this->followRedirects == true) { + curl_easy_setopt(this->curlHandle, CURLOPT_FOLLOWLOCATION, 1L); + } res = curl_easy_perform(this->curlHandle); if (res != CURLE_OK) { if (res == CURLE_OPERATION_TIMEDOUT) { diff --git a/test/test_connection.cc b/test/test_connection.cc index 535d5788..332e6868 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -153,3 +153,22 @@ TEST_F(ConnectionTest, TestGetInfo) EXPECT_EQ(0, info.lastRequest.redirectTime); EXPECT_EQ(0, info.lastRequest.redirectCount); } + +TEST_F(ConnectionTest, TestFollowRedirect) +{ + RestClient::Response res = conn->get("/redirect/2"); + EXPECT_EQ(302, res.code); + conn->FollowRedirects(true); + res = conn->get("/redirect/2"); + EXPECT_EQ(200, res.code); +} + +TEST_F(ConnectionTest, TestGetInfoFromRedirect) +{ + conn->FollowRedirects(true); + RestClient::Response res = conn->get("/redirect/2"); + EXPECT_EQ(200, res.code); + RestClient::Connection::Info info = conn->GetInfo(); + EXPECT_NE(0, info.lastRequest.redirectTime); + EXPECT_NE(0, info.lastRequest.redirectCount); +} From cf51909713151b55a329a107a679c74c0221bc58 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 31 Jan 2016 12:00:18 -0500 Subject: [PATCH 100/212] FollowRedirects is implemented --- include/restclient-cpp/connection.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index 78f261cb..ae070f12 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -88,7 +88,6 @@ class Connection { void SetTimeout(int seconds); // set whether to follow redirects - // TODO(mrtazz): implement this void FollowRedirects(bool follow); // set custom user agent From 1d70443d44a33aba9df2ca5289dd4b7fe6728a10 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 31 Jan 2016 12:18:35 -0500 Subject: [PATCH 101/212] fix all warnings/errors for doxygen documentation --- include/restclient-cpp/connection.h | 58 +++++++++++++++++++++-------- include/restclient-cpp/helpers.h | 6 +-- include/restclient-cpp/restclient.h | 8 ++-- source/connection.cc | 10 +++-- source/helpers.cc | 2 +- 5 files changed, 58 insertions(+), 26 deletions(-) diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index ae070f12..bf628b22 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -31,36 +31,64 @@ class Connection { * @struct RequestInfo * @brief holds some diagnostics information * about a request + * @var RequestInfo::totalTime + * Member 'totalTime' contains the total time of the last request in + * seconds Total time of previous transfer. See CURLINFO_TOTAL_TIME + * @var RequestInfo::nameLookupTime + * Member 'nameLookupTime' contains the time spent in DNS lookup in + * seconds Time from start until name resolving completed. See + * CURLINFO_NAMELOOKUP_TIME + * @var RequestInfo::connectTime + * Member 'connectTime' contains the time it took until Time from start + * until remote host or proxy completed. See CURLINFO_CONNECT_TIME + * @var RequestInfo::appConnectTime + * Member 'appConnectTime' contains the time from start until SSL/SSH + * handshake completed. See CURLINFO_APPCONNECT_TIME + * @var RequestInfo::preTransferTime + * Member 'preTransferTime' contains the total time from start until + * just before the transfer begins. See CURLINFO_PRETRANSFER_TIME + * @var RequestInfo::startTransferTime + * Member 'startTransferTime' contains the total time from start until + * just when the first byte is received. See CURLINFO_STARTTRANSFER_TIME + * @var RequestInfo::redirectTime + * Member 'redirectTime' contains the total time taken for all redirect + * steps before the final transfer. See CURLINFO_REDIRECT_TIME + * @var RequestInfo::redirectCount + * Member 'redirectCount' contains the number of redirects followed. See + * CURLINFO_REDIRECT_COUNT */ typedef struct { - // total time of the last request in seconds Total time of previous - // transfer. See CURLINFO_TOTAL_TIME double totalTime; - // time spent in DNS lookup in seconds Time from start until name - // resolving completed. See CURLINFO_NAMELOOKUP_TIME double nameLookupTime; - // time it took until Time from start until remote host or proxy - // completed. See CURLINFO_CONNECT_TIME double connectTime; - // Time from start until SSL/SSH handshake completed. See - // CURLINFO_APPCONNECT_TIME double appConnectTime; - // Time from start until just before the transfer begins. See - // CURLINFO_PRETRANSFER_TIME double preTransferTime; - // Time from start until just when the first byte is received. See - // CURLINFO_STARTTRANSFER_TIME double startTransferTime; - // Time taken for all redirect steps before the final transfer. See - // CURLINFO_REDIRECT_TIME double redirectTime; - // number of redirects followed. See CURLINFO_REDIRECT_COUNT int redirectCount; } RequestInfo; /** * @struct Info * @brief holds some diagnostics information * about the connection object it came from + * @var Info::baseUrl + * Member 'baseUrl' contains the base URL for the connection object + * @var Info::headers + * Member 'headers' contains the HeaderFields map + * @var Info::timeout + * Member 'timeout' contains the configured timeout + * @var Info::followRedirects + * Member 'followRedirects' contains whether or not to follow redirects + * @var Info::basicAuth + * Member 'basicAuth' contains information about basic auth + * @var basicAuth::username + * Member 'username' contains the basic auth username + * @var basicAuth::password + * Member 'password' contains the basic auth password + * @var Info::customUserAgent + * Member 'customUserAgent' contains the custom user agent + * @var Info::lastRequest + * Member 'lastRequest' contains metrics about the last request */ typedef struct { std::string baseUrl; diff --git a/include/restclient-cpp/helpers.h b/include/restclient-cpp/helpers.h index a80b21cf..8509dfdc 100644 --- a/include/restclient-cpp/helpers.h +++ b/include/restclient-cpp/helpers.h @@ -25,12 +25,12 @@ namespace RestClient { */ namespace Helpers { - /** @struct upload_object + /** @struct UploadObject * @brief This structure represents the payload to upload on POST * requests - * @var upload_object::data + * @var UploadObject::data * Member 'data' contains the data to upload - * @var upload_object::length + * @var UploadObject::length * Member 'length' contains the length of the data to upload */ typedef struct { diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index 18969922..dd011d03 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -26,13 +26,13 @@ namespace RestClient { */ typedef std::map HeaderFields; -/** @struct response +/** @struct Response * @brief This structure represents the HTTP response data - * @var response::code + * @var Response::code * Member 'code' contains the HTTP response code - * @var response::body + * @var Response::body * Member 'body' contains the HTTP response body - * @var response::headers + * @var Response::headers * Member 'headers' contains the HTTP response headers */ typedef struct { diff --git a/source/connection.cc b/source/connection.cc index 93148b2c..25163a6d 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -18,6 +18,12 @@ #include "restclient-cpp/helpers.h" #include "restclient-cpp/version.h" +/** + * @brief constructor for the Connection object + * + * @param baseUrl - base URL for the connection to use + * + */ RestClient::Connection::Connection(const std::string baseUrl) : lastRequest(), headerFields() { this->curlHandle = curl_easy_init(); @@ -128,7 +134,7 @@ RestClient::Connection::GetUserAgent() { /** * @brief set timeout for connection * - * @param timeout in seconds + * @param seconds - timeout in seconds * */ void @@ -270,7 +276,6 @@ RestClient::Connection::get(const std::string& url) { * @brief HTTP POST method * * @param url to query - * @param ctype content type as string * @param data HTTP POST body * * @return response struct @@ -290,7 +295,6 @@ RestClient::Connection::post(const std::string& url, * @brief HTTP PUT method * * @param url to query - * @param ctype content type as string * @param data HTTP PUT body * * @return response struct diff --git a/source/helpers.cc b/source/helpers.cc index a337f263..4efe9bdf 100644 --- a/source/helpers.cc +++ b/source/helpers.cc @@ -65,7 +65,7 @@ size_t RestClient::Helpers::header_callback(void *data, size_t size, /** * @brief read callback function for libcurl * - * @param pointer of max size (size*nmemb) to write data to + * @param data pointer of max size (size*nmemb) to write data to * @param size size parameter * @param nmemb memblock parameter * @param userdata pointer to user data to read data from From ac15028a9fc33978975bb05a0b53f67d2252cb32 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 31 Jan 2016 12:28:31 -0500 Subject: [PATCH 102/212] don't vendorize cpplint --- Makefile.am | 2 +- utils/cpplint.py | 6323 ---------------------------------------------- 2 files changed, 1 insertion(+), 6324 deletions(-) delete mode 100755 utils/cpplint.py diff --git a/Makefile.am b/Makefile.am index 89ba7b36..9f65e1d7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -28,7 +28,7 @@ valgrind: check valgrind --leak-check=full --error-exitcode=0 ./test-program lint: - ./utils/cpplint.py --filter=-legal/copyright include/restclient-cpp/*.h source/*.cc + cpplint --filter=-legal/copyright include/restclient-cpp/*.h source/*.cc ci: lint test valgrind diff --git a/utils/cpplint.py b/utils/cpplint.py deleted file mode 100755 index ccc25d4c..00000000 --- a/utils/cpplint.py +++ /dev/null @@ -1,6323 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (c) 2009 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Does google-lint on c++ files. - -The goal of this script is to identify places in the code that *may* -be in non-compliance with google style. It does not attempt to fix -up these problems -- the point is to educate. It does also not -attempt to find all problems, or to ensure that everything it does -find is legitimately a problem. - -In particular, we can get very confused by /* and // inside strings! -We do a small hack, which is to ignore //'s with "'s after them on the -same line, but it is far from perfect (in either direction). -""" - -import codecs -import copy -import getopt -import math # for log -import os -import re -import sre_compile -import string -import sys -import unicodedata - - -_USAGE = """ -Syntax: cpplint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...] - [--counting=total|toplevel|detailed] [--root=subdir] - [--linelength=digits] - [file] ... - - The style guidelines this tries to follow are those in - http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml - - Every problem is given a confidence score from 1-5, with 5 meaning we are - certain of the problem, and 1 meaning it could be a legitimate construct. - This will miss some errors, and is not a substitute for a code review. - - To suppress false-positive errors of a certain category, add a - 'NOLINT(category)' comment to the line. NOLINT or NOLINT(*) - suppresses errors of all categories on that line. - - The files passed in will be linted; at least one file must be provided. - Default linted extensions are .cc, .cpp, .cu, .cuh and .h. Change the - extensions with the --extensions flag. - - Flags: - - output=vs7 - By default, the output is formatted to ease emacs parsing. Visual Studio - compatible output (vs7) may also be used. Other formats are unsupported. - - verbose=# - Specify a number 0-5 to restrict errors to certain verbosity levels. - - filter=-x,+y,... - Specify a comma-separated list of category-filters to apply: only - error messages whose category names pass the filters will be printed. - (Category names are printed with the message and look like - "[whitespace/indent]".) Filters are evaluated left to right. - "-FOO" and "FOO" means "do not print categories that start with FOO". - "+FOO" means "do print categories that start with FOO". - - Examples: --filter=-whitespace,+whitespace/braces - --filter=whitespace,runtime/printf,+runtime/printf_format - --filter=-,+build/include_what_you_use - - To see a list of all the categories used in cpplint, pass no arg: - --filter= - - counting=total|toplevel|detailed - The total number of errors found is always printed. If - 'toplevel' is provided, then the count of errors in each of - the top-level categories like 'build' and 'whitespace' will - also be printed. If 'detailed' is provided, then a count - is provided for each category like 'build/class'. - - root=subdir - The root directory used for deriving header guard CPP variable. - By default, the header guard CPP variable is calculated as the relative - path to the directory that contains .git, .hg, or .svn. When this flag - is specified, the relative path is calculated from the specified - directory. If the specified directory does not exist, this flag is - ignored. - - Examples: - Assuming that src/.git exists, the header guard CPP variables for - src/chrome/browser/ui/browser.h are: - - No flag => CHROME_BROWSER_UI_BROWSER_H_ - --root=chrome => BROWSER_UI_BROWSER_H_ - --root=chrome/browser => UI_BROWSER_H_ - - linelength=digits - This is the allowed line length for the project. The default value is - 80 characters. - - Examples: - --linelength=120 - - extensions=extension,extension,... - The allowed file extensions that cpplint will check - - Examples: - --extensions=hpp,cpp - - cpplint.py supports per-directory configurations specified in CPPLINT.cfg - files. CPPLINT.cfg file can contain a number of key=value pairs. - Currently the following options are supported: - - set noparent - filter=+filter1,-filter2,... - exclude_files=regex - linelength=80 - - "set noparent" option prevents cpplint from traversing directory tree - upwards looking for more .cfg files in parent directories. This option - is usually placed in the top-level project directory. - - The "filter" option is similar in function to --filter flag. It specifies - message filters in addition to the |_DEFAULT_FILTERS| and those specified - through --filter command-line flag. - - "exclude_files" allows to specify a regular expression to be matched against - a file name. If the expression matches, the file is skipped and not run - through liner. - - "linelength" allows to specify the allowed line length for the project. - - CPPLINT.cfg has an effect on files in the same directory and all - sub-directories, unless overridden by a nested configuration file. - - Example file: - filter=-build/include_order,+build/include_alpha - exclude_files=.*\.cc - - The above example disables build/include_order warning and enables - build/include_alpha as well as excludes all .cc from being - processed by linter, in the current directory (where the .cfg - file is located) and all sub-directories. -""" - -# We categorize each error message we print. Here are the categories. -# We want an explicit list so we can list them all in cpplint --filter=. -# If you add a new error message with a new category, add it to the list -# here! cpplint_unittest.py should tell you if you forget to do this. -_ERROR_CATEGORIES = [ - 'build/class', - 'build/c++11', - 'build/deprecated', - 'build/endif_comment', - 'build/explicit_make_pair', - 'build/forward_decl', - 'build/header_guard', - 'build/include', - 'build/include_alpha', - 'build/include_order', - 'build/include_what_you_use', - 'build/namespaces', - 'build/printf_format', - 'build/storage_class', - 'legal/copyright', - 'readability/alt_tokens', - 'readability/braces', - 'readability/casting', - 'readability/check', - 'readability/constructors', - 'readability/fn_size', - 'readability/function', - 'readability/inheritance', - 'readability/multiline_comment', - 'readability/multiline_string', - 'readability/namespace', - 'readability/nolint', - 'readability/nul', - 'readability/strings', - 'readability/todo', - 'readability/utf8', - 'runtime/arrays', - 'runtime/casting', - 'runtime/explicit', - 'runtime/int', - 'runtime/init', - 'runtime/invalid_increment', - 'runtime/member_string_references', - 'runtime/memset', - 'runtime/indentation_namespace', - 'runtime/operator', - 'runtime/printf', - 'runtime/printf_format', - 'runtime/references', - 'runtime/string', - 'runtime/threadsafe_fn', - 'runtime/vlog', - 'whitespace/blank_line', - 'whitespace/braces', - 'whitespace/comma', - 'whitespace/comments', - 'whitespace/empty_conditional_body', - 'whitespace/empty_loop_body', - 'whitespace/end_of_line', - 'whitespace/ending_newline', - 'whitespace/forcolon', - 'whitespace/indent', - 'whitespace/line_length', - 'whitespace/newline', - 'whitespace/operators', - 'whitespace/parens', - 'whitespace/semicolon', - 'whitespace/tab', - 'whitespace/todo', - ] - -# These error categories are no longer enforced by cpplint, but for backwards- -# compatibility they may still appear in NOLINT comments. -_LEGACY_ERROR_CATEGORIES = [ - 'readability/streams', - ] - -# The default state of the category filter. This is overridden by the --filter= -# flag. By default all errors are on, so only add here categories that should be -# off by default (i.e., categories that must be enabled by the --filter= flags). -# All entries here should start with a '-' or '+', as in the --filter= flag. -_DEFAULT_FILTERS = ['-build/include_alpha'] - -# We used to check for high-bit characters, but after much discussion we -# decided those were OK, as long as they were in UTF-8 and didn't represent -# hard-coded international strings, which belong in a separate i18n file. - -# C++ headers -_CPP_HEADERS = frozenset([ - # Legacy - 'algobase.h', - 'algo.h', - 'alloc.h', - 'builtinbuf.h', - 'bvector.h', - 'complex.h', - 'defalloc.h', - 'deque.h', - 'editbuf.h', - 'fstream.h', - 'function.h', - 'hash_map', - 'hash_map.h', - 'hash_set', - 'hash_set.h', - 'hashtable.h', - 'heap.h', - 'indstream.h', - 'iomanip.h', - 'iostream.h', - 'istream.h', - 'iterator.h', - 'list.h', - 'map.h', - 'multimap.h', - 'multiset.h', - 'ostream.h', - 'pair.h', - 'parsestream.h', - 'pfstream.h', - 'procbuf.h', - 'pthread_alloc', - 'pthread_alloc.h', - 'rope', - 'rope.h', - 'ropeimpl.h', - 'set.h', - 'slist', - 'slist.h', - 'stack.h', - 'stdiostream.h', - 'stl_alloc.h', - 'stl_relops.h', - 'streambuf.h', - 'stream.h', - 'strfile.h', - 'strstream.h', - 'tempbuf.h', - 'tree.h', - 'type_traits.h', - 'vector.h', - # 17.6.1.2 C++ library headers - 'algorithm', - 'array', - 'atomic', - 'bitset', - 'chrono', - 'codecvt', - 'complex', - 'condition_variable', - 'deque', - 'exception', - 'forward_list', - 'fstream', - 'functional', - 'future', - 'initializer_list', - 'iomanip', - 'ios', - 'iosfwd', - 'iostream', - 'istream', - 'iterator', - 'limits', - 'list', - 'locale', - 'map', - 'memory', - 'mutex', - 'new', - 'numeric', - 'ostream', - 'queue', - 'random', - 'ratio', - 'regex', - 'set', - 'sstream', - 'stack', - 'stdexcept', - 'streambuf', - 'string', - 'strstream', - 'system_error', - 'thread', - 'tuple', - 'typeindex', - 'typeinfo', - 'type_traits', - 'unordered_map', - 'unordered_set', - 'utility', - 'valarray', - 'vector', - # 17.6.1.2 C++ headers for C library facilities - 'cassert', - 'ccomplex', - 'cctype', - 'cerrno', - 'cfenv', - 'cfloat', - 'cinttypes', - 'ciso646', - 'climits', - 'clocale', - 'cmath', - 'csetjmp', - 'csignal', - 'cstdalign', - 'cstdarg', - 'cstdbool', - 'cstddef', - 'cstdint', - 'cstdio', - 'cstdlib', - 'cstring', - 'ctgmath', - 'ctime', - 'cuchar', - 'cwchar', - 'cwctype', - ]) - - -# These headers are excluded from [build/include] and [build/include_order] -# checks: -# - Anything not following google file name conventions (containing an -# uppercase character, such as Python.h or nsStringAPI.h, for example). -# - Lua headers. -_THIRD_PARTY_HEADERS_PATTERN = re.compile( - r'^(?:[^/]*[A-Z][^/]*\.h|lua\.h|lauxlib\.h|lualib\.h)$') - - -# Assertion macros. These are defined in base/logging.h and -# testing/base/gunit.h. Note that the _M versions need to come first -# for substring matching to work. -_CHECK_MACROS = [ - 'DCHECK', 'CHECK', - 'EXPECT_TRUE_M', 'EXPECT_TRUE', - 'ASSERT_TRUE_M', 'ASSERT_TRUE', - 'EXPECT_FALSE_M', 'EXPECT_FALSE', - 'ASSERT_FALSE_M', 'ASSERT_FALSE', - ] - -# Replacement macros for CHECK/DCHECK/EXPECT_TRUE/EXPECT_FALSE -_CHECK_REPLACEMENT = dict([(m, {}) for m in _CHECK_MACROS]) - -for op, replacement in [('==', 'EQ'), ('!=', 'NE'), - ('>=', 'GE'), ('>', 'GT'), - ('<=', 'LE'), ('<', 'LT')]: - _CHECK_REPLACEMENT['DCHECK'][op] = 'DCHECK_%s' % replacement - _CHECK_REPLACEMENT['CHECK'][op] = 'CHECK_%s' % replacement - _CHECK_REPLACEMENT['EXPECT_TRUE'][op] = 'EXPECT_%s' % replacement - _CHECK_REPLACEMENT['ASSERT_TRUE'][op] = 'ASSERT_%s' % replacement - _CHECK_REPLACEMENT['EXPECT_TRUE_M'][op] = 'EXPECT_%s_M' % replacement - _CHECK_REPLACEMENT['ASSERT_TRUE_M'][op] = 'ASSERT_%s_M' % replacement - -for op, inv_replacement in [('==', 'NE'), ('!=', 'EQ'), - ('>=', 'LT'), ('>', 'LE'), - ('<=', 'GT'), ('<', 'GE')]: - _CHECK_REPLACEMENT['EXPECT_FALSE'][op] = 'EXPECT_%s' % inv_replacement - _CHECK_REPLACEMENT['ASSERT_FALSE'][op] = 'ASSERT_%s' % inv_replacement - _CHECK_REPLACEMENT['EXPECT_FALSE_M'][op] = 'EXPECT_%s_M' % inv_replacement - _CHECK_REPLACEMENT['ASSERT_FALSE_M'][op] = 'ASSERT_%s_M' % inv_replacement - -# Alternative tokens and their replacements. For full list, see section 2.5 -# Alternative tokens [lex.digraph] in the C++ standard. -# -# Digraphs (such as '%:') are not included here since it's a mess to -# match those on a word boundary. -_ALT_TOKEN_REPLACEMENT = { - 'and': '&&', - 'bitor': '|', - 'or': '||', - 'xor': '^', - 'compl': '~', - 'bitand': '&', - 'and_eq': '&=', - 'or_eq': '|=', - 'xor_eq': '^=', - 'not': '!', - 'not_eq': '!=' - } - -# Compile regular expression that matches all the above keywords. The "[ =()]" -# bit is meant to avoid matching these keywords outside of boolean expressions. -# -# False positives include C-style multi-line comments and multi-line strings -# but those have always been troublesome for cpplint. -_ALT_TOKEN_REPLACEMENT_PATTERN = re.compile( - r'[ =()](' + ('|'.join(_ALT_TOKEN_REPLACEMENT.keys())) + r')(?=[ (]|$)') - - -# These constants define types of headers for use with -# _IncludeState.CheckNextIncludeOrder(). -_C_SYS_HEADER = 1 -_CPP_SYS_HEADER = 2 -_LIKELY_MY_HEADER = 3 -_POSSIBLE_MY_HEADER = 4 -_OTHER_HEADER = 5 - -# These constants define the current inline assembly state -_NO_ASM = 0 # Outside of inline assembly block -_INSIDE_ASM = 1 # Inside inline assembly block -_END_ASM = 2 # Last line of inline assembly block -_BLOCK_ASM = 3 # The whole block is an inline assembly block - -# Match start of assembly blocks -_MATCH_ASM = re.compile(r'^\s*(?:asm|_asm|__asm|__asm__)' - r'(?:\s+(volatile|__volatile__))?' - r'\s*[{(]') - - -_regexp_compile_cache = {} - -# {str, set(int)}: a map from error categories to sets of linenumbers -# on which those errors are expected and should be suppressed. -_error_suppressions = {} - -# The root directory used for deriving header guard CPP variable. -# This is set by --root flag. -_root = None - -# The allowed line length of files. -# This is set by --linelength flag. -_line_length = 80 - -# The allowed extensions for file names -# This is set by --extensions flag. -_valid_extensions = set(['cc', 'h', 'cpp', 'cu', 'cuh']) - -def ParseNolintSuppressions(filename, raw_line, linenum, error): - """Updates the global list of error-suppressions. - - Parses any NOLINT comments on the current line, updating the global - error_suppressions store. Reports an error if the NOLINT comment - was malformed. - - Args: - filename: str, the name of the input file. - raw_line: str, the line of input text, with comments. - linenum: int, the number of the current line. - error: function, an error handler. - """ - matched = Search(r'\bNOLINT(NEXTLINE)?\b(\([^)]+\))?', raw_line) - if matched: - if matched.group(1): - suppressed_line = linenum + 1 - else: - suppressed_line = linenum - category = matched.group(2) - if category in (None, '(*)'): # => "suppress all" - _error_suppressions.setdefault(None, set()).add(suppressed_line) - else: - if category.startswith('(') and category.endswith(')'): - category = category[1:-1] - if category in _ERROR_CATEGORIES: - _error_suppressions.setdefault(category, set()).add(suppressed_line) - elif category not in _LEGACY_ERROR_CATEGORIES: - error(filename, linenum, 'readability/nolint', 5, - 'Unknown NOLINT error category: %s' % category) - - -def ResetNolintSuppressions(): - """Resets the set of NOLINT suppressions to empty.""" - _error_suppressions.clear() - - -def IsErrorSuppressedByNolint(category, linenum): - """Returns true if the specified error category is suppressed on this line. - - Consults the global error_suppressions map populated by - ParseNolintSuppressions/ResetNolintSuppressions. - - Args: - category: str, the category of the error. - linenum: int, the current line number. - Returns: - bool, True iff the error should be suppressed due to a NOLINT comment. - """ - return (linenum in _error_suppressions.get(category, set()) or - linenum in _error_suppressions.get(None, set())) - - -def Match(pattern, s): - """Matches the string with the pattern, caching the compiled regexp.""" - # The regexp compilation caching is inlined in both Match and Search for - # performance reasons; factoring it out into a separate function turns out - # to be noticeably expensive. - if pattern not in _regexp_compile_cache: - _regexp_compile_cache[pattern] = sre_compile.compile(pattern) - return _regexp_compile_cache[pattern].match(s) - - -def ReplaceAll(pattern, rep, s): - """Replaces instances of pattern in a string with a replacement. - - The compiled regex is kept in a cache shared by Match and Search. - - Args: - pattern: regex pattern - rep: replacement text - s: search string - - Returns: - string with replacements made (or original string if no replacements) - """ - if pattern not in _regexp_compile_cache: - _regexp_compile_cache[pattern] = sre_compile.compile(pattern) - return _regexp_compile_cache[pattern].sub(rep, s) - - -def Search(pattern, s): - """Searches the string for the pattern, caching the compiled regexp.""" - if pattern not in _regexp_compile_cache: - _regexp_compile_cache[pattern] = sre_compile.compile(pattern) - return _regexp_compile_cache[pattern].search(s) - - -class _IncludeState(object): - """Tracks line numbers for includes, and the order in which includes appear. - - include_list contains list of lists of (header, line number) pairs. - It's a lists of lists rather than just one flat list to make it - easier to update across preprocessor boundaries. - - Call CheckNextIncludeOrder() once for each header in the file, passing - in the type constants defined above. Calls in an illegal order will - raise an _IncludeError with an appropriate error message. - - """ - # self._section will move monotonically through this set. If it ever - # needs to move backwards, CheckNextIncludeOrder will raise an error. - _INITIAL_SECTION = 0 - _MY_H_SECTION = 1 - _C_SECTION = 2 - _CPP_SECTION = 3 - _OTHER_H_SECTION = 4 - - _TYPE_NAMES = { - _C_SYS_HEADER: 'C system header', - _CPP_SYS_HEADER: 'C++ system header', - _LIKELY_MY_HEADER: 'header this file implements', - _POSSIBLE_MY_HEADER: 'header this file may implement', - _OTHER_HEADER: 'other header', - } - _SECTION_NAMES = { - _INITIAL_SECTION: "... nothing. (This can't be an error.)", - _MY_H_SECTION: 'a header this file implements', - _C_SECTION: 'C system header', - _CPP_SECTION: 'C++ system header', - _OTHER_H_SECTION: 'other header', - } - - def __init__(self): - self.include_list = [[]] - self.ResetSection('') - - def FindHeader(self, header): - """Check if a header has already been included. - - Args: - header: header to check. - Returns: - Line number of previous occurrence, or -1 if the header has not - been seen before. - """ - for section_list in self.include_list: - for f in section_list: - if f[0] == header: - return f[1] - return -1 - - def ResetSection(self, directive): - """Reset section checking for preprocessor directive. - - Args: - directive: preprocessor directive (e.g. "if", "else"). - """ - # The name of the current section. - self._section = self._INITIAL_SECTION - # The path of last found header. - self._last_header = '' - - # Update list of includes. Note that we never pop from the - # include list. - if directive in ('if', 'ifdef', 'ifndef'): - self.include_list.append([]) - elif directive in ('else', 'elif'): - self.include_list[-1] = [] - - def SetLastHeader(self, header_path): - self._last_header = header_path - - def CanonicalizeAlphabeticalOrder(self, header_path): - """Returns a path canonicalized for alphabetical comparison. - - - replaces "-" with "_" so they both cmp the same. - - removes '-inl' since we don't require them to be after the main header. - - lowercase everything, just in case. - - Args: - header_path: Path to be canonicalized. - - Returns: - Canonicalized path. - """ - return header_path.replace('-inl.h', '.h').replace('-', '_').lower() - - def IsInAlphabeticalOrder(self, clean_lines, linenum, header_path): - """Check if a header is in alphabetical order with the previous header. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - header_path: Canonicalized header to be checked. - - Returns: - Returns true if the header is in alphabetical order. - """ - # If previous section is different from current section, _last_header will - # be reset to empty string, so it's always less than current header. - # - # If previous line was a blank line, assume that the headers are - # intentionally sorted the way they are. - if (self._last_header > header_path and - Match(r'^\s*#\s*include\b', clean_lines.elided[linenum - 1])): - return False - return True - - def CheckNextIncludeOrder(self, header_type): - """Returns a non-empty error message if the next header is out of order. - - This function also updates the internal state to be ready to check - the next include. - - Args: - header_type: One of the _XXX_HEADER constants defined above. - - Returns: - The empty string if the header is in the right order, or an - error message describing what's wrong. - - """ - error_message = ('Found %s after %s' % - (self._TYPE_NAMES[header_type], - self._SECTION_NAMES[self._section])) - - last_section = self._section - - if header_type == _C_SYS_HEADER: - if self._section <= self._C_SECTION: - self._section = self._C_SECTION - else: - self._last_header = '' - return error_message - elif header_type == _CPP_SYS_HEADER: - if self._section <= self._CPP_SECTION: - self._section = self._CPP_SECTION - else: - self._last_header = '' - return error_message - elif header_type == _LIKELY_MY_HEADER: - if self._section <= self._MY_H_SECTION: - self._section = self._MY_H_SECTION - else: - self._section = self._OTHER_H_SECTION - elif header_type == _POSSIBLE_MY_HEADER: - if self._section <= self._MY_H_SECTION: - self._section = self._MY_H_SECTION - else: - # This will always be the fallback because we're not sure - # enough that the header is associated with this file. - self._section = self._OTHER_H_SECTION - else: - assert header_type == _OTHER_HEADER - self._section = self._OTHER_H_SECTION - - if last_section != self._section: - self._last_header = '' - - return '' - - -class _CppLintState(object): - """Maintains module-wide state..""" - - def __init__(self): - self.verbose_level = 1 # global setting. - self.error_count = 0 # global count of reported errors - # filters to apply when emitting error messages - self.filters = _DEFAULT_FILTERS[:] - # backup of filter list. Used to restore the state after each file. - self._filters_backup = self.filters[:] - self.counting = 'total' # In what way are we counting errors? - self.errors_by_category = {} # string to int dict storing error counts - - # output format: - # "emacs" - format that emacs can parse (default) - # "vs7" - format that Microsoft Visual Studio 7 can parse - self.output_format = 'emacs' - - def SetOutputFormat(self, output_format): - """Sets the output format for errors.""" - self.output_format = output_format - - def SetVerboseLevel(self, level): - """Sets the module's verbosity, and returns the previous setting.""" - last_verbose_level = self.verbose_level - self.verbose_level = level - return last_verbose_level - - def SetCountingStyle(self, counting_style): - """Sets the module's counting options.""" - self.counting = counting_style - - def SetFilters(self, filters): - """Sets the error-message filters. - - These filters are applied when deciding whether to emit a given - error message. - - Args: - filters: A string of comma-separated filters (eg "+whitespace/indent"). - Each filter should start with + or -; else we die. - - Raises: - ValueError: The comma-separated filters did not all start with '+' or '-'. - E.g. "-,+whitespace,-whitespace/indent,whitespace/badfilter" - """ - # Default filters always have less priority than the flag ones. - self.filters = _DEFAULT_FILTERS[:] - self.AddFilters(filters) - - def AddFilters(self, filters): - """ Adds more filters to the existing list of error-message filters. """ - for filt in filters.split(','): - clean_filt = filt.strip() - if clean_filt: - self.filters.append(clean_filt) - for filt in self.filters: - if not (filt.startswith('+') or filt.startswith('-')): - raise ValueError('Every filter in --filters must start with + or -' - ' (%s does not)' % filt) - - def BackupFilters(self): - """ Saves the current filter list to backup storage.""" - self._filters_backup = self.filters[:] - - def RestoreFilters(self): - """ Restores filters previously backed up.""" - self.filters = self._filters_backup[:] - - def ResetErrorCounts(self): - """Sets the module's error statistic back to zero.""" - self.error_count = 0 - self.errors_by_category = {} - - def IncrementErrorCount(self, category): - """Bumps the module's error statistic.""" - self.error_count += 1 - if self.counting in ('toplevel', 'detailed'): - if self.counting != 'detailed': - category = category.split('/')[0] - if category not in self.errors_by_category: - self.errors_by_category[category] = 0 - self.errors_by_category[category] += 1 - - def PrintErrorCounts(self): - """Print a summary of errors by category, and the total.""" - for category, count in self.errors_by_category.iteritems(): - sys.stderr.write('Category \'%s\' errors found: %d\n' % - (category, count)) - sys.stderr.write('Total errors found: %d\n' % self.error_count) - -_cpplint_state = _CppLintState() - - -def _OutputFormat(): - """Gets the module's output format.""" - return _cpplint_state.output_format - - -def _SetOutputFormat(output_format): - """Sets the module's output format.""" - _cpplint_state.SetOutputFormat(output_format) - - -def _VerboseLevel(): - """Returns the module's verbosity setting.""" - return _cpplint_state.verbose_level - - -def _SetVerboseLevel(level): - """Sets the module's verbosity, and returns the previous setting.""" - return _cpplint_state.SetVerboseLevel(level) - - -def _SetCountingStyle(level): - """Sets the module's counting options.""" - _cpplint_state.SetCountingStyle(level) - - -def _Filters(): - """Returns the module's list of output filters, as a list.""" - return _cpplint_state.filters - - -def _SetFilters(filters): - """Sets the module's error-message filters. - - These filters are applied when deciding whether to emit a given - error message. - - Args: - filters: A string of comma-separated filters (eg "whitespace/indent"). - Each filter should start with + or -; else we die. - """ - _cpplint_state.SetFilters(filters) - -def _AddFilters(filters): - """Adds more filter overrides. - - Unlike _SetFilters, this function does not reset the current list of filters - available. - - Args: - filters: A string of comma-separated filters (eg "whitespace/indent"). - Each filter should start with + or -; else we die. - """ - _cpplint_state.AddFilters(filters) - -def _BackupFilters(): - """ Saves the current filter list to backup storage.""" - _cpplint_state.BackupFilters() - -def _RestoreFilters(): - """ Restores filters previously backed up.""" - _cpplint_state.RestoreFilters() - -class _FunctionState(object): - """Tracks current function name and the number of lines in its body.""" - - _NORMAL_TRIGGER = 250 # for --v=0, 500 for --v=1, etc. - _TEST_TRIGGER = 400 # about 50% more than _NORMAL_TRIGGER. - - def __init__(self): - self.in_a_function = False - self.lines_in_function = 0 - self.current_function = '' - - def Begin(self, function_name): - """Start analyzing function body. - - Args: - function_name: The name of the function being tracked. - """ - self.in_a_function = True - self.lines_in_function = 0 - self.current_function = function_name - - def Count(self): - """Count line in current function body.""" - if self.in_a_function: - self.lines_in_function += 1 - - def Check(self, error, filename, linenum): - """Report if too many lines in function body. - - Args: - error: The function to call with any errors found. - filename: The name of the current file. - linenum: The number of the line to check. - """ - if Match(r'T(EST|est)', self.current_function): - base_trigger = self._TEST_TRIGGER - else: - base_trigger = self._NORMAL_TRIGGER - trigger = base_trigger * 2**_VerboseLevel() - - if self.lines_in_function > trigger: - error_level = int(math.log(self.lines_in_function / base_trigger, 2)) - # 50 => 0, 100 => 1, 200 => 2, 400 => 3, 800 => 4, 1600 => 5, ... - if error_level > 5: - error_level = 5 - error(filename, linenum, 'readability/fn_size', error_level, - 'Small and focused functions are preferred:' - ' %s has %d non-comment lines' - ' (error triggered by exceeding %d lines).' % ( - self.current_function, self.lines_in_function, trigger)) - - def End(self): - """Stop analyzing function body.""" - self.in_a_function = False - - -class _IncludeError(Exception): - """Indicates a problem with the include order in a file.""" - pass - - -class FileInfo(object): - """Provides utility functions for filenames. - - FileInfo provides easy access to the components of a file's path - relative to the project root. - """ - - def __init__(self, filename): - self._filename = filename - - def FullName(self): - """Make Windows paths like Unix.""" - return os.path.abspath(self._filename).replace('\\', '/') - - def RepositoryName(self): - """FullName after removing the local path to the repository. - - If we have a real absolute path name here we can try to do something smart: - detecting the root of the checkout and truncating /path/to/checkout from - the name so that we get header guards that don't include things like - "C:\Documents and Settings\..." or "/home/username/..." in them and thus - people on different computers who have checked the source out to different - locations won't see bogus errors. - """ - fullname = self.FullName() - - if os.path.exists(fullname): - project_dir = os.path.dirname(fullname) - - if os.path.exists(os.path.join(project_dir, ".svn")): - # If there's a .svn file in the current directory, we recursively look - # up the directory tree for the top of the SVN checkout - root_dir = project_dir - one_up_dir = os.path.dirname(root_dir) - while os.path.exists(os.path.join(one_up_dir, ".svn")): - root_dir = os.path.dirname(root_dir) - one_up_dir = os.path.dirname(one_up_dir) - - prefix = os.path.commonprefix([root_dir, project_dir]) - return fullname[len(prefix) + 1:] - - # Not SVN <= 1.6? Try to find a git, hg, or svn top level directory by - # searching up from the current path. - root_dir = os.path.dirname(fullname) - while (root_dir != os.path.dirname(root_dir) and - not os.path.exists(os.path.join(root_dir, ".git")) and - not os.path.exists(os.path.join(root_dir, ".hg")) and - not os.path.exists(os.path.join(root_dir, ".svn"))): - root_dir = os.path.dirname(root_dir) - - if (os.path.exists(os.path.join(root_dir, ".git")) or - os.path.exists(os.path.join(root_dir, ".hg")) or - os.path.exists(os.path.join(root_dir, ".svn"))): - prefix = os.path.commonprefix([root_dir, project_dir]) - return fullname[len(prefix) + 1:] - - # Don't know what to do; header guard warnings may be wrong... - return fullname - - def Split(self): - """Splits the file into the directory, basename, and extension. - - For 'chrome/browser/browser.cc', Split() would - return ('chrome/browser', 'browser', '.cc') - - Returns: - A tuple of (directory, basename, extension). - """ - - googlename = self.RepositoryName() - project, rest = os.path.split(googlename) - return (project,) + os.path.splitext(rest) - - def BaseName(self): - """File base name - text after the final slash, before the final period.""" - return self.Split()[1] - - def Extension(self): - """File extension - text following the final period.""" - return self.Split()[2] - - def NoExtension(self): - """File has no source file extension.""" - return '/'.join(self.Split()[0:2]) - - def IsSource(self): - """File has a source file extension.""" - return self.Extension()[1:] in ('c', 'cc', 'cpp', 'cxx') - - -def _ShouldPrintError(category, confidence, linenum): - """If confidence >= verbose, category passes filter and is not suppressed.""" - - # There are three ways we might decide not to print an error message: - # a "NOLINT(category)" comment appears in the source, - # the verbosity level isn't high enough, or the filters filter it out. - if IsErrorSuppressedByNolint(category, linenum): - return False - - if confidence < _cpplint_state.verbose_level: - return False - - is_filtered = False - for one_filter in _Filters(): - if one_filter.startswith('-'): - if category.startswith(one_filter[1:]): - is_filtered = True - elif one_filter.startswith('+'): - if category.startswith(one_filter[1:]): - is_filtered = False - else: - assert False # should have been checked for in SetFilter. - if is_filtered: - return False - - return True - - -def Error(filename, linenum, category, confidence, message): - """Logs the fact we've found a lint error. - - We log where the error was found, and also our confidence in the error, - that is, how certain we are this is a legitimate style regression, and - not a misidentification or a use that's sometimes justified. - - False positives can be suppressed by the use of - "cpplint(category)" comments on the offending line. These are - parsed into _error_suppressions. - - Args: - filename: The name of the file containing the error. - linenum: The number of the line containing the error. - category: A string used to describe the "category" this bug - falls under: "whitespace", say, or "runtime". Categories - may have a hierarchy separated by slashes: "whitespace/indent". - confidence: A number from 1-5 representing a confidence score for - the error, with 5 meaning that we are certain of the problem, - and 1 meaning that it could be a legitimate construct. - message: The error message. - """ - if _ShouldPrintError(category, confidence, linenum): - _cpplint_state.IncrementErrorCount(category) - if _cpplint_state.output_format == 'vs7': - sys.stderr.write('%s(%s): %s [%s] [%d]\n' % ( - filename, linenum, message, category, confidence)) - elif _cpplint_state.output_format == 'eclipse': - sys.stderr.write('%s:%s: warning: %s [%s] [%d]\n' % ( - filename, linenum, message, category, confidence)) - else: - sys.stderr.write('%s:%s: %s [%s] [%d]\n' % ( - filename, linenum, message, category, confidence)) - - -# Matches standard C++ escape sequences per 2.13.2.3 of the C++ standard. -_RE_PATTERN_CLEANSE_LINE_ESCAPES = re.compile( - r'\\([abfnrtv?"\\\']|\d+|x[0-9a-fA-F]+)') -# Match a single C style comment on the same line. -_RE_PATTERN_C_COMMENTS = r'/\*(?:[^*]|\*(?!/))*\*/' -# Matches multi-line C style comments. -# This RE is a little bit more complicated than one might expect, because we -# have to take care of space removals tools so we can handle comments inside -# statements better. -# The current rule is: We only clear spaces from both sides when we're at the -# end of the line. Otherwise, we try to remove spaces from the right side, -# if this doesn't work we try on left side but only if there's a non-character -# on the right. -_RE_PATTERN_CLEANSE_LINE_C_COMMENTS = re.compile( - r'(\s*' + _RE_PATTERN_C_COMMENTS + r'\s*$|' + - _RE_PATTERN_C_COMMENTS + r'\s+|' + - r'\s+' + _RE_PATTERN_C_COMMENTS + r'(?=\W)|' + - _RE_PATTERN_C_COMMENTS + r')') - - -def IsCppString(line): - """Does line terminate so, that the next symbol is in string constant. - - This function does not consider single-line nor multi-line comments. - - Args: - line: is a partial line of code starting from the 0..n. - - Returns: - True, if next character appended to 'line' is inside a - string constant. - """ - - line = line.replace(r'\\', 'XX') # after this, \\" does not match to \" - return ((line.count('"') - line.count(r'\"') - line.count("'\"'")) & 1) == 1 - - -def CleanseRawStrings(raw_lines): - """Removes C++11 raw strings from lines. - - Before: - static const char kData[] = R"( - multi-line string - )"; - - After: - static const char kData[] = "" - (replaced by blank line) - ""; - - Args: - raw_lines: list of raw lines. - - Returns: - list of lines with C++11 raw strings replaced by empty strings. - """ - - delimiter = None - lines_without_raw_strings = [] - for line in raw_lines: - if delimiter: - # Inside a raw string, look for the end - end = line.find(delimiter) - if end >= 0: - # Found the end of the string, match leading space for this - # line and resume copying the original lines, and also insert - # a "" on the last line. - leading_space = Match(r'^(\s*)\S', line) - line = leading_space.group(1) + '""' + line[end + len(delimiter):] - delimiter = None - else: - # Haven't found the end yet, append a blank line. - line = '""' - - # Look for beginning of a raw string, and replace them with - # empty strings. This is done in a loop to handle multiple raw - # strings on the same line. - while delimiter is None: - # Look for beginning of a raw string. - # See 2.14.15 [lex.string] for syntax. - matched = Match(r'^(.*)\b(?:R|u8R|uR|UR|LR)"([^\s\\()]*)\((.*)$', line) - if matched: - delimiter = ')' + matched.group(2) + '"' - - end = matched.group(3).find(delimiter) - if end >= 0: - # Raw string ended on same line - line = (matched.group(1) + '""' + - matched.group(3)[end + len(delimiter):]) - delimiter = None - else: - # Start of a multi-line raw string - line = matched.group(1) + '""' - else: - break - - lines_without_raw_strings.append(line) - - # TODO(unknown): if delimiter is not None here, we might want to - # emit a warning for unterminated string. - return lines_without_raw_strings - - -def FindNextMultiLineCommentStart(lines, lineix): - """Find the beginning marker for a multiline comment.""" - while lineix < len(lines): - if lines[lineix].strip().startswith('/*'): - # Only return this marker if the comment goes beyond this line - if lines[lineix].strip().find('*/', 2) < 0: - return lineix - lineix += 1 - return len(lines) - - -def FindNextMultiLineCommentEnd(lines, lineix): - """We are inside a comment, find the end marker.""" - while lineix < len(lines): - if lines[lineix].strip().endswith('*/'): - return lineix - lineix += 1 - return len(lines) - - -def RemoveMultiLineCommentsFromRange(lines, begin, end): - """Clears a range of lines for multi-line comments.""" - # Having // dummy comments makes the lines non-empty, so we will not get - # unnecessary blank line warnings later in the code. - for i in range(begin, end): - lines[i] = '/**/' - - -def RemoveMultiLineComments(filename, lines, error): - """Removes multiline (c-style) comments from lines.""" - lineix = 0 - while lineix < len(lines): - lineix_begin = FindNextMultiLineCommentStart(lines, lineix) - if lineix_begin >= len(lines): - return - lineix_end = FindNextMultiLineCommentEnd(lines, lineix_begin) - if lineix_end >= len(lines): - error(filename, lineix_begin + 1, 'readability/multiline_comment', 5, - 'Could not find end of multi-line comment') - return - RemoveMultiLineCommentsFromRange(lines, lineix_begin, lineix_end + 1) - lineix = lineix_end + 1 - - -def CleanseComments(line): - """Removes //-comments and single-line C-style /* */ comments. - - Args: - line: A line of C++ source. - - Returns: - The line with single-line comments removed. - """ - commentpos = line.find('//') - if commentpos != -1 and not IsCppString(line[:commentpos]): - line = line[:commentpos].rstrip() - # get rid of /* ... */ - return _RE_PATTERN_CLEANSE_LINE_C_COMMENTS.sub('', line) - - -class CleansedLines(object): - """Holds 4 copies of all lines with different preprocessing applied to them. - - 1) elided member contains lines without strings and comments. - 2) lines member contains lines without comments. - 3) raw_lines member contains all the lines without processing. - 4) lines_without_raw_strings member is same as raw_lines, but with C++11 raw - strings removed. - All these members are of , and of the same length. - """ - - def __init__(self, lines): - self.elided = [] - self.lines = [] - self.raw_lines = lines - self.num_lines = len(lines) - self.lines_without_raw_strings = CleanseRawStrings(lines) - for linenum in range(len(self.lines_without_raw_strings)): - self.lines.append(CleanseComments( - self.lines_without_raw_strings[linenum])) - elided = self._CollapseStrings(self.lines_without_raw_strings[linenum]) - self.elided.append(CleanseComments(elided)) - - def NumLines(self): - """Returns the number of lines represented.""" - return self.num_lines - - @staticmethod - def _CollapseStrings(elided): - """Collapses strings and chars on a line to simple "" or '' blocks. - - We nix strings first so we're not fooled by text like '"http://"' - - Args: - elided: The line being processed. - - Returns: - The line with collapsed strings. - """ - if _RE_PATTERN_INCLUDE.match(elided): - return elided - - # Remove escaped characters first to make quote/single quote collapsing - # basic. Things that look like escaped characters shouldn't occur - # outside of strings and chars. - elided = _RE_PATTERN_CLEANSE_LINE_ESCAPES.sub('', elided) - - # Replace quoted strings and digit separators. Both single quotes - # and double quotes are processed in the same loop, otherwise - # nested quotes wouldn't work. - collapsed = '' - while True: - # Find the first quote character - match = Match(r'^([^\'"]*)([\'"])(.*)$', elided) - if not match: - collapsed += elided - break - head, quote, tail = match.groups() - - if quote == '"': - # Collapse double quoted strings - second_quote = tail.find('"') - if second_quote >= 0: - collapsed += head + '""' - elided = tail[second_quote + 1:] - else: - # Unmatched double quote, don't bother processing the rest - # of the line since this is probably a multiline string. - collapsed += elided - break - else: - # Found single quote, check nearby text to eliminate digit separators. - # - # There is no special handling for floating point here, because - # the integer/fractional/exponent parts would all be parsed - # correctly as long as there are digits on both sides of the - # separator. So we are fine as long as we don't see something - # like "0.'3" (gcc 4.9.0 will not allow this literal). - if Search(r'\b(?:0[bBxX]?|[1-9])[0-9a-fA-F]*$', head): - match_literal = Match(r'^((?:\'?[0-9a-zA-Z_])*)(.*)$', "'" + tail) - collapsed += head + match_literal.group(1).replace("'", '') - elided = match_literal.group(2) - else: - second_quote = tail.find('\'') - if second_quote >= 0: - collapsed += head + "''" - elided = tail[second_quote + 1:] - else: - # Unmatched single quote - collapsed += elided - break - - return collapsed - - -def FindEndOfExpressionInLine(line, startpos, stack): - """Find the position just after the end of current parenthesized expression. - - Args: - line: a CleansedLines line. - startpos: start searching at this position. - stack: nesting stack at startpos. - - Returns: - On finding matching end: (index just after matching end, None) - On finding an unclosed expression: (-1, None) - Otherwise: (-1, new stack at end of this line) - """ - for i in xrange(startpos, len(line)): - char = line[i] - if char in '([{': - # Found start of parenthesized expression, push to expression stack - stack.append(char) - elif char == '<': - # Found potential start of template argument list - if i > 0 and line[i - 1] == '<': - # Left shift operator - if stack and stack[-1] == '<': - stack.pop() - if not stack: - return (-1, None) - elif i > 0 and Search(r'\boperator\s*$', line[0:i]): - # operator<, don't add to stack - continue - else: - # Tentative start of template argument list - stack.append('<') - elif char in ')]}': - # Found end of parenthesized expression. - # - # If we are currently expecting a matching '>', the pending '<' - # must have been an operator. Remove them from expression stack. - while stack and stack[-1] == '<': - stack.pop() - if not stack: - return (-1, None) - if ((stack[-1] == '(' and char == ')') or - (stack[-1] == '[' and char == ']') or - (stack[-1] == '{' and char == '}')): - stack.pop() - if not stack: - return (i + 1, None) - else: - # Mismatched parentheses - return (-1, None) - elif char == '>': - # Found potential end of template argument list. - - # Ignore "->" and operator functions - if (i > 0 and - (line[i - 1] == '-' or Search(r'\boperator\s*$', line[0:i - 1]))): - continue - - # Pop the stack if there is a matching '<'. Otherwise, ignore - # this '>' since it must be an operator. - if stack: - if stack[-1] == '<': - stack.pop() - if not stack: - return (i + 1, None) - elif char == ';': - # Found something that look like end of statements. If we are currently - # expecting a '>', the matching '<' must have been an operator, since - # template argument list should not contain statements. - while stack and stack[-1] == '<': - stack.pop() - if not stack: - return (-1, None) - - # Did not find end of expression or unbalanced parentheses on this line - return (-1, stack) - - -def CloseExpression(clean_lines, linenum, pos): - """If input points to ( or { or [ or <, finds the position that closes it. - - If lines[linenum][pos] points to a '(' or '{' or '[' or '<', finds the - linenum/pos that correspond to the closing of the expression. - - TODO(unknown): cpplint spends a fair bit of time matching parentheses. - Ideally we would want to index all opening and closing parentheses once - and have CloseExpression be just a simple lookup, but due to preprocessor - tricks, this is not so easy. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - pos: A position on the line. - - Returns: - A tuple (line, linenum, pos) pointer *past* the closing brace, or - (line, len(lines), -1) if we never find a close. Note we ignore - strings and comments when matching; and the line we return is the - 'cleansed' line at linenum. - """ - - line = clean_lines.elided[linenum] - if (line[pos] not in '({[<') or Match(r'<[<=]', line[pos:]): - return (line, clean_lines.NumLines(), -1) - - # Check first line - (end_pos, stack) = FindEndOfExpressionInLine(line, pos, []) - if end_pos > -1: - return (line, linenum, end_pos) - - # Continue scanning forward - while stack and linenum < clean_lines.NumLines() - 1: - linenum += 1 - line = clean_lines.elided[linenum] - (end_pos, stack) = FindEndOfExpressionInLine(line, 0, stack) - if end_pos > -1: - return (line, linenum, end_pos) - - # Did not find end of expression before end of file, give up - return (line, clean_lines.NumLines(), -1) - - -def FindStartOfExpressionInLine(line, endpos, stack): - """Find position at the matching start of current expression. - - This is almost the reverse of FindEndOfExpressionInLine, but note - that the input position and returned position differs by 1. - - Args: - line: a CleansedLines line. - endpos: start searching at this position. - stack: nesting stack at endpos. - - Returns: - On finding matching start: (index at matching start, None) - On finding an unclosed expression: (-1, None) - Otherwise: (-1, new stack at beginning of this line) - """ - i = endpos - while i >= 0: - char = line[i] - if char in ')]}': - # Found end of expression, push to expression stack - stack.append(char) - elif char == '>': - # Found potential end of template argument list. - # - # Ignore it if it's a "->" or ">=" or "operator>" - if (i > 0 and - (line[i - 1] == '-' or - Match(r'\s>=\s', line[i - 1:]) or - Search(r'\boperator\s*$', line[0:i]))): - i -= 1 - else: - stack.append('>') - elif char == '<': - # Found potential start of template argument list - if i > 0 and line[i - 1] == '<': - # Left shift operator - i -= 1 - else: - # If there is a matching '>', we can pop the expression stack. - # Otherwise, ignore this '<' since it must be an operator. - if stack and stack[-1] == '>': - stack.pop() - if not stack: - return (i, None) - elif char in '([{': - # Found start of expression. - # - # If there are any unmatched '>' on the stack, they must be - # operators. Remove those. - while stack and stack[-1] == '>': - stack.pop() - if not stack: - return (-1, None) - if ((char == '(' and stack[-1] == ')') or - (char == '[' and stack[-1] == ']') or - (char == '{' and stack[-1] == '}')): - stack.pop() - if not stack: - return (i, None) - else: - # Mismatched parentheses - return (-1, None) - elif char == ';': - # Found something that look like end of statements. If we are currently - # expecting a '<', the matching '>' must have been an operator, since - # template argument list should not contain statements. - while stack and stack[-1] == '>': - stack.pop() - if not stack: - return (-1, None) - - i -= 1 - - return (-1, stack) - - -def ReverseCloseExpression(clean_lines, linenum, pos): - """If input points to ) or } or ] or >, finds the position that opens it. - - If lines[linenum][pos] points to a ')' or '}' or ']' or '>', finds the - linenum/pos that correspond to the opening of the expression. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - pos: A position on the line. - - Returns: - A tuple (line, linenum, pos) pointer *at* the opening brace, or - (line, 0, -1) if we never find the matching opening brace. Note - we ignore strings and comments when matching; and the line we - return is the 'cleansed' line at linenum. - """ - line = clean_lines.elided[linenum] - if line[pos] not in ')}]>': - return (line, 0, -1) - - # Check last line - (start_pos, stack) = FindStartOfExpressionInLine(line, pos, []) - if start_pos > -1: - return (line, linenum, start_pos) - - # Continue scanning backward - while stack and linenum > 0: - linenum -= 1 - line = clean_lines.elided[linenum] - (start_pos, stack) = FindStartOfExpressionInLine(line, len(line) - 1, stack) - if start_pos > -1: - return (line, linenum, start_pos) - - # Did not find start of expression before beginning of file, give up - return (line, 0, -1) - - -def CheckForCopyright(filename, lines, error): - """Logs an error if no Copyright message appears at the top of the file.""" - - # We'll say it should occur by line 10. Don't forget there's a - # dummy line at the front. - for line in xrange(1, min(len(lines), 11)): - if re.search(r'Copyright', lines[line], re.I): break - else: # means no copyright line was found - error(filename, 0, 'legal/copyright', 5, - 'No copyright message found. ' - 'You should have a line: "Copyright [year] "') - - -def GetIndentLevel(line): - """Return the number of leading spaces in line. - - Args: - line: A string to check. - - Returns: - An integer count of leading spaces, possibly zero. - """ - indent = Match(r'^( *)\S', line) - if indent: - return len(indent.group(1)) - else: - return 0 - - -def GetHeaderGuardCPPVariable(filename): - """Returns the CPP variable that should be used as a header guard. - - Args: - filename: The name of a C++ header file. - - Returns: - The CPP variable that should be used as a header guard in the - named file. - - """ - - # Restores original filename in case that cpplint is invoked from Emacs's - # flymake. - filename = re.sub(r'_flymake\.h$', '.h', filename) - filename = re.sub(r'/\.flymake/([^/]*)$', r'/\1', filename) - # Replace 'c++' with 'cpp'. - filename = filename.replace('C++', 'cpp').replace('c++', 'cpp') - - fileinfo = FileInfo(filename) - file_path_from_root = fileinfo.RepositoryName() - if _root: - file_path_from_root = re.sub('^' + _root + os.sep, '', file_path_from_root) - return re.sub(r'[^a-zA-Z0-9]', '_', file_path_from_root).upper() + '_' - - -def CheckForHeaderGuard(filename, clean_lines, error): - """Checks that the file contains a header guard. - - Logs an error if no #ifndef header guard is present. For other - headers, checks that the full pathname is used. - - Args: - filename: The name of the C++ header file. - clean_lines: A CleansedLines instance containing the file. - error: The function to call with any errors found. - """ - - # Don't check for header guards if there are error suppression - # comments somewhere in this file. - # - # Because this is silencing a warning for a nonexistent line, we - # only support the very specific NOLINT(build/header_guard) syntax, - # and not the general NOLINT or NOLINT(*) syntax. - raw_lines = clean_lines.lines_without_raw_strings - for i in raw_lines: - if Search(r'//\s*NOLINT\(build/header_guard\)', i): - return - - cppvar = GetHeaderGuardCPPVariable(filename) - - ifndef = '' - ifndef_linenum = 0 - define = '' - endif = '' - endif_linenum = 0 - for linenum, line in enumerate(raw_lines): - linesplit = line.split() - if len(linesplit) >= 2: - # find the first occurrence of #ifndef and #define, save arg - if not ifndef and linesplit[0] == '#ifndef': - # set ifndef to the header guard presented on the #ifndef line. - ifndef = linesplit[1] - ifndef_linenum = linenum - if not define and linesplit[0] == '#define': - define = linesplit[1] - # find the last occurrence of #endif, save entire line - if line.startswith('#endif'): - endif = line - endif_linenum = linenum - - if not ifndef or not define or ifndef != define: - error(filename, 0, 'build/header_guard', 5, - 'No #ifndef header guard found, suggested CPP variable is: %s' % - cppvar) - return - - # The guard should be PATH_FILE_H_, but we also allow PATH_FILE_H__ - # for backward compatibility. - if ifndef != cppvar: - error_level = 0 - if ifndef != cppvar + '_': - error_level = 5 - - ParseNolintSuppressions(filename, raw_lines[ifndef_linenum], ifndef_linenum, - error) - error(filename, ifndef_linenum, 'build/header_guard', error_level, - '#ifndef header guard has wrong style, please use: %s' % cppvar) - - # Check for "//" comments on endif line. - ParseNolintSuppressions(filename, raw_lines[endif_linenum], endif_linenum, - error) - match = Match(r'#endif\s*//\s*' + cppvar + r'(_)?\b', endif) - if match: - if match.group(1) == '_': - # Issue low severity warning for deprecated double trailing underscore - error(filename, endif_linenum, 'build/header_guard', 0, - '#endif line should be "#endif // %s"' % cppvar) - return - - # Didn't find the corresponding "//" comment. If this file does not - # contain any "//" comments at all, it could be that the compiler - # only wants "/**/" comments, look for those instead. - no_single_line_comments = True - for i in xrange(1, len(raw_lines) - 1): - line = raw_lines[i] - if Match(r'^(?:(?:\'(?:\.|[^\'])*\')|(?:"(?:\.|[^"])*")|[^\'"])*//', line): - no_single_line_comments = False - break - - if no_single_line_comments: - match = Match(r'#endif\s*/\*\s*' + cppvar + r'(_)?\s*\*/', endif) - if match: - if match.group(1) == '_': - # Low severity warning for double trailing underscore - error(filename, endif_linenum, 'build/header_guard', 0, - '#endif line should be "#endif /* %s */"' % cppvar) - return - - # Didn't find anything - error(filename, endif_linenum, 'build/header_guard', 5, - '#endif line should be "#endif // %s"' % cppvar) - - -def CheckHeaderFileIncluded(filename, include_state, error): - """Logs an error if a .cc file does not include its header.""" - - # Do not check test files - if filename.endswith('_test.cc') or filename.endswith('_unittest.cc'): - return - - fileinfo = FileInfo(filename) - headerfile = filename[0:len(filename) - 2] + 'h' - if not os.path.exists(headerfile): - return - headername = FileInfo(headerfile).RepositoryName() - first_include = 0 - for section_list in include_state.include_list: - for f in section_list: - if headername in f[0] or f[0] in headername: - return - if not first_include: - first_include = f[1] - - error(filename, first_include, 'build/include', 5, - '%s should include its header file %s' % (fileinfo.RepositoryName(), - headername)) - - -def CheckForBadCharacters(filename, lines, error): - """Logs an error for each line containing bad characters. - - Two kinds of bad characters: - - 1. Unicode replacement characters: These indicate that either the file - contained invalid UTF-8 (likely) or Unicode replacement characters (which - it shouldn't). Note that it's possible for this to throw off line - numbering if the invalid UTF-8 occurred adjacent to a newline. - - 2. NUL bytes. These are problematic for some tools. - - Args: - filename: The name of the current file. - lines: An array of strings, each representing a line of the file. - error: The function to call with any errors found. - """ - for linenum, line in enumerate(lines): - if u'\ufffd' in line: - error(filename, linenum, 'readability/utf8', 5, - 'Line contains invalid UTF-8 (or Unicode replacement character).') - if '\0' in line: - error(filename, linenum, 'readability/nul', 5, 'Line contains NUL byte.') - - -def CheckForNewlineAtEOF(filename, lines, error): - """Logs an error if there is no newline char at the end of the file. - - Args: - filename: The name of the current file. - lines: An array of strings, each representing a line of the file. - error: The function to call with any errors found. - """ - - # The array lines() was created by adding two newlines to the - # original file (go figure), then splitting on \n. - # To verify that the file ends in \n, we just have to make sure the - # last-but-two element of lines() exists and is empty. - if len(lines) < 3 or lines[-2]: - error(filename, len(lines) - 2, 'whitespace/ending_newline', 5, - 'Could not find a newline character at the end of the file.') - - -def CheckForMultilineCommentsAndStrings(filename, clean_lines, linenum, error): - """Logs an error if we see /* ... */ or "..." that extend past one line. - - /* ... */ comments are legit inside macros, for one line. - Otherwise, we prefer // comments, so it's ok to warn about the - other. Likewise, it's ok for strings to extend across multiple - lines, as long as a line continuation character (backslash) - terminates each line. Although not currently prohibited by the C++ - style guide, it's ugly and unnecessary. We don't do well with either - in this lint program, so we warn about both. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Remove all \\ (escaped backslashes) from the line. They are OK, and the - # second (escaped) slash may trigger later \" detection erroneously. - line = line.replace('\\\\', '') - - if line.count('/*') > line.count('*/'): - error(filename, linenum, 'readability/multiline_comment', 5, - 'Complex multi-line /*...*/-style comment found. ' - 'Lint may give bogus warnings. ' - 'Consider replacing these with //-style comments, ' - 'with #if 0...#endif, ' - 'or with more clearly structured multi-line comments.') - - if (line.count('"') - line.count('\\"')) % 2: - error(filename, linenum, 'readability/multiline_string', 5, - 'Multi-line string ("...") found. This lint script doesn\'t ' - 'do well with such strings, and may give bogus warnings. ' - 'Use C++11 raw strings or concatenation instead.') - - -# (non-threadsafe name, thread-safe alternative, validation pattern) -# -# The validation pattern is used to eliminate false positives such as: -# _rand(); // false positive due to substring match. -# ->rand(); // some member function rand(). -# ACMRandom rand(seed); // some variable named rand. -# ISAACRandom rand(); // another variable named rand. -# -# Basically we require the return value of these functions to be used -# in some expression context on the same line by matching on some -# operator before the function name. This eliminates constructors and -# member function calls. -_UNSAFE_FUNC_PREFIX = r'(?:[-+*/=%^&|(<]\s*|>\s+)' -_THREADING_LIST = ( - ('asctime(', 'asctime_r(', _UNSAFE_FUNC_PREFIX + r'asctime\([^)]+\)'), - ('ctime(', 'ctime_r(', _UNSAFE_FUNC_PREFIX + r'ctime\([^)]+\)'), - ('getgrgid(', 'getgrgid_r(', _UNSAFE_FUNC_PREFIX + r'getgrgid\([^)]+\)'), - ('getgrnam(', 'getgrnam_r(', _UNSAFE_FUNC_PREFIX + r'getgrnam\([^)]+\)'), - ('getlogin(', 'getlogin_r(', _UNSAFE_FUNC_PREFIX + r'getlogin\(\)'), - ('getpwnam(', 'getpwnam_r(', _UNSAFE_FUNC_PREFIX + r'getpwnam\([^)]+\)'), - ('getpwuid(', 'getpwuid_r(', _UNSAFE_FUNC_PREFIX + r'getpwuid\([^)]+\)'), - ('gmtime(', 'gmtime_r(', _UNSAFE_FUNC_PREFIX + r'gmtime\([^)]+\)'), - ('localtime(', 'localtime_r(', _UNSAFE_FUNC_PREFIX + r'localtime\([^)]+\)'), - ('rand(', 'rand_r(', _UNSAFE_FUNC_PREFIX + r'rand\(\)'), - ('strtok(', 'strtok_r(', - _UNSAFE_FUNC_PREFIX + r'strtok\([^)]+\)'), - ('ttyname(', 'ttyname_r(', _UNSAFE_FUNC_PREFIX + r'ttyname\([^)]+\)'), - ) - - -def CheckPosixThreading(filename, clean_lines, linenum, error): - """Checks for calls to thread-unsafe functions. - - Much code has been originally written without consideration of - multi-threading. Also, engineers are relying on their old experience; - they have learned posix before threading extensions were added. These - tests guide the engineers to use thread-safe functions (when using - posix directly). - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - for single_thread_func, multithread_safe_func, pattern in _THREADING_LIST: - # Additional pattern matching check to confirm that this is the - # function we are looking for - if Search(pattern, line): - error(filename, linenum, 'runtime/threadsafe_fn', 2, - 'Consider using ' + multithread_safe_func + - '...) instead of ' + single_thread_func + - '...) for improved thread safety.') - - -def CheckVlogArguments(filename, clean_lines, linenum, error): - """Checks that VLOG() is only used for defining a logging level. - - For example, VLOG(2) is correct. VLOG(INFO), VLOG(WARNING), VLOG(ERROR), and - VLOG(FATAL) are not. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - if Search(r'\bVLOG\((INFO|ERROR|WARNING|DFATAL|FATAL)\)', line): - error(filename, linenum, 'runtime/vlog', 5, - 'VLOG() should be used with numeric verbosity level. ' - 'Use LOG() if you want symbolic severity levels.') - -# Matches invalid increment: *count++, which moves pointer instead of -# incrementing a value. -_RE_PATTERN_INVALID_INCREMENT = re.compile( - r'^\s*\*\w+(\+\+|--);') - - -def CheckInvalidIncrement(filename, clean_lines, linenum, error): - """Checks for invalid increment *count++. - - For example following function: - void increment_counter(int* count) { - *count++; - } - is invalid, because it effectively does count++, moving pointer, and should - be replaced with ++*count, (*count)++ or *count += 1. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - if _RE_PATTERN_INVALID_INCREMENT.match(line): - error(filename, linenum, 'runtime/invalid_increment', 5, - 'Changing pointer instead of value (or unused value of operator*).') - - -def IsMacroDefinition(clean_lines, linenum): - if Search(r'^#define', clean_lines[linenum]): - return True - - if linenum > 0 and Search(r'\\$', clean_lines[linenum - 1]): - return True - - return False - - -def IsForwardClassDeclaration(clean_lines, linenum): - return Match(r'^\s*(\btemplate\b)*.*class\s+\w+;\s*$', clean_lines[linenum]) - - -class _BlockInfo(object): - """Stores information about a generic block of code.""" - - def __init__(self, seen_open_brace): - self.seen_open_brace = seen_open_brace - self.open_parentheses = 0 - self.inline_asm = _NO_ASM - self.check_namespace_indentation = False - - def CheckBegin(self, filename, clean_lines, linenum, error): - """Run checks that applies to text up to the opening brace. - - This is mostly for checking the text after the class identifier - and the "{", usually where the base class is specified. For other - blocks, there isn't much to check, so we always pass. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - pass - - def CheckEnd(self, filename, clean_lines, linenum, error): - """Run checks that applies to text after the closing brace. - - This is mostly used for checking end of namespace comments. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - pass - - def IsBlockInfo(self): - """Returns true if this block is a _BlockInfo. - - This is convenient for verifying that an object is an instance of - a _BlockInfo, but not an instance of any of the derived classes. - - Returns: - True for this class, False for derived classes. - """ - return self.__class__ == _BlockInfo - - -class _ExternCInfo(_BlockInfo): - """Stores information about an 'extern "C"' block.""" - - def __init__(self): - _BlockInfo.__init__(self, True) - - -class _ClassInfo(_BlockInfo): - """Stores information about a class.""" - - def __init__(self, name, class_or_struct, clean_lines, linenum): - _BlockInfo.__init__(self, False) - self.name = name - self.starting_linenum = linenum - self.is_derived = False - self.check_namespace_indentation = True - if class_or_struct == 'struct': - self.access = 'public' - self.is_struct = True - else: - self.access = 'private' - self.is_struct = False - - # Remember initial indentation level for this class. Using raw_lines here - # instead of elided to account for leading comments. - self.class_indent = GetIndentLevel(clean_lines.raw_lines[linenum]) - - # Try to find the end of the class. This will be confused by things like: - # class A { - # } *x = { ... - # - # But it's still good enough for CheckSectionSpacing. - self.last_line = 0 - depth = 0 - for i in range(linenum, clean_lines.NumLines()): - line = clean_lines.elided[i] - depth += line.count('{') - line.count('}') - if not depth: - self.last_line = i - break - - def CheckBegin(self, filename, clean_lines, linenum, error): - # Look for a bare ':' - if Search('(^|[^:]):($|[^:])', clean_lines.elided[linenum]): - self.is_derived = True - - def CheckEnd(self, filename, clean_lines, linenum, error): - # If there is a DISALLOW macro, it should appear near the end of - # the class. - seen_last_thing_in_class = False - for i in xrange(linenum - 1, self.starting_linenum, -1): - match = Search( - r'\b(DISALLOW_COPY_AND_ASSIGN|DISALLOW_IMPLICIT_CONSTRUCTORS)\(' + - self.name + r'\)', - clean_lines.elided[i]) - if match: - if seen_last_thing_in_class: - error(filename, i, 'readability/constructors', 3, - match.group(1) + ' should be the last thing in the class') - break - - if not Match(r'^\s*$', clean_lines.elided[i]): - seen_last_thing_in_class = True - - # Check that closing brace is aligned with beginning of the class. - # Only do this if the closing brace is indented by only whitespaces. - # This means we will not check single-line class definitions. - indent = Match(r'^( *)\}', clean_lines.elided[linenum]) - if indent and len(indent.group(1)) != self.class_indent: - if self.is_struct: - parent = 'struct ' + self.name - else: - parent = 'class ' + self.name - error(filename, linenum, 'whitespace/indent', 3, - 'Closing brace should be aligned with beginning of %s' % parent) - - -class _NamespaceInfo(_BlockInfo): - """Stores information about a namespace.""" - - def __init__(self, name, linenum): - _BlockInfo.__init__(self, False) - self.name = name or '' - self.starting_linenum = linenum - self.check_namespace_indentation = True - - def CheckEnd(self, filename, clean_lines, linenum, error): - """Check end of namespace comments.""" - line = clean_lines.raw_lines[linenum] - - # Check how many lines is enclosed in this namespace. Don't issue - # warning for missing namespace comments if there aren't enough - # lines. However, do apply checks if there is already an end of - # namespace comment and it's incorrect. - # - # TODO(unknown): We always want to check end of namespace comments - # if a namespace is large, but sometimes we also want to apply the - # check if a short namespace contained nontrivial things (something - # other than forward declarations). There is currently no logic on - # deciding what these nontrivial things are, so this check is - # triggered by namespace size only, which works most of the time. - if (linenum - self.starting_linenum < 10 - and not Match(r'};*\s*(//|/\*).*\bnamespace\b', line)): - return - - # Look for matching comment at end of namespace. - # - # Note that we accept C style "/* */" comments for terminating - # namespaces, so that code that terminate namespaces inside - # preprocessor macros can be cpplint clean. - # - # We also accept stuff like "// end of namespace ." with the - # period at the end. - # - # Besides these, we don't accept anything else, otherwise we might - # get false negatives when existing comment is a substring of the - # expected namespace. - if self.name: - # Named namespace - if not Match((r'};*\s*(//|/\*).*\bnamespace\s+' + re.escape(self.name) + - r'[\*/\.\\\s]*$'), - line): - error(filename, linenum, 'readability/namespace', 5, - 'Namespace should be terminated with "// namespace %s"' % - self.name) - else: - # Anonymous namespace - if not Match(r'};*\s*(//|/\*).*\bnamespace[\*/\.\\\s]*$', line): - # If "// namespace anonymous" or "// anonymous namespace (more text)", - # mention "// anonymous namespace" as an acceptable form - if Match(r'}.*\b(namespace anonymous|anonymous namespace)\b', line): - error(filename, linenum, 'readability/namespace', 5, - 'Anonymous namespace should be terminated with "// namespace"' - ' or "// anonymous namespace"') - else: - error(filename, linenum, 'readability/namespace', 5, - 'Anonymous namespace should be terminated with "// namespace"') - - -class _PreprocessorInfo(object): - """Stores checkpoints of nesting stacks when #if/#else is seen.""" - - def __init__(self, stack_before_if): - # The entire nesting stack before #if - self.stack_before_if = stack_before_if - - # The entire nesting stack up to #else - self.stack_before_else = [] - - # Whether we have already seen #else or #elif - self.seen_else = False - - -class NestingState(object): - """Holds states related to parsing braces.""" - - def __init__(self): - # Stack for tracking all braces. An object is pushed whenever we - # see a "{", and popped when we see a "}". Only 3 types of - # objects are possible: - # - _ClassInfo: a class or struct. - # - _NamespaceInfo: a namespace. - # - _BlockInfo: some other type of block. - self.stack = [] - - # Top of the previous stack before each Update(). - # - # Because the nesting_stack is updated at the end of each line, we - # had to do some convoluted checks to find out what is the current - # scope at the beginning of the line. This check is simplified by - # saving the previous top of nesting stack. - # - # We could save the full stack, but we only need the top. Copying - # the full nesting stack would slow down cpplint by ~10%. - self.previous_stack_top = [] - - # Stack of _PreprocessorInfo objects. - self.pp_stack = [] - - def SeenOpenBrace(self): - """Check if we have seen the opening brace for the innermost block. - - Returns: - True if we have seen the opening brace, False if the innermost - block is still expecting an opening brace. - """ - return (not self.stack) or self.stack[-1].seen_open_brace - - def InNamespaceBody(self): - """Check if we are currently one level inside a namespace body. - - Returns: - True if top of the stack is a namespace block, False otherwise. - """ - return self.stack and isinstance(self.stack[-1], _NamespaceInfo) - - def InExternC(self): - """Check if we are currently one level inside an 'extern "C"' block. - - Returns: - True if top of the stack is an extern block, False otherwise. - """ - return self.stack and isinstance(self.stack[-1], _ExternCInfo) - - def InClassDeclaration(self): - """Check if we are currently one level inside a class or struct declaration. - - Returns: - True if top of the stack is a class/struct, False otherwise. - """ - return self.stack and isinstance(self.stack[-1], _ClassInfo) - - def InAsmBlock(self): - """Check if we are currently one level inside an inline ASM block. - - Returns: - True if the top of the stack is a block containing inline ASM. - """ - return self.stack and self.stack[-1].inline_asm != _NO_ASM - - def InTemplateArgumentList(self, clean_lines, linenum, pos): - """Check if current position is inside template argument list. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - pos: position just after the suspected template argument. - Returns: - True if (linenum, pos) is inside template arguments. - """ - while linenum < clean_lines.NumLines(): - # Find the earliest character that might indicate a template argument - line = clean_lines.elided[linenum] - match = Match(r'^[^{};=\[\]\.<>]*(.)', line[pos:]) - if not match: - linenum += 1 - pos = 0 - continue - token = match.group(1) - pos += len(match.group(0)) - - # These things do not look like template argument list: - # class Suspect { - # class Suspect x; } - if token in ('{', '}', ';'): return False - - # These things look like template argument list: - # template - # template - # template - # template - if token in ('>', '=', '[', ']', '.'): return True - - # Check if token is an unmatched '<'. - # If not, move on to the next character. - if token != '<': - pos += 1 - if pos >= len(line): - linenum += 1 - pos = 0 - continue - - # We can't be sure if we just find a single '<', and need to - # find the matching '>'. - (_, end_line, end_pos) = CloseExpression(clean_lines, linenum, pos - 1) - if end_pos < 0: - # Not sure if template argument list or syntax error in file - return False - linenum = end_line - pos = end_pos - return False - - def UpdatePreprocessor(self, line): - """Update preprocessor stack. - - We need to handle preprocessors due to classes like this: - #ifdef SWIG - struct ResultDetailsPageElementExtensionPoint { - #else - struct ResultDetailsPageElementExtensionPoint : public Extension { - #endif - - We make the following assumptions (good enough for most files): - - Preprocessor condition evaluates to true from #if up to first - #else/#elif/#endif. - - - Preprocessor condition evaluates to false from #else/#elif up - to #endif. We still perform lint checks on these lines, but - these do not affect nesting stack. - - Args: - line: current line to check. - """ - if Match(r'^\s*#\s*(if|ifdef|ifndef)\b', line): - # Beginning of #if block, save the nesting stack here. The saved - # stack will allow us to restore the parsing state in the #else case. - self.pp_stack.append(_PreprocessorInfo(copy.deepcopy(self.stack))) - elif Match(r'^\s*#\s*(else|elif)\b', line): - # Beginning of #else block - if self.pp_stack: - if not self.pp_stack[-1].seen_else: - # This is the first #else or #elif block. Remember the - # whole nesting stack up to this point. This is what we - # keep after the #endif. - self.pp_stack[-1].seen_else = True - self.pp_stack[-1].stack_before_else = copy.deepcopy(self.stack) - - # Restore the stack to how it was before the #if - self.stack = copy.deepcopy(self.pp_stack[-1].stack_before_if) - else: - # TODO(unknown): unexpected #else, issue warning? - pass - elif Match(r'^\s*#\s*endif\b', line): - # End of #if or #else blocks. - if self.pp_stack: - # If we saw an #else, we will need to restore the nesting - # stack to its former state before the #else, otherwise we - # will just continue from where we left off. - if self.pp_stack[-1].seen_else: - # Here we can just use a shallow copy since we are the last - # reference to it. - self.stack = self.pp_stack[-1].stack_before_else - # Drop the corresponding #if - self.pp_stack.pop() - else: - # TODO(unknown): unexpected #endif, issue warning? - pass - - # TODO(unknown): Update() is too long, but we will refactor later. - def Update(self, filename, clean_lines, linenum, error): - """Update nesting state with current line. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Remember top of the previous nesting stack. - # - # The stack is always pushed/popped and not modified in place, so - # we can just do a shallow copy instead of copy.deepcopy. Using - # deepcopy would slow down cpplint by ~28%. - if self.stack: - self.previous_stack_top = self.stack[-1] - else: - self.previous_stack_top = None - - # Update pp_stack - self.UpdatePreprocessor(line) - - # Count parentheses. This is to avoid adding struct arguments to - # the nesting stack. - if self.stack: - inner_block = self.stack[-1] - depth_change = line.count('(') - line.count(')') - inner_block.open_parentheses += depth_change - - # Also check if we are starting or ending an inline assembly block. - if inner_block.inline_asm in (_NO_ASM, _END_ASM): - if (depth_change != 0 and - inner_block.open_parentheses == 1 and - _MATCH_ASM.match(line)): - # Enter assembly block - inner_block.inline_asm = _INSIDE_ASM - else: - # Not entering assembly block. If previous line was _END_ASM, - # we will now shift to _NO_ASM state. - inner_block.inline_asm = _NO_ASM - elif (inner_block.inline_asm == _INSIDE_ASM and - inner_block.open_parentheses == 0): - # Exit assembly block - inner_block.inline_asm = _END_ASM - - # Consume namespace declaration at the beginning of the line. Do - # this in a loop so that we catch same line declarations like this: - # namespace proto2 { namespace bridge { class MessageSet; } } - while True: - # Match start of namespace. The "\b\s*" below catches namespace - # declarations even if it weren't followed by a whitespace, this - # is so that we don't confuse our namespace checker. The - # missing spaces will be flagged by CheckSpacing. - namespace_decl_match = Match(r'^\s*namespace\b\s*([:\w]+)?(.*)$', line) - if not namespace_decl_match: - break - - new_namespace = _NamespaceInfo(namespace_decl_match.group(1), linenum) - self.stack.append(new_namespace) - - line = namespace_decl_match.group(2) - if line.find('{') != -1: - new_namespace.seen_open_brace = True - line = line[line.find('{') + 1:] - - # Look for a class declaration in whatever is left of the line - # after parsing namespaces. The regexp accounts for decorated classes - # such as in: - # class LOCKABLE API Object { - # }; - class_decl_match = Match( - r'^(\s*(?:template\s*<[\w\s<>,:]*>\s*)?' - r'(class|struct)\s+(?:[A-Z_]+\s+)*(\w+(?:::\w+)*))' - r'(.*)$', line) - if (class_decl_match and - (not self.stack or self.stack[-1].open_parentheses == 0)): - # We do not want to accept classes that are actually template arguments: - # template , - # template class Ignore3> - # void Function() {}; - # - # To avoid template argument cases, we scan forward and look for - # an unmatched '>'. If we see one, assume we are inside a - # template argument list. - end_declaration = len(class_decl_match.group(1)) - if not self.InTemplateArgumentList(clean_lines, linenum, end_declaration): - self.stack.append(_ClassInfo( - class_decl_match.group(3), class_decl_match.group(2), - clean_lines, linenum)) - line = class_decl_match.group(4) - - # If we have not yet seen the opening brace for the innermost block, - # run checks here. - if not self.SeenOpenBrace(): - self.stack[-1].CheckBegin(filename, clean_lines, linenum, error) - - # Update access control if we are inside a class/struct - if self.stack and isinstance(self.stack[-1], _ClassInfo): - classinfo = self.stack[-1] - access_match = Match( - r'^(.*)\b(public|private|protected|signals)(\s+(?:slots\s*)?)?' - r':(?:[^:]|$)', - line) - if access_match: - classinfo.access = access_match.group(2) - - # Check that access keywords are indented +1 space. Skip this - # check if the keywords are not preceded by whitespaces. - indent = access_match.group(1) - if (len(indent) != classinfo.class_indent + 1 and - Match(r'^\s*$', indent)): - if classinfo.is_struct: - parent = 'struct ' + classinfo.name - else: - parent = 'class ' + classinfo.name - slots = '' - if access_match.group(3): - slots = access_match.group(3) - error(filename, linenum, 'whitespace/indent', 3, - '%s%s: should be indented +1 space inside %s' % ( - access_match.group(2), slots, parent)) - - # Consume braces or semicolons from what's left of the line - while True: - # Match first brace, semicolon, or closed parenthesis. - matched = Match(r'^[^{;)}]*([{;)}])(.*)$', line) - if not matched: - break - - token = matched.group(1) - if token == '{': - # If namespace or class hasn't seen a opening brace yet, mark - # namespace/class head as complete. Push a new block onto the - # stack otherwise. - if not self.SeenOpenBrace(): - self.stack[-1].seen_open_brace = True - elif Match(r'^extern\s*"[^"]*"\s*\{', line): - self.stack.append(_ExternCInfo()) - else: - self.stack.append(_BlockInfo(True)) - if _MATCH_ASM.match(line): - self.stack[-1].inline_asm = _BLOCK_ASM - - elif token == ';' or token == ')': - # If we haven't seen an opening brace yet, but we already saw - # a semicolon, this is probably a forward declaration. Pop - # the stack for these. - # - # Similarly, if we haven't seen an opening brace yet, but we - # already saw a closing parenthesis, then these are probably - # function arguments with extra "class" or "struct" keywords. - # Also pop these stack for these. - if not self.SeenOpenBrace(): - self.stack.pop() - else: # token == '}' - # Perform end of block checks and pop the stack. - if self.stack: - self.stack[-1].CheckEnd(filename, clean_lines, linenum, error) - self.stack.pop() - line = matched.group(2) - - def InnermostClass(self): - """Get class info on the top of the stack. - - Returns: - A _ClassInfo object if we are inside a class, or None otherwise. - """ - for i in range(len(self.stack), 0, -1): - classinfo = self.stack[i - 1] - if isinstance(classinfo, _ClassInfo): - return classinfo - return None - - def CheckCompletedBlocks(self, filename, error): - """Checks that all classes and namespaces have been completely parsed. - - Call this when all lines in a file have been processed. - Args: - filename: The name of the current file. - error: The function to call with any errors found. - """ - # Note: This test can result in false positives if #ifdef constructs - # get in the way of brace matching. See the testBuildClass test in - # cpplint_unittest.py for an example of this. - for obj in self.stack: - if isinstance(obj, _ClassInfo): - error(filename, obj.starting_linenum, 'build/class', 5, - 'Failed to find complete declaration of class %s' % - obj.name) - elif isinstance(obj, _NamespaceInfo): - error(filename, obj.starting_linenum, 'build/namespaces', 5, - 'Failed to find complete declaration of namespace %s' % - obj.name) - - -def CheckForNonStandardConstructs(filename, clean_lines, linenum, - nesting_state, error): - r"""Logs an error if we see certain non-ANSI constructs ignored by gcc-2. - - Complain about several constructs which gcc-2 accepts, but which are - not standard C++. Warning about these in lint is one way to ease the - transition to new compilers. - - put storage class first (e.g. "static const" instead of "const static"). - - "%lld" instead of %qd" in printf-type functions. - - "%1$d" is non-standard in printf-type functions. - - "\%" is an undefined character escape sequence. - - text after #endif is not allowed. - - invalid inner-style forward declaration. - - >? and ?= and )\?=?\s*(\w+|[+-]?\d+)(\.\d*)?', - line): - error(filename, linenum, 'build/deprecated', 3, - '>? and ))?' - # r'\s*const\s*' + type_name + '\s*&\s*\w+\s*;' - error(filename, linenum, 'runtime/member_string_references', 2, - 'const string& members are dangerous. It is much better to use ' - 'alternatives, such as pointers or simple constants.') - - # Everything else in this function operates on class declarations. - # Return early if the top of the nesting stack is not a class, or if - # the class head is not completed yet. - classinfo = nesting_state.InnermostClass() - if not classinfo or not classinfo.seen_open_brace: - return - - # The class may have been declared with namespace or classname qualifiers. - # The constructor and destructor will not have those qualifiers. - base_classname = classinfo.name.split('::')[-1] - - # Look for single-argument constructors that aren't marked explicit. - # Technically a valid construct, but against style. Also look for - # non-single-argument constructors which are also technically valid, but - # strongly suggest something is wrong. - explicit_constructor_match = Match( - r'\s+(?:inline\s+)?(explicit\s+)?(?:inline\s+)?%s\s*' - r'\(((?:[^()]|\([^()]*\))*)\)' - % re.escape(base_classname), - line) - - if explicit_constructor_match: - is_marked_explicit = explicit_constructor_match.group(1) - - if not explicit_constructor_match.group(2): - constructor_args = [] - else: - constructor_args = explicit_constructor_match.group(2).split(',') - - # collapse arguments so that commas in template parameter lists and function - # argument parameter lists don't split arguments in two - i = 0 - while i < len(constructor_args): - constructor_arg = constructor_args[i] - while (constructor_arg.count('<') > constructor_arg.count('>') or - constructor_arg.count('(') > constructor_arg.count(')')): - constructor_arg += ',' + constructor_args[i + 1] - del constructor_args[i + 1] - constructor_args[i] = constructor_arg - i += 1 - - defaulted_args = [arg for arg in constructor_args if '=' in arg] - noarg_constructor = (not constructor_args or # empty arg list - # 'void' arg specifier - (len(constructor_args) == 1 and - constructor_args[0].strip() == 'void')) - onearg_constructor = ((len(constructor_args) == 1 and # exactly one arg - not noarg_constructor) or - # all but at most one arg defaulted - (len(constructor_args) >= 1 and - not noarg_constructor and - len(defaulted_args) >= len(constructor_args) - 1)) - initializer_list_constructor = bool( - onearg_constructor and - Search(r'\bstd\s*::\s*initializer_list\b', constructor_args[0])) - copy_constructor = bool( - onearg_constructor and - Match(r'(const\s+)?%s(\s*<[^>]*>)?(\s+const)?\s*(?:<\w+>\s*)?&' - % re.escape(base_classname), constructor_args[0].strip())) - - if (not is_marked_explicit and - onearg_constructor and - not initializer_list_constructor and - not copy_constructor): - if defaulted_args: - error(filename, linenum, 'runtime/explicit', 5, - 'Constructors callable with one argument ' - 'should be marked explicit.') - else: - error(filename, linenum, 'runtime/explicit', 5, - 'Single-parameter constructors should be marked explicit.') - elif is_marked_explicit and not onearg_constructor: - if noarg_constructor: - error(filename, linenum, 'runtime/explicit', 5, - 'Zero-parameter constructors should not be marked explicit.') - else: - error(filename, linenum, 'runtime/explicit', 0, - 'Constructors that require multiple arguments ' - 'should not be marked explicit.') - - -def CheckSpacingForFunctionCall(filename, clean_lines, linenum, error): - """Checks for the correctness of various spacing around function calls. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Since function calls often occur inside if/for/while/switch - # expressions - which have their own, more liberal conventions - we - # first see if we should be looking inside such an expression for a - # function call, to which we can apply more strict standards. - fncall = line # if there's no control flow construct, look at whole line - for pattern in (r'\bif\s*\((.*)\)\s*{', - r'\bfor\s*\((.*)\)\s*{', - r'\bwhile\s*\((.*)\)\s*[{;]', - r'\bswitch\s*\((.*)\)\s*{'): - match = Search(pattern, line) - if match: - fncall = match.group(1) # look inside the parens for function calls - break - - # Except in if/for/while/switch, there should never be space - # immediately inside parens (eg "f( 3, 4 )"). We make an exception - # for nested parens ( (a+b) + c ). Likewise, there should never be - # a space before a ( when it's a function argument. I assume it's a - # function argument when the char before the whitespace is legal in - # a function name (alnum + _) and we're not starting a macro. Also ignore - # pointers and references to arrays and functions coz they're too tricky: - # we use a very simple way to recognize these: - # " (something)(maybe-something)" or - # " (something)(maybe-something," or - # " (something)[something]" - # Note that we assume the contents of [] to be short enough that - # they'll never need to wrap. - if ( # Ignore control structures. - not Search(r'\b(if|for|while|switch|return|new|delete|catch|sizeof)\b', - fncall) and - # Ignore pointers/references to functions. - not Search(r' \([^)]+\)\([^)]*(\)|,$)', fncall) and - # Ignore pointers/references to arrays. - not Search(r' \([^)]+\)\[[^\]]+\]', fncall)): - if Search(r'\w\s*\(\s(?!\s*\\$)', fncall): # a ( used for a fn call - error(filename, linenum, 'whitespace/parens', 4, - 'Extra space after ( in function call') - elif Search(r'\(\s+(?!(\s*\\)|\()', fncall): - error(filename, linenum, 'whitespace/parens', 2, - 'Extra space after (') - if (Search(r'\w\s+\(', fncall) and - not Search(r'#\s*define|typedef|using\s+\w+\s*=', fncall) and - not Search(r'\w\s+\((\w+::)*\*\w+\)\(', fncall) and - not Search(r'\bcase\s+\(', fncall)): - # TODO(unknown): Space after an operator function seem to be a common - # error, silence those for now by restricting them to highest verbosity. - if Search(r'\boperator_*\b', line): - error(filename, linenum, 'whitespace/parens', 0, - 'Extra space before ( in function call') - else: - error(filename, linenum, 'whitespace/parens', 4, - 'Extra space before ( in function call') - # If the ) is followed only by a newline or a { + newline, assume it's - # part of a control statement (if/while/etc), and don't complain - if Search(r'[^)]\s+\)\s*[^{\s]', fncall): - # If the closing parenthesis is preceded by only whitespaces, - # try to give a more descriptive error message. - if Search(r'^\s+\)', fncall): - error(filename, linenum, 'whitespace/parens', 2, - 'Closing ) should be moved to the previous line') - else: - error(filename, linenum, 'whitespace/parens', 2, - 'Extra space before )') - - -def IsBlankLine(line): - """Returns true if the given line is blank. - - We consider a line to be blank if the line is empty or consists of - only white spaces. - - Args: - line: A line of a string. - - Returns: - True, if the given line is blank. - """ - return not line or line.isspace() - - -def CheckForNamespaceIndentation(filename, nesting_state, clean_lines, line, - error): - is_namespace_indent_item = ( - len(nesting_state.stack) > 1 and - nesting_state.stack[-1].check_namespace_indentation and - isinstance(nesting_state.previous_stack_top, _NamespaceInfo) and - nesting_state.previous_stack_top == nesting_state.stack[-2]) - - if ShouldCheckNamespaceIndentation(nesting_state, is_namespace_indent_item, - clean_lines.elided, line): - CheckItemIndentationInNamespace(filename, clean_lines.elided, - line, error) - - -def CheckForFunctionLengths(filename, clean_lines, linenum, - function_state, error): - """Reports for long function bodies. - - For an overview why this is done, see: - http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Write_Short_Functions - - Uses a simplistic algorithm assuming other style guidelines - (especially spacing) are followed. - Only checks unindented functions, so class members are unchecked. - Trivial bodies are unchecked, so constructors with huge initializer lists - may be missed. - Blank/comment lines are not counted so as to avoid encouraging the removal - of vertical space and comments just to get through a lint check. - NOLINT *on the last line of a function* disables this check. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - function_state: Current function name and lines in body so far. - error: The function to call with any errors found. - """ - lines = clean_lines.lines - line = lines[linenum] - joined_line = '' - - starting_func = False - regexp = r'(\w(\w|::|\*|\&|\s)*)\(' # decls * & space::name( ... - match_result = Match(regexp, line) - if match_result: - # If the name is all caps and underscores, figure it's a macro and - # ignore it, unless it's TEST or TEST_F. - function_name = match_result.group(1).split()[-1] - if function_name == 'TEST' or function_name == 'TEST_F' or ( - not Match(r'[A-Z_]+$', function_name)): - starting_func = True - - if starting_func: - body_found = False - for start_linenum in xrange(linenum, clean_lines.NumLines()): - start_line = lines[start_linenum] - joined_line += ' ' + start_line.lstrip() - if Search(r'(;|})', start_line): # Declarations and trivial functions - body_found = True - break # ... ignore - elif Search(r'{', start_line): - body_found = True - function = Search(r'((\w|:)*)\(', line).group(1) - if Match(r'TEST', function): # Handle TEST... macros - parameter_regexp = Search(r'(\(.*\))', joined_line) - if parameter_regexp: # Ignore bad syntax - function += parameter_regexp.group(1) - else: - function += '()' - function_state.Begin(function) - break - if not body_found: - # No body for the function (or evidence of a non-function) was found. - error(filename, linenum, 'readability/fn_size', 5, - 'Lint failed to find start of function body.') - elif Match(r'^\}\s*$', line): # function end - function_state.Check(error, filename, linenum) - function_state.End() - elif not Match(r'^\s*$', line): - function_state.Count() # Count non-blank/non-comment lines. - - -_RE_PATTERN_TODO = re.compile(r'^//(\s*)TODO(\(.+?\))?:?(\s|$)?') - - -def CheckComment(line, filename, linenum, next_line_start, error): - """Checks for common mistakes in comments. - - Args: - line: The line in question. - filename: The name of the current file. - linenum: The number of the line to check. - next_line_start: The first non-whitespace column of the next line. - error: The function to call with any errors found. - """ - commentpos = line.find('//') - if commentpos != -1: - # Check if the // may be in quotes. If so, ignore it - # Comparisons made explicit for clarity -- pylint: disable=g-explicit-bool-comparison - if (line.count('"', 0, commentpos) - - line.count('\\"', 0, commentpos)) % 2 == 0: # not in quotes - # Allow one space for new scopes, two spaces otherwise: - if (not (Match(r'^.*{ *//', line) and next_line_start == commentpos) and - ((commentpos >= 1 and - line[commentpos-1] not in string.whitespace) or - (commentpos >= 2 and - line[commentpos-2] not in string.whitespace))): - error(filename, linenum, 'whitespace/comments', 2, - 'At least two spaces is best between code and comments') - - # Checks for common mistakes in TODO comments. - comment = line[commentpos:] - match = _RE_PATTERN_TODO.match(comment) - if match: - # One whitespace is correct; zero whitespace is handled elsewhere. - leading_whitespace = match.group(1) - if len(leading_whitespace) > 1: - error(filename, linenum, 'whitespace/todo', 2, - 'Too many spaces before TODO') - - username = match.group(2) - if not username: - error(filename, linenum, 'readability/todo', 2, - 'Missing username in TODO; it should look like ' - '"// TODO(my_username): Stuff."') - - middle_whitespace = match.group(3) - # Comparisons made explicit for correctness -- pylint: disable=g-explicit-bool-comparison - if middle_whitespace != ' ' and middle_whitespace != '': - error(filename, linenum, 'whitespace/todo', 2, - 'TODO(my_username) should be followed by a space') - - # If the comment contains an alphanumeric character, there - # should be a space somewhere between it and the // unless - # it's a /// or //! Doxygen comment. - if (Match(r'//[^ ]*\w', comment) and - not Match(r'(///|//\!)(\s+|$)', comment)): - error(filename, linenum, 'whitespace/comments', 4, - 'Should have a space between // and comment') - - -def CheckAccess(filename, clean_lines, linenum, nesting_state, error): - """Checks for improper use of DISALLOW* macros. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] # get rid of comments and strings - - matched = Match((r'\s*(DISALLOW_COPY_AND_ASSIGN|' - r'DISALLOW_IMPLICIT_CONSTRUCTORS)'), line) - if not matched: - return - if nesting_state.stack and isinstance(nesting_state.stack[-1], _ClassInfo): - if nesting_state.stack[-1].access != 'private': - error(filename, linenum, 'readability/constructors', 3, - '%s must be in the private: section' % matched.group(1)) - - else: - # Found DISALLOW* macro outside a class declaration, or perhaps it - # was used inside a function when it should have been part of the - # class declaration. We could issue a warning here, but it - # probably resulted in a compiler error already. - pass - - -def CheckSpacing(filename, clean_lines, linenum, nesting_state, error): - """Checks for the correctness of various spacing issues in the code. - - Things we check for: spaces around operators, spaces after - if/for/while/switch, no spaces around parens in function calls, two - spaces between code and comment, don't start a block with a blank - line, don't end a function with a blank line, don't add a blank line - after public/protected/private, don't have too many blank lines in a row. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - error: The function to call with any errors found. - """ - - # Don't use "elided" lines here, otherwise we can't check commented lines. - # Don't want to use "raw" either, because we don't want to check inside C++11 - # raw strings, - raw = clean_lines.lines_without_raw_strings - line = raw[linenum] - - # Before nixing comments, check if the line is blank for no good - # reason. This includes the first line after a block is opened, and - # blank lines at the end of a function (ie, right before a line like '}' - # - # Skip all the blank line checks if we are immediately inside a - # namespace body. In other words, don't issue blank line warnings - # for this block: - # namespace { - # - # } - # - # A warning about missing end of namespace comments will be issued instead. - # - # Also skip blank line checks for 'extern "C"' blocks, which are formatted - # like namespaces. - if (IsBlankLine(line) and - not nesting_state.InNamespaceBody() and - not nesting_state.InExternC()): - elided = clean_lines.elided - prev_line = elided[linenum - 1] - prevbrace = prev_line.rfind('{') - # TODO(unknown): Don't complain if line before blank line, and line after, - # both start with alnums and are indented the same amount. - # This ignores whitespace at the start of a namespace block - # because those are not usually indented. - if prevbrace != -1 and prev_line[prevbrace:].find('}') == -1: - # OK, we have a blank line at the start of a code block. Before we - # complain, we check if it is an exception to the rule: The previous - # non-empty line has the parameters of a function header that are indented - # 4 spaces (because they did not fit in a 80 column line when placed on - # the same line as the function name). We also check for the case where - # the previous line is indented 6 spaces, which may happen when the - # initializers of a constructor do not fit into a 80 column line. - exception = False - if Match(r' {6}\w', prev_line): # Initializer list? - # We are looking for the opening column of initializer list, which - # should be indented 4 spaces to cause 6 space indentation afterwards. - search_position = linenum-2 - while (search_position >= 0 - and Match(r' {6}\w', elided[search_position])): - search_position -= 1 - exception = (search_position >= 0 - and elided[search_position][:5] == ' :') - else: - # Search for the function arguments or an initializer list. We use a - # simple heuristic here: If the line is indented 4 spaces; and we have a - # closing paren, without the opening paren, followed by an opening brace - # or colon (for initializer lists) we assume that it is the last line of - # a function header. If we have a colon indented 4 spaces, it is an - # initializer list. - exception = (Match(r' {4}\w[^\(]*\)\s*(const\s*)?(\{\s*$|:)', - prev_line) - or Match(r' {4}:', prev_line)) - - if not exception: - error(filename, linenum, 'whitespace/blank_line', 2, - 'Redundant blank line at the start of a code block ' - 'should be deleted.') - # Ignore blank lines at the end of a block in a long if-else - # chain, like this: - # if (condition1) { - # // Something followed by a blank line - # - # } else if (condition2) { - # // Something else - # } - if linenum + 1 < clean_lines.NumLines(): - next_line = raw[linenum + 1] - if (next_line - and Match(r'\s*}', next_line) - and next_line.find('} else ') == -1): - error(filename, linenum, 'whitespace/blank_line', 3, - 'Redundant blank line at the end of a code block ' - 'should be deleted.') - - matched = Match(r'\s*(public|protected|private):', prev_line) - if matched: - error(filename, linenum, 'whitespace/blank_line', 3, - 'Do not leave a blank line after "%s:"' % matched.group(1)) - - # Next, check comments - next_line_start = 0 - if linenum + 1 < clean_lines.NumLines(): - next_line = raw[linenum + 1] - next_line_start = len(next_line) - len(next_line.lstrip()) - CheckComment(line, filename, linenum, next_line_start, error) - - # get rid of comments and strings - line = clean_lines.elided[linenum] - - # You shouldn't have spaces before your brackets, except maybe after - # 'delete []' or 'return []() {};' - if Search(r'\w\s+\[', line) and not Search(r'(?:delete|return)\s+\[', line): - error(filename, linenum, 'whitespace/braces', 5, - 'Extra space before [') - - # In range-based for, we wanted spaces before and after the colon, but - # not around "::" tokens that might appear. - if (Search(r'for *\(.*[^:]:[^: ]', line) or - Search(r'for *\(.*[^: ]:[^:]', line)): - error(filename, linenum, 'whitespace/forcolon', 2, - 'Missing space around colon in range-based for loop') - - -def CheckOperatorSpacing(filename, clean_lines, linenum, error): - """Checks for horizontal spacing around operators. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Don't try to do spacing checks for operator methods. Do this by - # replacing the troublesome characters with something else, - # preserving column position for all other characters. - # - # The replacement is done repeatedly to avoid false positives from - # operators that call operators. - while True: - match = Match(r'^(.*\boperator\b)(\S+)(\s*\(.*)$', line) - if match: - line = match.group(1) + ('_' * len(match.group(2))) + match.group(3) - else: - break - - # We allow no-spaces around = within an if: "if ( (a=Foo()) == 0 )". - # Otherwise not. Note we only check for non-spaces on *both* sides; - # sometimes people put non-spaces on one side when aligning ='s among - # many lines (not that this is behavior that I approve of...) - if ((Search(r'[\w.]=', line) or - Search(r'=[\w.]', line)) - and not Search(r'\b(if|while|for) ', line) - # Operators taken from [lex.operators] in C++11 standard. - and not Search(r'(>=|<=|==|!=|&=|\^=|\|=|\+=|\*=|\/=|\%=)', line) - and not Search(r'operator=', line)): - error(filename, linenum, 'whitespace/operators', 4, - 'Missing spaces around =') - - # It's ok not to have spaces around binary operators like + - * /, but if - # there's too little whitespace, we get concerned. It's hard to tell, - # though, so we punt on this one for now. TODO. - - # You should always have whitespace around binary operators. - # - # Check <= and >= first to avoid false positives with < and >, then - # check non-include lines for spacing around < and >. - # - # If the operator is followed by a comma, assume it's be used in a - # macro context and don't do any checks. This avoids false - # positives. - # - # Note that && is not included here. Those are checked separately - # in CheckRValueReference - match = Search(r'[^<>=!\s](==|!=|<=|>=|\|\|)[^<>=!\s,;\)]', line) - if match: - error(filename, linenum, 'whitespace/operators', 3, - 'Missing spaces around %s' % match.group(1)) - elif not Match(r'#.*include', line): - # Look for < that is not surrounded by spaces. This is only - # triggered if both sides are missing spaces, even though - # technically should should flag if at least one side is missing a - # space. This is done to avoid some false positives with shifts. - match = Match(r'^(.*[^\s<])<[^\s=<,]', line) - if match: - (_, _, end_pos) = CloseExpression( - clean_lines, linenum, len(match.group(1))) - if end_pos <= -1: - error(filename, linenum, 'whitespace/operators', 3, - 'Missing spaces around <') - - # Look for > that is not surrounded by spaces. Similar to the - # above, we only trigger if both sides are missing spaces to avoid - # false positives with shifts. - match = Match(r'^(.*[^-\s>])>[^\s=>,]', line) - if match: - (_, _, start_pos) = ReverseCloseExpression( - clean_lines, linenum, len(match.group(1))) - if start_pos <= -1: - error(filename, linenum, 'whitespace/operators', 3, - 'Missing spaces around >') - - # We allow no-spaces around << when used like this: 10<<20, but - # not otherwise (particularly, not when used as streams) - # - # We also allow operators following an opening parenthesis, since - # those tend to be macros that deal with operators. - match = Search(r'(operator|[^\s(<])(?:L|UL|ULL|l|ul|ull)?<<([^\s,=<])', line) - if (match and not (match.group(1).isdigit() and match.group(2).isdigit()) and - not (match.group(1) == 'operator' and match.group(2) == ';')): - error(filename, linenum, 'whitespace/operators', 3, - 'Missing spaces around <<') - - # We allow no-spaces around >> for almost anything. This is because - # C++11 allows ">>" to close nested templates, which accounts for - # most cases when ">>" is not followed by a space. - # - # We still warn on ">>" followed by alpha character, because that is - # likely due to ">>" being used for right shifts, e.g.: - # value >> alpha - # - # When ">>" is used to close templates, the alphanumeric letter that - # follows would be part of an identifier, and there should still be - # a space separating the template type and the identifier. - # type> alpha - match = Search(r'>>[a-zA-Z_]', line) - if match: - error(filename, linenum, 'whitespace/operators', 3, - 'Missing spaces around >>') - - # There shouldn't be space around unary operators - match = Search(r'(!\s|~\s|[\s]--[\s;]|[\s]\+\+[\s;])', line) - if match: - error(filename, linenum, 'whitespace/operators', 4, - 'Extra space for operator %s' % match.group(1)) - - -def CheckParenthesisSpacing(filename, clean_lines, linenum, error): - """Checks for horizontal spacing around parentheses. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # No spaces after an if, while, switch, or for - match = Search(r' (if\(|for\(|while\(|switch\()', line) - if match: - error(filename, linenum, 'whitespace/parens', 5, - 'Missing space before ( in %s' % match.group(1)) - - # For if/for/while/switch, the left and right parens should be - # consistent about how many spaces are inside the parens, and - # there should either be zero or one spaces inside the parens. - # We don't want: "if ( foo)" or "if ( foo )". - # Exception: "for ( ; foo; bar)" and "for (foo; bar; )" are allowed. - match = Search(r'\b(if|for|while|switch)\s*' - r'\(([ ]*)(.).*[^ ]+([ ]*)\)\s*{\s*$', - line) - if match: - if len(match.group(2)) != len(match.group(4)): - if not (match.group(3) == ';' and - len(match.group(2)) == 1 + len(match.group(4)) or - not match.group(2) and Search(r'\bfor\s*\(.*; \)', line)): - error(filename, linenum, 'whitespace/parens', 5, - 'Mismatching spaces inside () in %s' % match.group(1)) - if len(match.group(2)) not in [0, 1]: - error(filename, linenum, 'whitespace/parens', 5, - 'Should have zero or one spaces inside ( and ) in %s' % - match.group(1)) - - -def CheckCommaSpacing(filename, clean_lines, linenum, error): - """Checks for horizontal spacing near commas and semicolons. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - raw = clean_lines.lines_without_raw_strings - line = clean_lines.elided[linenum] - - # You should always have a space after a comma (either as fn arg or operator) - # - # This does not apply when the non-space character following the - # comma is another comma, since the only time when that happens is - # for empty macro arguments. - # - # We run this check in two passes: first pass on elided lines to - # verify that lines contain missing whitespaces, second pass on raw - # lines to confirm that those missing whitespaces are not due to - # elided comments. - if (Search(r',[^,\s]', ReplaceAll(r'\boperator\s*,\s*\(', 'F(', line)) and - Search(r',[^,\s]', raw[linenum])): - error(filename, linenum, 'whitespace/comma', 3, - 'Missing space after ,') - - # You should always have a space after a semicolon - # except for few corner cases - # TODO(unknown): clarify if 'if (1) { return 1;}' is requires one more - # space after ; - if Search(r';[^\s};\\)/]', line): - error(filename, linenum, 'whitespace/semicolon', 3, - 'Missing space after ;') - - -def CheckBracesSpacing(filename, clean_lines, linenum, error): - """Checks for horizontal spacing near commas. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Except after an opening paren, or after another opening brace (in case of - # an initializer list, for instance), you should have spaces before your - # braces. And since you should never have braces at the beginning of a line, - # this is an easy test. - match = Match(r'^(.*[^ ({>]){', line) - if match: - # Try a bit harder to check for brace initialization. This - # happens in one of the following forms: - # Constructor() : initializer_list_{} { ... } - # Constructor{}.MemberFunction() - # Type variable{}; - # FunctionCall(type{}, ...); - # LastArgument(..., type{}); - # LOG(INFO) << type{} << " ..."; - # map_of_type[{...}] = ...; - # ternary = expr ? new type{} : nullptr; - # OuterTemplate{}> - # - # We check for the character following the closing brace, and - # silence the warning if it's one of those listed above, i.e. - # "{.;,)<>]:". - # - # To account for nested initializer list, we allow any number of - # closing braces up to "{;,)<". We can't simply silence the - # warning on first sight of closing brace, because that would - # cause false negatives for things that are not initializer lists. - # Silence this: But not this: - # Outer{ if (...) { - # Inner{...} if (...){ // Missing space before { - # }; } - # - # There is a false negative with this approach if people inserted - # spurious semicolons, e.g. "if (cond){};", but we will catch the - # spurious semicolon with a separate check. - (endline, endlinenum, endpos) = CloseExpression( - clean_lines, linenum, len(match.group(1))) - trailing_text = '' - if endpos > -1: - trailing_text = endline[endpos:] - for offset in xrange(endlinenum + 1, - min(endlinenum + 3, clean_lines.NumLines() - 1)): - trailing_text += clean_lines.elided[offset] - if not Match(r'^[\s}]*[{.;,)<>\]:]', trailing_text): - error(filename, linenum, 'whitespace/braces', 5, - 'Missing space before {') - - # Make sure '} else {' has spaces. - if Search(r'}else', line): - error(filename, linenum, 'whitespace/braces', 5, - 'Missing space before else') - - # You shouldn't have a space before a semicolon at the end of the line. - # There's a special case for "for" since the style guide allows space before - # the semicolon there. - if Search(r':\s*;\s*$', line): - error(filename, linenum, 'whitespace/semicolon', 5, - 'Semicolon defining empty statement. Use {} instead.') - elif Search(r'^\s*;\s*$', line): - error(filename, linenum, 'whitespace/semicolon', 5, - 'Line contains only semicolon. If this should be an empty statement, ' - 'use {} instead.') - elif (Search(r'\s+;\s*$', line) and - not Search(r'\bfor\b', line)): - error(filename, linenum, 'whitespace/semicolon', 5, - 'Extra space before last semicolon. If this should be an empty ' - 'statement, use {} instead.') - - -def IsDecltype(clean_lines, linenum, column): - """Check if the token ending on (linenum, column) is decltype(). - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: the number of the line to check. - column: end column of the token to check. - Returns: - True if this token is decltype() expression, False otherwise. - """ - (text, _, start_col) = ReverseCloseExpression(clean_lines, linenum, column) - if start_col < 0: - return False - if Search(r'\bdecltype\s*$', text[0:start_col]): - return True - return False - - -def IsTemplateParameterList(clean_lines, linenum, column): - """Check if the token ending on (linenum, column) is the end of template<>. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: the number of the line to check. - column: end column of the token to check. - Returns: - True if this token is end of a template parameter list, False otherwise. - """ - (_, startline, startpos) = ReverseCloseExpression( - clean_lines, linenum, column) - if (startpos > -1 and - Search(r'\btemplate\s*$', clean_lines.elided[startline][0:startpos])): - return True - return False - - -def IsRValueType(typenames, clean_lines, nesting_state, linenum, column): - """Check if the token ending on (linenum, column) is a type. - - Assumes that text to the right of the column is "&&" or a function - name. - - Args: - typenames: set of type names from template-argument-list. - clean_lines: A CleansedLines instance containing the file. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - linenum: the number of the line to check. - column: end column of the token to check. - Returns: - True if this token is a type, False if we are not sure. - """ - prefix = clean_lines.elided[linenum][0:column] - - # Get one word to the left. If we failed to do so, this is most - # likely not a type, since it's unlikely that the type name and "&&" - # would be split across multiple lines. - match = Match(r'^(.*)(\b\w+|[>*)&])\s*$', prefix) - if not match: - return False - - # Check text following the token. If it's "&&>" or "&&," or "&&...", it's - # most likely a rvalue reference used inside a template. - suffix = clean_lines.elided[linenum][column:] - if Match(r'&&\s*(?:[>,]|\.\.\.)', suffix): - return True - - # Check for known types and end of templates: - # int&& variable - # vector&& variable - # - # Because this function is called recursively, we also need to - # recognize pointer and reference types: - # int* Function() - # int& Function() - if (match.group(2) in typenames or - match.group(2) in ['char', 'char16_t', 'char32_t', 'wchar_t', 'bool', - 'short', 'int', 'long', 'signed', 'unsigned', - 'float', 'double', 'void', 'auto', '>', '*', '&']): - return True - - # If we see a close parenthesis, look for decltype on the other side. - # decltype would unambiguously identify a type, anything else is - # probably a parenthesized expression and not a type. - if match.group(2) == ')': - return IsDecltype( - clean_lines, linenum, len(match.group(1)) + len(match.group(2)) - 1) - - # Check for casts and cv-qualifiers. - # match.group(1) remainder - # -------------- --------- - # const_cast< type&& - # const type&& - # type const&& - if Search(r'\b(?:const_cast\s*<|static_cast\s*<|dynamic_cast\s*<|' - r'reinterpret_cast\s*<|\w+\s)\s*$', - match.group(1)): - return True - - # Look for a preceding symbol that might help differentiate the context. - # These are the cases that would be ambiguous: - # match.group(1) remainder - # -------------- --------- - # Call ( expression && - # Declaration ( type&& - # sizeof ( type&& - # if ( expression && - # while ( expression && - # for ( type&& - # for( ; expression && - # statement ; type&& - # block { type&& - # constructor { expression && - start = linenum - line = match.group(1) - match_symbol = None - while start >= 0: - # We want to skip over identifiers and commas to get to a symbol. - # Commas are skipped so that we can find the opening parenthesis - # for function parameter lists. - match_symbol = Match(r'^(.*)([^\w\s,])[\w\s,]*$', line) - if match_symbol: - break - start -= 1 - line = clean_lines.elided[start] - - if not match_symbol: - # Probably the first statement in the file is an rvalue reference - return True - - if match_symbol.group(2) == '}': - # Found closing brace, probably an indicate of this: - # block{} type&& - return True - - if match_symbol.group(2) == ';': - # Found semicolon, probably one of these: - # for(; expression && - # statement; type&& - - # Look for the previous 'for(' in the previous lines. - before_text = match_symbol.group(1) - for i in xrange(start - 1, max(start - 6, 0), -1): - before_text = clean_lines.elided[i] + before_text - if Search(r'for\s*\([^{};]*$', before_text): - # This is the condition inside a for-loop - return False - - # Did not find a for-init-statement before this semicolon, so this - # is probably a new statement and not a condition. - return True - - if match_symbol.group(2) == '{': - # Found opening brace, probably one of these: - # block{ type&& = ... ; } - # constructor{ expression && expression } - - # Look for a closing brace or a semicolon. If we see a semicolon - # first, this is probably a rvalue reference. - line = clean_lines.elided[start][0:len(match_symbol.group(1)) + 1] - end = start - depth = 1 - while True: - for ch in line: - if ch == ';': - return True - elif ch == '{': - depth += 1 - elif ch == '}': - depth -= 1 - if depth == 0: - return False - end += 1 - if end >= clean_lines.NumLines(): - break - line = clean_lines.elided[end] - # Incomplete program? - return False - - if match_symbol.group(2) == '(': - # Opening parenthesis. Need to check what's to the left of the - # parenthesis. Look back one extra line for additional context. - before_text = match_symbol.group(1) - if linenum > 1: - before_text = clean_lines.elided[linenum - 1] + before_text - before_text = match_symbol.group(1) - - # Patterns that are likely to be types: - # [](type&& - # for (type&& - # sizeof(type&& - # operator=(type&& - # - if Search(r'(?:\]|\bfor|\bsizeof|\boperator\s*\S+\s*)\s*$', before_text): - return True - - # Patterns that are likely to be expressions: - # if (expression && - # while (expression && - # : initializer(expression && - # , initializer(expression && - # ( FunctionCall(expression && - # + FunctionCall(expression && - # + (expression && - # - # The last '+' represents operators such as '+' and '-'. - if Search(r'(?:\bif|\bwhile|[-+=%^(]*>)?\s*$', - match_symbol.group(1)) - if match_func: - # Check for constructors, which don't have return types. - if Search(r'\b(?:explicit|inline)$', match_func.group(1)): - return True - implicit_constructor = Match(r'\s*(\w+)\((?:const\s+)?(\w+)', prefix) - if (implicit_constructor and - implicit_constructor.group(1) == implicit_constructor.group(2)): - return True - return IsRValueType(typenames, clean_lines, nesting_state, linenum, - len(match_func.group(1))) - - # Nothing before the function name. If this is inside a block scope, - # this is probably a function call. - return not (nesting_state.previous_stack_top and - nesting_state.previous_stack_top.IsBlockInfo()) - - if match_symbol.group(2) == '>': - # Possibly a closing bracket, check that what's on the other side - # looks like the start of a template. - return IsTemplateParameterList( - clean_lines, start, len(match_symbol.group(1))) - - # Some other symbol, usually something like "a=b&&c". This is most - # likely not a type. - return False - - -def IsDeletedOrDefault(clean_lines, linenum): - """Check if current constructor or operator is deleted or default. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - Returns: - True if this is a deleted or default constructor. - """ - open_paren = clean_lines.elided[linenum].find('(') - if open_paren < 0: - return False - (close_line, _, close_paren) = CloseExpression( - clean_lines, linenum, open_paren) - if close_paren < 0: - return False - return Match(r'\s*=\s*(?:delete|default)\b', close_line[close_paren:]) - - -def IsRValueAllowed(clean_lines, linenum, typenames): - """Check if RValue reference is allowed on a particular line. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - typenames: set of type names from template-argument-list. - Returns: - True if line is within the region where RValue references are allowed. - """ - # Allow region marked by PUSH/POP macros - for i in xrange(linenum, 0, -1): - line = clean_lines.elided[i] - if Match(r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)', line): - if not line.endswith('PUSH'): - return False - for j in xrange(linenum, clean_lines.NumLines(), 1): - line = clean_lines.elided[j] - if Match(r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)', line): - return line.endswith('POP') - - # Allow operator= - line = clean_lines.elided[linenum] - if Search(r'\boperator\s*=\s*\(', line): - return IsDeletedOrDefault(clean_lines, linenum) - - # Allow constructors - match = Match(r'\s*(?:[\w<>]+::)*([\w<>]+)\s*::\s*([\w<>]+)\s*\(', line) - if match and match.group(1) == match.group(2): - return IsDeletedOrDefault(clean_lines, linenum) - if Search(r'\b(?:explicit|inline)\s+[\w<>]+\s*\(', line): - return IsDeletedOrDefault(clean_lines, linenum) - - if Match(r'\s*[\w<>]+\s*\(', line): - previous_line = 'ReturnType' - if linenum > 0: - previous_line = clean_lines.elided[linenum - 1] - if Match(r'^\s*$', previous_line) or Search(r'[{}:;]\s*$', previous_line): - return IsDeletedOrDefault(clean_lines, linenum) - - # Reject types not mentioned in template-argument-list - while line: - match = Match(r'^.*?(\w+)\s*&&(.*)$', line) - if not match: - break - if match.group(1) not in typenames: - return False - line = match.group(2) - - # All RValue types that were in template-argument-list should have - # been removed by now. Those were allowed, assuming that they will - # be forwarded. - # - # If there are no remaining RValue types left (i.e. types that were - # not found in template-argument-list), flag those as not allowed. - return line.find('&&') < 0 - - -def GetTemplateArgs(clean_lines, linenum): - """Find list of template arguments associated with this function declaration. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: Line number containing the start of the function declaration, - usually one line after the end of the template-argument-list. - Returns: - Set of type names, or empty set if this does not appear to have - any template parameters. - """ - # Find start of function - func_line = linenum - while func_line > 0: - line = clean_lines.elided[func_line] - if Match(r'^\s*$', line): - return set() - if line.find('(') >= 0: - break - func_line -= 1 - if func_line == 0: - return set() - - # Collapse template-argument-list into a single string - argument_list = '' - match = Match(r'^(\s*template\s*)<', clean_lines.elided[func_line]) - if match: - # template-argument-list on the same line as function name - start_col = len(match.group(1)) - _, end_line, end_col = CloseExpression(clean_lines, func_line, start_col) - if end_col > -1 and end_line == func_line: - start_col += 1 # Skip the opening bracket - argument_list = clean_lines.elided[func_line][start_col:end_col] - - elif func_line > 1: - # template-argument-list one line before function name - match = Match(r'^(.*)>\s*$', clean_lines.elided[func_line - 1]) - if match: - end_col = len(match.group(1)) - _, start_line, start_col = ReverseCloseExpression( - clean_lines, func_line - 1, end_col) - if start_col > -1: - start_col += 1 # Skip the opening bracket - while start_line < func_line - 1: - argument_list += clean_lines.elided[start_line][start_col:] - start_col = 0 - start_line += 1 - argument_list += clean_lines.elided[func_line - 1][start_col:end_col] - - if not argument_list: - return set() - - # Extract type names - typenames = set() - while True: - match = Match(r'^[,\s]*(?:typename|class)(?:\.\.\.)?\s+(\w+)(.*)$', - argument_list) - if not match: - break - typenames.add(match.group(1)) - argument_list = match.group(2) - return typenames - - -def CheckRValueReference(filename, clean_lines, linenum, nesting_state, error): - """Check for rvalue references. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - error: The function to call with any errors found. - """ - # Find lines missing spaces around &&. - # TODO(unknown): currently we don't check for rvalue references - # with spaces surrounding the && to avoid false positives with - # boolean expressions. - line = clean_lines.elided[linenum] - match = Match(r'^(.*\S)&&', line) - if not match: - match = Match(r'(.*)&&\S', line) - if (not match) or '(&&)' in line or Search(r'\boperator\s*$', match.group(1)): - return - - # Either poorly formed && or an rvalue reference, check the context - # to get a more accurate error message. Mostly we want to determine - # if what's to the left of "&&" is a type or not. - typenames = GetTemplateArgs(clean_lines, linenum) - and_pos = len(match.group(1)) - if IsRValueType(typenames, clean_lines, nesting_state, linenum, and_pos): - if not IsRValueAllowed(clean_lines, linenum, typenames): - error(filename, linenum, 'build/c++11', 3, - 'RValue references are an unapproved C++ feature.') - else: - error(filename, linenum, 'whitespace/operators', 3, - 'Missing spaces around &&') - - -def CheckSectionSpacing(filename, clean_lines, class_info, linenum, error): - """Checks for additional blank line issues related to sections. - - Currently the only thing checked here is blank line before protected/private. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - class_info: A _ClassInfo objects. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - # Skip checks if the class is small, where small means 25 lines or less. - # 25 lines seems like a good cutoff since that's the usual height of - # terminals, and any class that can't fit in one screen can't really - # be considered "small". - # - # Also skip checks if we are on the first line. This accounts for - # classes that look like - # class Foo { public: ... }; - # - # If we didn't find the end of the class, last_line would be zero, - # and the check will be skipped by the first condition. - if (class_info.last_line - class_info.starting_linenum <= 24 or - linenum <= class_info.starting_linenum): - return - - matched = Match(r'\s*(public|protected|private):', clean_lines.lines[linenum]) - if matched: - # Issue warning if the line before public/protected/private was - # not a blank line, but don't do this if the previous line contains - # "class" or "struct". This can happen two ways: - # - We are at the beginning of the class. - # - We are forward-declaring an inner class that is semantically - # private, but needed to be public for implementation reasons. - # Also ignores cases where the previous line ends with a backslash as can be - # common when defining classes in C macros. - prev_line = clean_lines.lines[linenum - 1] - if (not IsBlankLine(prev_line) and - not Search(r'\b(class|struct)\b', prev_line) and - not Search(r'\\$', prev_line)): - # Try a bit harder to find the beginning of the class. This is to - # account for multi-line base-specifier lists, e.g.: - # class Derived - # : public Base { - end_class_head = class_info.starting_linenum - for i in range(class_info.starting_linenum, linenum): - if Search(r'\{\s*$', clean_lines.lines[i]): - end_class_head = i - break - if end_class_head < linenum - 1: - error(filename, linenum, 'whitespace/blank_line', 3, - '"%s:" should be preceded by a blank line' % matched.group(1)) - - -def GetPreviousNonBlankLine(clean_lines, linenum): - """Return the most recent non-blank line and its line number. - - Args: - clean_lines: A CleansedLines instance containing the file contents. - linenum: The number of the line to check. - - Returns: - A tuple with two elements. The first element is the contents of the last - non-blank line before the current line, or the empty string if this is the - first non-blank line. The second is the line number of that line, or -1 - if this is the first non-blank line. - """ - - prevlinenum = linenum - 1 - while prevlinenum >= 0: - prevline = clean_lines.elided[prevlinenum] - if not IsBlankLine(prevline): # if not a blank line... - return (prevline, prevlinenum) - prevlinenum -= 1 - return ('', -1) - - -def CheckBraces(filename, clean_lines, linenum, error): - """Looks for misplaced braces (e.g. at the end of line). - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - - line = clean_lines.elided[linenum] # get rid of comments and strings - - if Match(r'\s*{\s*$', line): - # We allow an open brace to start a line in the case where someone is using - # braces in a block to explicitly create a new scope, which is commonly used - # to control the lifetime of stack-allocated variables. Braces are also - # used for brace initializers inside function calls. We don't detect this - # perfectly: we just don't complain if the last non-whitespace character on - # the previous non-blank line is ',', ';', ':', '(', '{', or '}', or if the - # previous line starts a preprocessor block. - prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] - if (not Search(r'[,;:}{(]\s*$', prevline) and - not Match(r'\s*#', prevline)): - error(filename, linenum, 'whitespace/braces', 4, - '{ should almost always be at the end of the previous line') - - # An else clause should be on the same line as the preceding closing brace. - if Match(r'\s*else\b\s*(?:if\b|\{|$)', line): - prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] - if Match(r'\s*}\s*$', prevline): - error(filename, linenum, 'whitespace/newline', 4, - 'An else should appear on the same line as the preceding }') - - # If braces come on one side of an else, they should be on both. - # However, we have to worry about "else if" that spans multiple lines! - if Search(r'else if\s*\(', line): # could be multi-line if - brace_on_left = bool(Search(r'}\s*else if\s*\(', line)) - # find the ( after the if - pos = line.find('else if') - pos = line.find('(', pos) - if pos > 0: - (endline, _, endpos) = CloseExpression(clean_lines, linenum, pos) - brace_on_right = endline[endpos:].find('{') != -1 - if brace_on_left != brace_on_right: # must be brace after if - error(filename, linenum, 'readability/braces', 5, - 'If an else has a brace on one side, it should have it on both') - elif Search(r'}\s*else[^{]*$', line) or Match(r'[^}]*else\s*{', line): - error(filename, linenum, 'readability/braces', 5, - 'If an else has a brace on one side, it should have it on both') - - # Likewise, an else should never have the else clause on the same line - if Search(r'\belse [^\s{]', line) and not Search(r'\belse if\b', line): - error(filename, linenum, 'whitespace/newline', 4, - 'Else clause should never be on same line as else (use 2 lines)') - - # In the same way, a do/while should never be on one line - if Match(r'\s*do [^\s{]', line): - error(filename, linenum, 'whitespace/newline', 4, - 'do/while clauses should not be on a single line') - - # Check single-line if/else bodies. The style guide says 'curly braces are not - # required for single-line statements'. We additionally allow multi-line, - # single statements, but we reject anything with more than one semicolon in - # it. This means that the first semicolon after the if should be at the end of - # its line, and the line after that should have an indent level equal to or - # lower than the if. We also check for ambiguous if/else nesting without - # braces. - if_else_match = Search(r'\b(if\s*\(|else\b)', line) - if if_else_match and not Match(r'\s*#', line): - if_indent = GetIndentLevel(line) - endline, endlinenum, endpos = line, linenum, if_else_match.end() - if_match = Search(r'\bif\s*\(', line) - if if_match: - # This could be a multiline if condition, so find the end first. - pos = if_match.end() - 1 - (endline, endlinenum, endpos) = CloseExpression(clean_lines, linenum, pos) - # Check for an opening brace, either directly after the if or on the next - # line. If found, this isn't a single-statement conditional. - if (not Match(r'\s*{', endline[endpos:]) - and not (Match(r'\s*$', endline[endpos:]) - and endlinenum < (len(clean_lines.elided) - 1) - and Match(r'\s*{', clean_lines.elided[endlinenum + 1]))): - while (endlinenum < len(clean_lines.elided) - and ';' not in clean_lines.elided[endlinenum][endpos:]): - endlinenum += 1 - endpos = 0 - if endlinenum < len(clean_lines.elided): - endline = clean_lines.elided[endlinenum] - # We allow a mix of whitespace and closing braces (e.g. for one-liner - # methods) and a single \ after the semicolon (for macros) - endpos = endline.find(';') - if not Match(r';[\s}]*(\\?)$', endline[endpos:]): - # Semicolon isn't the last character, there's something trailing. - # Output a warning if the semicolon is not contained inside - # a lambda expression. - if not Match(r'^[^{};]*\[[^\[\]]*\][^{}]*\{[^{}]*\}\s*\)*[;,]\s*$', - endline): - error(filename, linenum, 'readability/braces', 4, - 'If/else bodies with multiple statements require braces') - elif endlinenum < len(clean_lines.elided) - 1: - # Make sure the next line is dedented - next_line = clean_lines.elided[endlinenum + 1] - next_indent = GetIndentLevel(next_line) - # With ambiguous nested if statements, this will error out on the - # if that *doesn't* match the else, regardless of whether it's the - # inner one or outer one. - if (if_match and Match(r'\s*else\b', next_line) - and next_indent != if_indent): - error(filename, linenum, 'readability/braces', 4, - 'Else clause should be indented at the same level as if. ' - 'Ambiguous nested if/else chains require braces.') - elif next_indent > if_indent: - error(filename, linenum, 'readability/braces', 4, - 'If/else bodies with multiple statements require braces') - - -def CheckTrailingSemicolon(filename, clean_lines, linenum, error): - """Looks for redundant trailing semicolon. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - - line = clean_lines.elided[linenum] - - # Block bodies should not be followed by a semicolon. Due to C++11 - # brace initialization, there are more places where semicolons are - # required than not, so we use a whitelist approach to check these - # rather than a blacklist. These are the places where "};" should - # be replaced by just "}": - # 1. Some flavor of block following closing parenthesis: - # for (;;) {}; - # while (...) {}; - # switch (...) {}; - # Function(...) {}; - # if (...) {}; - # if (...) else if (...) {}; - # - # 2. else block: - # if (...) else {}; - # - # 3. const member function: - # Function(...) const {}; - # - # 4. Block following some statement: - # x = 42; - # {}; - # - # 5. Block at the beginning of a function: - # Function(...) { - # {}; - # } - # - # Note that naively checking for the preceding "{" will also match - # braces inside multi-dimensional arrays, but this is fine since - # that expression will not contain semicolons. - # - # 6. Block following another block: - # while (true) {} - # {}; - # - # 7. End of namespaces: - # namespace {}; - # - # These semicolons seems far more common than other kinds of - # redundant semicolons, possibly due to people converting classes - # to namespaces. For now we do not warn for this case. - # - # Try matching case 1 first. - match = Match(r'^(.*\)\s*)\{', line) - if match: - # Matched closing parenthesis (case 1). Check the token before the - # matching opening parenthesis, and don't warn if it looks like a - # macro. This avoids these false positives: - # - macro that defines a base class - # - multi-line macro that defines a base class - # - macro that defines the whole class-head - # - # But we still issue warnings for macros that we know are safe to - # warn, specifically: - # - TEST, TEST_F, TEST_P, MATCHER, MATCHER_P - # - TYPED_TEST - # - INTERFACE_DEF - # - EXCLUSIVE_LOCKS_REQUIRED, SHARED_LOCKS_REQUIRED, LOCKS_EXCLUDED: - # - # We implement a whitelist of safe macros instead of a blacklist of - # unsafe macros, even though the latter appears less frequently in - # google code and would have been easier to implement. This is because - # the downside for getting the whitelist wrong means some extra - # semicolons, while the downside for getting the blacklist wrong - # would result in compile errors. - # - # In addition to macros, we also don't want to warn on - # - Compound literals - # - Lambdas - # - alignas specifier with anonymous structs: - closing_brace_pos = match.group(1).rfind(')') - opening_parenthesis = ReverseCloseExpression( - clean_lines, linenum, closing_brace_pos) - if opening_parenthesis[2] > -1: - line_prefix = opening_parenthesis[0][0:opening_parenthesis[2]] - macro = Search(r'\b([A-Z_]+)\s*$', line_prefix) - func = Match(r'^(.*\])\s*$', line_prefix) - if ((macro and - macro.group(1) not in ( - 'TEST', 'TEST_F', 'MATCHER', 'MATCHER_P', 'TYPED_TEST', - 'EXCLUSIVE_LOCKS_REQUIRED', 'SHARED_LOCKS_REQUIRED', - 'LOCKS_EXCLUDED', 'INTERFACE_DEF')) or - (func and not Search(r'\boperator\s*\[\s*\]', func.group(1))) or - Search(r'\b(?:struct|union)\s+alignas\s*$', line_prefix) or - Search(r'\s+=\s*$', line_prefix)): - match = None - if (match and - opening_parenthesis[1] > 1 and - Search(r'\]\s*$', clean_lines.elided[opening_parenthesis[1] - 1])): - # Multi-line lambda-expression - match = None - - else: - # Try matching cases 2-3. - match = Match(r'^(.*(?:else|\)\s*const)\s*)\{', line) - if not match: - # Try matching cases 4-6. These are always matched on separate lines. - # - # Note that we can't simply concatenate the previous line to the - # current line and do a single match, otherwise we may output - # duplicate warnings for the blank line case: - # if (cond) { - # // blank line - # } - prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] - if prevline and Search(r'[;{}]\s*$', prevline): - match = Match(r'^(\s*)\{', line) - - # Check matching closing brace - if match: - (endline, endlinenum, endpos) = CloseExpression( - clean_lines, linenum, len(match.group(1))) - if endpos > -1 and Match(r'^\s*;', endline[endpos:]): - # Current {} pair is eligible for semicolon check, and we have found - # the redundant semicolon, output warning here. - # - # Note: because we are scanning forward for opening braces, and - # outputting warnings for the matching closing brace, if there are - # nested blocks with trailing semicolons, we will get the error - # messages in reversed order. - error(filename, endlinenum, 'readability/braces', 4, - "You don't need a ; after a }") - - -def CheckEmptyBlockBody(filename, clean_lines, linenum, error): - """Look for empty loop/conditional body with only a single semicolon. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - - # Search for loop keywords at the beginning of the line. Because only - # whitespaces are allowed before the keywords, this will also ignore most - # do-while-loops, since those lines should start with closing brace. - # - # We also check "if" blocks here, since an empty conditional block - # is likely an error. - line = clean_lines.elided[linenum] - matched = Match(r'\s*(for|while|if)\s*\(', line) - if matched: - # Find the end of the conditional expression - (end_line, end_linenum, end_pos) = CloseExpression( - clean_lines, linenum, line.find('(')) - - # Output warning if what follows the condition expression is a semicolon. - # No warning for all other cases, including whitespace or newline, since we - # have a separate check for semicolons preceded by whitespace. - if end_pos >= 0 and Match(r';', end_line[end_pos:]): - if matched.group(1) == 'if': - error(filename, end_linenum, 'whitespace/empty_conditional_body', 5, - 'Empty conditional bodies should use {}') - else: - error(filename, end_linenum, 'whitespace/empty_loop_body', 5, - 'Empty loop bodies should use {} or continue') - - -def FindCheckMacro(line): - """Find a replaceable CHECK-like macro. - - Args: - line: line to search on. - Returns: - (macro name, start position), or (None, -1) if no replaceable - macro is found. - """ - for macro in _CHECK_MACROS: - i = line.find(macro) - if i >= 0: - # Find opening parenthesis. Do a regular expression match here - # to make sure that we are matching the expected CHECK macro, as - # opposed to some other macro that happens to contain the CHECK - # substring. - matched = Match(r'^(.*\b' + macro + r'\s*)\(', line) - if not matched: - continue - return (macro, len(matched.group(1))) - return (None, -1) - - -def CheckCheck(filename, clean_lines, linenum, error): - """Checks the use of CHECK and EXPECT macros. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - - # Decide the set of replacement macros that should be suggested - lines = clean_lines.elided - (check_macro, start_pos) = FindCheckMacro(lines[linenum]) - if not check_macro: - return - - # Find end of the boolean expression by matching parentheses - (last_line, end_line, end_pos) = CloseExpression( - clean_lines, linenum, start_pos) - if end_pos < 0: - return - - # If the check macro is followed by something other than a - # semicolon, assume users will log their own custom error messages - # and don't suggest any replacements. - if not Match(r'\s*;', last_line[end_pos:]): - return - - if linenum == end_line: - expression = lines[linenum][start_pos + 1:end_pos - 1] - else: - expression = lines[linenum][start_pos + 1:] - for i in xrange(linenum + 1, end_line): - expression += lines[i] - expression += last_line[0:end_pos - 1] - - # Parse expression so that we can take parentheses into account. - # This avoids false positives for inputs like "CHECK((a < 4) == b)", - # which is not replaceable by CHECK_LE. - lhs = '' - rhs = '' - operator = None - while expression: - matched = Match(r'^\s*(<<|<<=|>>|>>=|->\*|->|&&|\|\||' - r'==|!=|>=|>|<=|<|\()(.*)$', expression) - if matched: - token = matched.group(1) - if token == '(': - # Parenthesized operand - expression = matched.group(2) - (end, _) = FindEndOfExpressionInLine(expression, 0, ['(']) - if end < 0: - return # Unmatched parenthesis - lhs += '(' + expression[0:end] - expression = expression[end:] - elif token in ('&&', '||'): - # Logical and/or operators. This means the expression - # contains more than one term, for example: - # CHECK(42 < a && a < b); - # - # These are not replaceable with CHECK_LE, so bail out early. - return - elif token in ('<<', '<<=', '>>', '>>=', '->*', '->'): - # Non-relational operator - lhs += token - expression = matched.group(2) - else: - # Relational operator - operator = token - rhs = matched.group(2) - break - else: - # Unparenthesized operand. Instead of appending to lhs one character - # at a time, we do another regular expression match to consume several - # characters at once if possible. Trivial benchmark shows that this - # is more efficient when the operands are longer than a single - # character, which is generally the case. - matched = Match(r'^([^-=!<>()&|]+)(.*)$', expression) - if not matched: - matched = Match(r'^(\s*\S)(.*)$', expression) - if not matched: - break - lhs += matched.group(1) - expression = matched.group(2) - - # Only apply checks if we got all parts of the boolean expression - if not (lhs and operator and rhs): - return - - # Check that rhs do not contain logical operators. We already know - # that lhs is fine since the loop above parses out && and ||. - if rhs.find('&&') > -1 or rhs.find('||') > -1: - return - - # At least one of the operands must be a constant literal. This is - # to avoid suggesting replacements for unprintable things like - # CHECK(variable != iterator) - # - # The following pattern matches decimal, hex integers, strings, and - # characters (in that order). - lhs = lhs.strip() - rhs = rhs.strip() - match_constant = r'^([-+]?(\d+|0[xX][0-9a-fA-F]+)[lLuU]{0,3}|".*"|\'.*\')$' - if Match(match_constant, lhs) or Match(match_constant, rhs): - # Note: since we know both lhs and rhs, we can provide a more - # descriptive error message like: - # Consider using CHECK_EQ(x, 42) instead of CHECK(x == 42) - # Instead of: - # Consider using CHECK_EQ instead of CHECK(a == b) - # - # We are still keeping the less descriptive message because if lhs - # or rhs gets long, the error message might become unreadable. - error(filename, linenum, 'readability/check', 2, - 'Consider using %s instead of %s(a %s b)' % ( - _CHECK_REPLACEMENT[check_macro][operator], - check_macro, operator)) - - -def CheckAltTokens(filename, clean_lines, linenum, error): - """Check alternative keywords being used in boolean expressions. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Avoid preprocessor lines - if Match(r'^\s*#', line): - return - - # Last ditch effort to avoid multi-line comments. This will not help - # if the comment started before the current line or ended after the - # current line, but it catches most of the false positives. At least, - # it provides a way to workaround this warning for people who use - # multi-line comments in preprocessor macros. - # - # TODO(unknown): remove this once cpplint has better support for - # multi-line comments. - if line.find('/*') >= 0 or line.find('*/') >= 0: - return - - for match in _ALT_TOKEN_REPLACEMENT_PATTERN.finditer(line): - error(filename, linenum, 'readability/alt_tokens', 2, - 'Use operator %s instead of %s' % ( - _ALT_TOKEN_REPLACEMENT[match.group(1)], match.group(1))) - - -def GetLineWidth(line): - """Determines the width of the line in column positions. - - Args: - line: A string, which may be a Unicode string. - - Returns: - The width of the line in column positions, accounting for Unicode - combining characters and wide characters. - """ - if isinstance(line, unicode): - width = 0 - for uc in unicodedata.normalize('NFC', line): - if unicodedata.east_asian_width(uc) in ('W', 'F'): - width += 2 - elif not unicodedata.combining(uc): - width += 1 - return width - else: - return len(line) - - -def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state, - error): - """Checks rules from the 'C++ style rules' section of cppguide.html. - - Most of these rules are hard to test (naming, comment style), but we - do what we can. In particular we check for 2-space indents, line lengths, - tab usage, spaces inside code, etc. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - file_extension: The extension (without the dot) of the filename. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - error: The function to call with any errors found. - """ - - # Don't use "elided" lines here, otherwise we can't check commented lines. - # Don't want to use "raw" either, because we don't want to check inside C++11 - # raw strings, - raw_lines = clean_lines.lines_without_raw_strings - line = raw_lines[linenum] - - if line.find('\t') != -1: - error(filename, linenum, 'whitespace/tab', 1, - 'Tab found; better to use spaces') - - # One or three blank spaces at the beginning of the line is weird; it's - # hard to reconcile that with 2-space indents. - # NOTE: here are the conditions rob pike used for his tests. Mine aren't - # as sophisticated, but it may be worth becoming so: RLENGTH==initial_spaces - # if(RLENGTH > 20) complain = 0; - # if(match($0, " +(error|private|public|protected):")) complain = 0; - # if(match(prev, "&& *$")) complain = 0; - # if(match(prev, "\\|\\| *$")) complain = 0; - # if(match(prev, "[\",=><] *$")) complain = 0; - # if(match($0, " <<")) complain = 0; - # if(match(prev, " +for \\(")) complain = 0; - # if(prevodd && match(prevprev, " +for \\(")) complain = 0; - scope_or_label_pattern = r'\s*\w+\s*:\s*\\?$' - classinfo = nesting_state.InnermostClass() - initial_spaces = 0 - cleansed_line = clean_lines.elided[linenum] - while initial_spaces < len(line) and line[initial_spaces] == ' ': - initial_spaces += 1 - if line and line[-1].isspace(): - error(filename, linenum, 'whitespace/end_of_line', 4, - 'Line ends in whitespace. Consider deleting these extra spaces.') - # There are certain situations we allow one space, notably for - # section labels, and also lines containing multi-line raw strings. - elif ((initial_spaces == 1 or initial_spaces == 3) and - not Match(scope_or_label_pattern, cleansed_line) and - not (clean_lines.raw_lines[linenum] != line and - Match(r'^\s*""', line))): - error(filename, linenum, 'whitespace/indent', 3, - 'Weird number of spaces at line-start. ' - 'Are you using a 2-space indent?') - - # Check if the line is a header guard. - is_header_guard = False - if file_extension == 'h': - cppvar = GetHeaderGuardCPPVariable(filename) - if (line.startswith('#ifndef %s' % cppvar) or - line.startswith('#define %s' % cppvar) or - line.startswith('#endif // %s' % cppvar)): - is_header_guard = True - # #include lines and header guards can be long, since there's no clean way to - # split them. - # - # URLs can be long too. It's possible to split these, but it makes them - # harder to cut&paste. - # - # The "$Id:...$" comment may also get very long without it being the - # developers fault. - if (not line.startswith('#include') and not is_header_guard and - not Match(r'^\s*//.*http(s?)://\S*$', line) and - not Match(r'^// \$Id:.*#[0-9]+ \$$', line)): - line_width = GetLineWidth(line) - extended_length = int((_line_length * 1.25)) - if line_width > extended_length: - error(filename, linenum, 'whitespace/line_length', 4, - 'Lines should very rarely be longer than %i characters' % - extended_length) - elif line_width > _line_length: - error(filename, linenum, 'whitespace/line_length', 2, - 'Lines should be <= %i characters long' % _line_length) - - if (cleansed_line.count(';') > 1 and - # for loops are allowed two ;'s (and may run over two lines). - cleansed_line.find('for') == -1 and - (GetPreviousNonBlankLine(clean_lines, linenum)[0].find('for') == -1 or - GetPreviousNonBlankLine(clean_lines, linenum)[0].find(';') != -1) and - # It's ok to have many commands in a switch case that fits in 1 line - not ((cleansed_line.find('case ') != -1 or - cleansed_line.find('default:') != -1) and - cleansed_line.find('break;') != -1)): - error(filename, linenum, 'whitespace/newline', 0, - 'More than one command on the same line') - - # Some more style checks - CheckBraces(filename, clean_lines, linenum, error) - CheckTrailingSemicolon(filename, clean_lines, linenum, error) - CheckEmptyBlockBody(filename, clean_lines, linenum, error) - CheckAccess(filename, clean_lines, linenum, nesting_state, error) - CheckSpacing(filename, clean_lines, linenum, nesting_state, error) - CheckOperatorSpacing(filename, clean_lines, linenum, error) - CheckParenthesisSpacing(filename, clean_lines, linenum, error) - CheckCommaSpacing(filename, clean_lines, linenum, error) - CheckBracesSpacing(filename, clean_lines, linenum, error) - CheckSpacingForFunctionCall(filename, clean_lines, linenum, error) - CheckRValueReference(filename, clean_lines, linenum, nesting_state, error) - CheckCheck(filename, clean_lines, linenum, error) - CheckAltTokens(filename, clean_lines, linenum, error) - classinfo = nesting_state.InnermostClass() - if classinfo: - CheckSectionSpacing(filename, clean_lines, classinfo, linenum, error) - - -_RE_PATTERN_INCLUDE = re.compile(r'^\s*#\s*include\s*([<"])([^>"]*)[>"].*$') -# Matches the first component of a filename delimited by -s and _s. That is: -# _RE_FIRST_COMPONENT.match('foo').group(0) == 'foo' -# _RE_FIRST_COMPONENT.match('foo.cc').group(0) == 'foo' -# _RE_FIRST_COMPONENT.match('foo-bar_baz.cc').group(0) == 'foo' -# _RE_FIRST_COMPONENT.match('foo_bar-baz.cc').group(0) == 'foo' -_RE_FIRST_COMPONENT = re.compile(r'^[^-_.]+') - - -def _DropCommonSuffixes(filename): - """Drops common suffixes like _test.cc or -inl.h from filename. - - For example: - >>> _DropCommonSuffixes('foo/foo-inl.h') - 'foo/foo' - >>> _DropCommonSuffixes('foo/bar/foo.cc') - 'foo/bar/foo' - >>> _DropCommonSuffixes('foo/foo_internal.h') - 'foo/foo' - >>> _DropCommonSuffixes('foo/foo_unusualinternal.h') - 'foo/foo_unusualinternal' - - Args: - filename: The input filename. - - Returns: - The filename with the common suffix removed. - """ - for suffix in ('test.cc', 'regtest.cc', 'unittest.cc', - 'inl.h', 'impl.h', 'internal.h'): - if (filename.endswith(suffix) and len(filename) > len(suffix) and - filename[-len(suffix) - 1] in ('-', '_')): - return filename[:-len(suffix) - 1] - return os.path.splitext(filename)[0] - - -def _IsTestFilename(filename): - """Determines if the given filename has a suffix that identifies it as a test. - - Args: - filename: The input filename. - - Returns: - True if 'filename' looks like a test, False otherwise. - """ - if (filename.endswith('_test.cc') or - filename.endswith('_unittest.cc') or - filename.endswith('_regtest.cc')): - return True - else: - return False - - -def _ClassifyInclude(fileinfo, include, is_system): - """Figures out what kind of header 'include' is. - - Args: - fileinfo: The current file cpplint is running over. A FileInfo instance. - include: The path to a #included file. - is_system: True if the #include used <> rather than "". - - Returns: - One of the _XXX_HEADER constants. - - For example: - >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'stdio.h', True) - _C_SYS_HEADER - >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'string', True) - _CPP_SYS_HEADER - >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/foo.h', False) - _LIKELY_MY_HEADER - >>> _ClassifyInclude(FileInfo('foo/foo_unknown_extension.cc'), - ... 'bar/foo_other_ext.h', False) - _POSSIBLE_MY_HEADER - >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/bar.h', False) - _OTHER_HEADER - """ - # This is a list of all standard c++ header files, except - # those already checked for above. - is_cpp_h = include in _CPP_HEADERS - - if is_system: - if is_cpp_h: - return _CPP_SYS_HEADER - else: - return _C_SYS_HEADER - - # If the target file and the include we're checking share a - # basename when we drop common extensions, and the include - # lives in . , then it's likely to be owned by the target file. - target_dir, target_base = ( - os.path.split(_DropCommonSuffixes(fileinfo.RepositoryName()))) - include_dir, include_base = os.path.split(_DropCommonSuffixes(include)) - if target_base == include_base and ( - include_dir == target_dir or - include_dir == os.path.normpath(target_dir + '/../public')): - return _LIKELY_MY_HEADER - - # If the target and include share some initial basename - # component, it's possible the target is implementing the - # include, so it's allowed to be first, but we'll never - # complain if it's not there. - target_first_component = _RE_FIRST_COMPONENT.match(target_base) - include_first_component = _RE_FIRST_COMPONENT.match(include_base) - if (target_first_component and include_first_component and - target_first_component.group(0) == - include_first_component.group(0)): - return _POSSIBLE_MY_HEADER - - return _OTHER_HEADER - - - -def CheckIncludeLine(filename, clean_lines, linenum, include_state, error): - """Check rules that are applicable to #include lines. - - Strings on #include lines are NOT removed from elided line, to make - certain tasks easier. However, to prevent false positives, checks - applicable to #include lines in CheckLanguage must be put here. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - include_state: An _IncludeState instance in which the headers are inserted. - error: The function to call with any errors found. - """ - fileinfo = FileInfo(filename) - line = clean_lines.lines[linenum] - - # "include" should use the new style "foo/bar.h" instead of just "bar.h" - # Only do this check if the included header follows google naming - # conventions. If not, assume that it's a 3rd party API that - # requires special include conventions. - # - # We also make an exception for Lua headers, which follow google - # naming convention but not the include convention. - match = Match(r'#include\s*"([^/]+\.h)"', line) - if match and not _THIRD_PARTY_HEADERS_PATTERN.match(match.group(1)): - error(filename, linenum, 'build/include', 4, - 'Include the directory when naming .h files') - - # we shouldn't include a file more than once. actually, there are a - # handful of instances where doing so is okay, but in general it's - # not. - match = _RE_PATTERN_INCLUDE.search(line) - if match: - include = match.group(2) - is_system = (match.group(1) == '<') - duplicate_line = include_state.FindHeader(include) - if duplicate_line >= 0: - error(filename, linenum, 'build/include', 4, - '"%s" already included at %s:%s' % - (include, filename, duplicate_line)) - elif (include.endswith('.cc') and - os.path.dirname(fileinfo.RepositoryName()) != os.path.dirname(include)): - error(filename, linenum, 'build/include', 4, - 'Do not include .cc files from other packages') - elif not _THIRD_PARTY_HEADERS_PATTERN.match(include): - include_state.include_list[-1].append((include, linenum)) - - # We want to ensure that headers appear in the right order: - # 1) for foo.cc, foo.h (preferred location) - # 2) c system files - # 3) cpp system files - # 4) for foo.cc, foo.h (deprecated location) - # 5) other google headers - # - # We classify each include statement as one of those 5 types - # using a number of techniques. The include_state object keeps - # track of the highest type seen, and complains if we see a - # lower type after that. - error_message = include_state.CheckNextIncludeOrder( - _ClassifyInclude(fileinfo, include, is_system)) - if error_message: - error(filename, linenum, 'build/include_order', 4, - '%s. Should be: %s.h, c system, c++ system, other.' % - (error_message, fileinfo.BaseName())) - canonical_include = include_state.CanonicalizeAlphabeticalOrder(include) - if not include_state.IsInAlphabeticalOrder( - clean_lines, linenum, canonical_include): - error(filename, linenum, 'build/include_alpha', 4, - 'Include "%s" not in alphabetical order' % include) - include_state.SetLastHeader(canonical_include) - - - -def _GetTextInside(text, start_pattern): - r"""Retrieves all the text between matching open and close parentheses. - - Given a string of lines and a regular expression string, retrieve all the text - following the expression and between opening punctuation symbols like - (, [, or {, and the matching close-punctuation symbol. This properly nested - occurrences of the punctuations, so for the text like - printf(a(), b(c())); - a call to _GetTextInside(text, r'printf\(') will return 'a(), b(c())'. - start_pattern must match string having an open punctuation symbol at the end. - - Args: - text: The lines to extract text. Its comments and strings must be elided. - It can be single line and can span multiple lines. - start_pattern: The regexp string indicating where to start extracting - the text. - Returns: - The extracted text. - None if either the opening string or ending punctuation could not be found. - """ - # TODO(unknown): Audit cpplint.py to see what places could be profitably - # rewritten to use _GetTextInside (and use inferior regexp matching today). - - # Give opening punctuations to get the matching close-punctuations. - matching_punctuation = {'(': ')', '{': '}', '[': ']'} - closing_punctuation = set(matching_punctuation.itervalues()) - - # Find the position to start extracting text. - match = re.search(start_pattern, text, re.M) - if not match: # start_pattern not found in text. - return None - start_position = match.end(0) - - assert start_position > 0, ( - 'start_pattern must ends with an opening punctuation.') - assert text[start_position - 1] in matching_punctuation, ( - 'start_pattern must ends with an opening punctuation.') - # Stack of closing punctuations we expect to have in text after position. - punctuation_stack = [matching_punctuation[text[start_position - 1]]] - position = start_position - while punctuation_stack and position < len(text): - if text[position] == punctuation_stack[-1]: - punctuation_stack.pop() - elif text[position] in closing_punctuation: - # A closing punctuation without matching opening punctuations. - return None - elif text[position] in matching_punctuation: - punctuation_stack.append(matching_punctuation[text[position]]) - position += 1 - if punctuation_stack: - # Opening punctuations left without matching close-punctuations. - return None - # punctuations match. - return text[start_position:position - 1] - - -# Patterns for matching call-by-reference parameters. -# -# Supports nested templates up to 2 levels deep using this messy pattern: -# < (?: < (?: < [^<>]* -# > -# | [^<>] )* -# > -# | [^<>] )* -# > -_RE_PATTERN_IDENT = r'[_a-zA-Z]\w*' # =~ [[:alpha:]][[:alnum:]]* -_RE_PATTERN_TYPE = ( - r'(?:const\s+)?(?:typename\s+|class\s+|struct\s+|union\s+|enum\s+)?' - r'(?:\w|' - r'\s*<(?:<(?:<[^<>]*>|[^<>])*>|[^<>])*>|' - r'::)+') -# A call-by-reference parameter ends with '& identifier'. -_RE_PATTERN_REF_PARAM = re.compile( - r'(' + _RE_PATTERN_TYPE + r'(?:\s*(?:\bconst\b|[*]))*\s*' - r'&\s*' + _RE_PATTERN_IDENT + r')\s*(?:=[^,()]+)?[,)]') -# A call-by-const-reference parameter either ends with 'const& identifier' -# or looks like 'const type& identifier' when 'type' is atomic. -_RE_PATTERN_CONST_REF_PARAM = ( - r'(?:.*\s*\bconst\s*&\s*' + _RE_PATTERN_IDENT + - r'|const\s+' + _RE_PATTERN_TYPE + r'\s*&\s*' + _RE_PATTERN_IDENT + r')') - - -def CheckLanguage(filename, clean_lines, linenum, file_extension, - include_state, nesting_state, error): - """Checks rules from the 'C++ language rules' section of cppguide.html. - - Some of these rules are hard to test (function overloading, using - uint32 inappropriately), but we do the best we can. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - file_extension: The extension (without the dot) of the filename. - include_state: An _IncludeState instance in which the headers are inserted. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - error: The function to call with any errors found. - """ - # If the line is empty or consists of entirely a comment, no need to - # check it. - line = clean_lines.elided[linenum] - if not line: - return - - match = _RE_PATTERN_INCLUDE.search(line) - if match: - CheckIncludeLine(filename, clean_lines, linenum, include_state, error) - return - - # Reset include state across preprocessor directives. This is meant - # to silence warnings for conditional includes. - match = Match(r'^\s*#\s*(if|ifdef|ifndef|elif|else|endif)\b', line) - if match: - include_state.ResetSection(match.group(1)) - - # Make Windows paths like Unix. - fullname = os.path.abspath(filename).replace('\\', '/') - - # Perform other checks now that we are sure that this is not an include line - CheckCasts(filename, clean_lines, linenum, error) - CheckGlobalStatic(filename, clean_lines, linenum, error) - CheckPrintf(filename, clean_lines, linenum, error) - - if file_extension == 'h': - # TODO(unknown): check that 1-arg constructors are explicit. - # How to tell it's a constructor? - # (handled in CheckForNonStandardConstructs for now) - # TODO(unknown): check that classes declare or disable copy/assign - # (level 1 error) - pass - - # Check if people are using the verboten C basic types. The only exception - # we regularly allow is "unsigned short port" for port. - if Search(r'\bshort port\b', line): - if not Search(r'\bunsigned short port\b', line): - error(filename, linenum, 'runtime/int', 4, - 'Use "unsigned short" for ports, not "short"') - else: - match = Search(r'\b(short|long(?! +double)|long long)\b', line) - if match: - error(filename, linenum, 'runtime/int', 4, - 'Use int16/int64/etc, rather than the C type %s' % match.group(1)) - - # Check if some verboten operator overloading is going on - # TODO(unknown): catch out-of-line unary operator&: - # class X {}; - # int operator&(const X& x) { return 42; } // unary operator& - # The trick is it's hard to tell apart from binary operator&: - # class Y { int operator&(const Y& x) { return 23; } }; // binary operator& - if Search(r'\boperator\s*&\s*\(\s*\)', line): - error(filename, linenum, 'runtime/operator', 4, - 'Unary operator& is dangerous. Do not use it.') - - # Check for suspicious usage of "if" like - # } if (a == b) { - if Search(r'\}\s*if\s*\(', line): - error(filename, linenum, 'readability/braces', 4, - 'Did you mean "else if"? If not, start a new line for "if".') - - # Check for potential format string bugs like printf(foo). - # We constrain the pattern not to pick things like DocidForPrintf(foo). - # Not perfect but it can catch printf(foo.c_str()) and printf(foo->c_str()) - # TODO(unknown): Catch the following case. Need to change the calling - # convention of the whole function to process multiple line to handle it. - # printf( - # boy_this_is_a_really_long_variable_that_cannot_fit_on_the_prev_line); - printf_args = _GetTextInside(line, r'(?i)\b(string)?printf\s*\(') - if printf_args: - match = Match(r'([\w.\->()]+)$', printf_args) - if match and match.group(1) != '__VA_ARGS__': - function_name = re.search(r'\b((?:string)?printf)\s*\(', - line, re.I).group(1) - error(filename, linenum, 'runtime/printf', 4, - 'Potential format string bug. Do %s("%%s", %s) instead.' - % (function_name, match.group(1))) - - # Check for potential memset bugs like memset(buf, sizeof(buf), 0). - match = Search(r'memset\s*\(([^,]*),\s*([^,]*),\s*0\s*\)', line) - if match and not Match(r"^''|-?[0-9]+|0x[0-9A-Fa-f]$", match.group(2)): - error(filename, linenum, 'runtime/memset', 4, - 'Did you mean "memset(%s, 0, %s)"?' - % (match.group(1), match.group(2))) - - if Search(r'\busing namespace\b', line): - error(filename, linenum, 'build/namespaces', 5, - 'Do not use namespace using-directives. ' - 'Use using-declarations instead.') - - # Detect variable-length arrays. - match = Match(r'\s*(.+::)?(\w+) [a-z]\w*\[(.+)];', line) - if (match and match.group(2) != 'return' and match.group(2) != 'delete' and - match.group(3).find(']') == -1): - # Split the size using space and arithmetic operators as delimiters. - # If any of the resulting tokens are not compile time constants then - # report the error. - tokens = re.split(r'\s|\+|\-|\*|\/|<<|>>]', match.group(3)) - is_const = True - skip_next = False - for tok in tokens: - if skip_next: - skip_next = False - continue - - if Search(r'sizeof\(.+\)', tok): continue - if Search(r'arraysize\(\w+\)', tok): continue - - tok = tok.lstrip('(') - tok = tok.rstrip(')') - if not tok: continue - if Match(r'\d+', tok): continue - if Match(r'0[xX][0-9a-fA-F]+', tok): continue - if Match(r'k[A-Z0-9]\w*', tok): continue - if Match(r'(.+::)?k[A-Z0-9]\w*', tok): continue - if Match(r'(.+::)?[A-Z][A-Z0-9_]*', tok): continue - # A catch all for tricky sizeof cases, including 'sizeof expression', - # 'sizeof(*type)', 'sizeof(const type)', 'sizeof(struct StructName)' - # requires skipping the next token because we split on ' ' and '*'. - if tok.startswith('sizeof'): - skip_next = True - continue - is_const = False - break - if not is_const: - error(filename, linenum, 'runtime/arrays', 1, - 'Do not use variable-length arrays. Use an appropriately named ' - "('k' followed by CamelCase) compile-time constant for the size.") - - # Check for use of unnamed namespaces in header files. Registration - # macros are typically OK, so we allow use of "namespace {" on lines - # that end with backslashes. - if (file_extension == 'h' - and Search(r'\bnamespace\s*{', line) - and line[-1] != '\\'): - error(filename, linenum, 'build/namespaces', 4, - 'Do not use unnamed namespaces in header files. See ' - 'http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Namespaces' - ' for more information.') - - -def CheckGlobalStatic(filename, clean_lines, linenum, error): - """Check for unsafe global or static objects. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Match two lines at a time to support multiline declarations - if linenum + 1 < clean_lines.NumLines() and not Search(r'[;({]', line): - line += clean_lines.elided[linenum + 1].strip() - - # Check for people declaring static/global STL strings at the top level. - # This is dangerous because the C++ language does not guarantee that - # globals with constructors are initialized before the first access. - match = Match( - r'((?:|static +)(?:|const +))string +([a-zA-Z0-9_:]+)\b(.*)', - line) - - # Remove false positives: - # - String pointers (as opposed to values). - # string *pointer - # const string *pointer - # string const *pointer - # string *const pointer - # - # - Functions and template specializations. - # string Function(... - # string Class::Method(... - # - # - Operators. These are matched separately because operator names - # cross non-word boundaries, and trying to match both operators - # and functions at the same time would decrease accuracy of - # matching identifiers. - # string Class::operator*() - if (match and - not Search(r'\bstring\b(\s+const)?\s*\*\s*(const\s+)?\w', line) and - not Search(r'\boperator\W', line) and - not Match(r'\s*(<.*>)?(::[a-zA-Z0-9_]+)*\s*\(([^"]|$)', match.group(3))): - error(filename, linenum, 'runtime/string', 4, - 'For a static/global string constant, use a C style string instead: ' - '"%schar %s[]".' % - (match.group(1), match.group(2))) - - if Search(r'\b([A-Za-z0-9_]*_)\(\1\)', line): - error(filename, linenum, 'runtime/init', 4, - 'You seem to be initializing a member variable with itself.') - - -def CheckPrintf(filename, clean_lines, linenum, error): - """Check for printf related issues. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # When snprintf is used, the second argument shouldn't be a literal. - match = Search(r'snprintf\s*\(([^,]*),\s*([0-9]*)\s*,', line) - if match and match.group(2) != '0': - # If 2nd arg is zero, snprintf is used to calculate size. - error(filename, linenum, 'runtime/printf', 3, - 'If you can, use sizeof(%s) instead of %s as the 2nd arg ' - 'to snprintf.' % (match.group(1), match.group(2))) - - # Check if some verboten C functions are being used. - if Search(r'\bsprintf\s*\(', line): - error(filename, linenum, 'runtime/printf', 5, - 'Never use sprintf. Use snprintf instead.') - match = Search(r'\b(strcpy|strcat)\s*\(', line) - if match: - error(filename, linenum, 'runtime/printf', 4, - 'Almost always, snprintf is better than %s' % match.group(1)) - - -def IsDerivedFunction(clean_lines, linenum): - """Check if current line contains an inherited function. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - Returns: - True if current line contains a function with "override" - virt-specifier. - """ - # Scan back a few lines for start of current function - for i in xrange(linenum, max(-1, linenum - 10), -1): - match = Match(r'^([^()]*\w+)\(', clean_lines.elided[i]) - if match: - # Look for "override" after the matching closing parenthesis - line, _, closing_paren = CloseExpression( - clean_lines, i, len(match.group(1))) - return (closing_paren >= 0 and - Search(r'\boverride\b', line[closing_paren:])) - return False - - -def IsOutOfLineMethodDefinition(clean_lines, linenum): - """Check if current line contains an out-of-line method definition. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - Returns: - True if current line contains an out-of-line method definition. - """ - # Scan back a few lines for start of current function - for i in xrange(linenum, max(-1, linenum - 10), -1): - if Match(r'^([^()]*\w+)\(', clean_lines.elided[i]): - return Match(r'^[^()]*\w+::\w+\(', clean_lines.elided[i]) is not None - return False - - -def IsInitializerList(clean_lines, linenum): - """Check if current line is inside constructor initializer list. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - Returns: - True if current line appears to be inside constructor initializer - list, False otherwise. - """ - for i in xrange(linenum, 1, -1): - line = clean_lines.elided[i] - if i == linenum: - remove_function_body = Match(r'^(.*)\{\s*$', line) - if remove_function_body: - line = remove_function_body.group(1) - - if Search(r'\s:\s*\w+[({]', line): - # A lone colon tend to indicate the start of a constructor - # initializer list. It could also be a ternary operator, which - # also tend to appear in constructor initializer lists as - # opposed to parameter lists. - return True - if Search(r'\}\s*,\s*$', line): - # A closing brace followed by a comma is probably the end of a - # brace-initialized member in constructor initializer list. - return True - if Search(r'[{};]\s*$', line): - # Found one of the following: - # - A closing brace or semicolon, probably the end of the previous - # function. - # - An opening brace, probably the start of current class or namespace. - # - # Current line is probably not inside an initializer list since - # we saw one of those things without seeing the starting colon. - return False - - # Got to the beginning of the file without seeing the start of - # constructor initializer list. - return False - - -def CheckForNonConstReference(filename, clean_lines, linenum, - nesting_state, error): - """Check for non-const references. - - Separate from CheckLanguage since it scans backwards from current - line, instead of scanning forward. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - error: The function to call with any errors found. - """ - # Do nothing if there is no '&' on current line. - line = clean_lines.elided[linenum] - if '&' not in line: - return - - # If a function is inherited, current function doesn't have much of - # a choice, so any non-const references should not be blamed on - # derived function. - if IsDerivedFunction(clean_lines, linenum): - return - - # Don't warn on out-of-line method definitions, as we would warn on the - # in-line declaration, if it isn't marked with 'override'. - if IsOutOfLineMethodDefinition(clean_lines, linenum): - return - - # Long type names may be broken across multiple lines, usually in one - # of these forms: - # LongType - # ::LongTypeContinued &identifier - # LongType:: - # LongTypeContinued &identifier - # LongType< - # ...>::LongTypeContinued &identifier - # - # If we detected a type split across two lines, join the previous - # line to current line so that we can match const references - # accordingly. - # - # Note that this only scans back one line, since scanning back - # arbitrary number of lines would be expensive. If you have a type - # that spans more than 2 lines, please use a typedef. - if linenum > 1: - previous = None - if Match(r'\s*::(?:[\w<>]|::)+\s*&\s*\S', line): - # previous_line\n + ::current_line - previous = Search(r'\b((?:const\s*)?(?:[\w<>]|::)+[\w<>])\s*$', - clean_lines.elided[linenum - 1]) - elif Match(r'\s*[a-zA-Z_]([\w<>]|::)+\s*&\s*\S', line): - # previous_line::\n + current_line - previous = Search(r'\b((?:const\s*)?(?:[\w<>]|::)+::)\s*$', - clean_lines.elided[linenum - 1]) - if previous: - line = previous.group(1) + line.lstrip() - else: - # Check for templated parameter that is split across multiple lines - endpos = line.rfind('>') - if endpos > -1: - (_, startline, startpos) = ReverseCloseExpression( - clean_lines, linenum, endpos) - if startpos > -1 and startline < linenum: - # Found the matching < on an earlier line, collect all - # pieces up to current line. - line = '' - for i in xrange(startline, linenum + 1): - line += clean_lines.elided[i].strip() - - # Check for non-const references in function parameters. A single '&' may - # found in the following places: - # inside expression: binary & for bitwise AND - # inside expression: unary & for taking the address of something - # inside declarators: reference parameter - # We will exclude the first two cases by checking that we are not inside a - # function body, including one that was just introduced by a trailing '{'. - # TODO(unknown): Doesn't account for 'catch(Exception& e)' [rare]. - if (nesting_state.previous_stack_top and - not (isinstance(nesting_state.previous_stack_top, _ClassInfo) or - isinstance(nesting_state.previous_stack_top, _NamespaceInfo))): - # Not at toplevel, not within a class, and not within a namespace - return - - # Avoid initializer lists. We only need to scan back from the - # current line for something that starts with ':'. - # - # We don't need to check the current line, since the '&' would - # appear inside the second set of parentheses on the current line as - # opposed to the first set. - if linenum > 0: - for i in xrange(linenum - 1, max(0, linenum - 10), -1): - previous_line = clean_lines.elided[i] - if not Search(r'[),]\s*$', previous_line): - break - if Match(r'^\s*:\s+\S', previous_line): - return - - # Avoid preprocessors - if Search(r'\\\s*$', line): - return - - # Avoid constructor initializer lists - if IsInitializerList(clean_lines, linenum): - return - - # We allow non-const references in a few standard places, like functions - # called "swap()" or iostream operators like "<<" or ">>". Do not check - # those function parameters. - # - # We also accept & in static_assert, which looks like a function but - # it's actually a declaration expression. - whitelisted_functions = (r'(?:[sS]wap(?:<\w:+>)?|' - r'operator\s*[<>][<>]|' - r'static_assert|COMPILE_ASSERT' - r')\s*\(') - if Search(whitelisted_functions, line): - return - elif not Search(r'\S+\([^)]*$', line): - # Don't see a whitelisted function on this line. Actually we - # didn't see any function name on this line, so this is likely a - # multi-line parameter list. Try a bit harder to catch this case. - for i in xrange(2): - if (linenum > i and - Search(whitelisted_functions, clean_lines.elided[linenum - i - 1])): - return - - decls = ReplaceAll(r'{[^}]*}', ' ', line) # exclude function body - for parameter in re.findall(_RE_PATTERN_REF_PARAM, decls): - if not Match(_RE_PATTERN_CONST_REF_PARAM, parameter): - error(filename, linenum, 'runtime/references', 2, - 'Is this a non-const reference? ' - 'If so, make const or use a pointer: ' + - ReplaceAll(' *<', '<', parameter)) - - -def CheckCasts(filename, clean_lines, linenum, error): - """Various cast related checks. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Check to see if they're using an conversion function cast. - # I just try to capture the most common basic types, though there are more. - # Parameterless conversion functions, such as bool(), are allowed as they are - # probably a member operator declaration or default constructor. - match = Search( - r'(\bnew\s+|\S<\s*(?:const\s+)?)?\b' - r'(int|float|double|bool|char|int32|uint32|int64|uint64)' - r'(\([^)].*)', line) - expecting_function = ExpectingFunctionArgs(clean_lines, linenum) - if match and not expecting_function: - matched_type = match.group(2) - - # matched_new_or_template is used to silence two false positives: - # - New operators - # - Template arguments with function types - # - # For template arguments, we match on types immediately following - # an opening bracket without any spaces. This is a fast way to - # silence the common case where the function type is the first - # template argument. False negative with less-than comparison is - # avoided because those operators are usually followed by a space. - # - # function // bracket + no space = false positive - # value < double(42) // bracket + space = true positive - matched_new_or_template = match.group(1) - - # Avoid arrays by looking for brackets that come after the closing - # parenthesis. - if Match(r'\([^()]+\)\s*\[', match.group(3)): - return - - # Other things to ignore: - # - Function pointers - # - Casts to pointer types - # - Placement new - # - Alias declarations - matched_funcptr = match.group(3) - if (matched_new_or_template is None and - not (matched_funcptr and - (Match(r'\((?:[^() ]+::\s*\*\s*)?[^() ]+\)\s*\(', - matched_funcptr) or - matched_funcptr.startswith('(*)'))) and - not Match(r'\s*using\s+\S+\s*=\s*' + matched_type, line) and - not Search(r'new\(\S+\)\s*' + matched_type, line)): - error(filename, linenum, 'readability/casting', 4, - 'Using deprecated casting style. ' - 'Use static_cast<%s>(...) instead' % - matched_type) - - if not expecting_function: - CheckCStyleCast(filename, clean_lines, linenum, 'static_cast', - r'\((int|float|double|bool|char|u?int(16|32|64))\)', error) - - # This doesn't catch all cases. Consider (const char * const)"hello". - # - # (char *) "foo" should always be a const_cast (reinterpret_cast won't - # compile). - if CheckCStyleCast(filename, clean_lines, linenum, 'const_cast', - r'\((char\s?\*+\s?)\)\s*"', error): - pass - else: - # Check pointer casts for other than string constants - CheckCStyleCast(filename, clean_lines, linenum, 'reinterpret_cast', - r'\((\w+\s?\*+\s?)\)', error) - - # In addition, we look for people taking the address of a cast. This - # is dangerous -- casts can assign to temporaries, so the pointer doesn't - # point where you think. - # - # Some non-identifier character is required before the '&' for the - # expression to be recognized as a cast. These are casts: - # expression = &static_cast(temporary()); - # function(&(int*)(temporary())); - # - # This is not a cast: - # reference_type&(int* function_param); - match = Search( - r'(?:[^\w]&\(([^)*][^)]*)\)[\w(])|' - r'(?:[^\w]&(static|dynamic|down|reinterpret)_cast\b)', line) - if match: - # Try a better error message when the & is bound to something - # dereferenced by the casted pointer, as opposed to the casted - # pointer itself. - parenthesis_error = False - match = Match(r'^(.*&(?:static|dynamic|down|reinterpret)_cast\b)<', line) - if match: - _, y1, x1 = CloseExpression(clean_lines, linenum, len(match.group(1))) - if x1 >= 0 and clean_lines.elided[y1][x1] == '(': - _, y2, x2 = CloseExpression(clean_lines, y1, x1) - if x2 >= 0: - extended_line = clean_lines.elided[y2][x2:] - if y2 < clean_lines.NumLines() - 1: - extended_line += clean_lines.elided[y2 + 1] - if Match(r'\s*(?:->|\[)', extended_line): - parenthesis_error = True - - if parenthesis_error: - error(filename, linenum, 'readability/casting', 4, - ('Are you taking an address of something dereferenced ' - 'from a cast? Wrapping the dereferenced expression in ' - 'parentheses will make the binding more obvious')) - else: - error(filename, linenum, 'runtime/casting', 4, - ('Are you taking an address of a cast? ' - 'This is dangerous: could be a temp var. ' - 'Take the address before doing the cast, rather than after')) - - -def CheckCStyleCast(filename, clean_lines, linenum, cast_type, pattern, error): - """Checks for a C-style cast by looking for the pattern. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - cast_type: The string for the C++ cast to recommend. This is either - reinterpret_cast, static_cast, or const_cast, depending. - pattern: The regular expression used to find C-style casts. - error: The function to call with any errors found. - - Returns: - True if an error was emitted. - False otherwise. - """ - line = clean_lines.elided[linenum] - match = Search(pattern, line) - if not match: - return False - - # Exclude lines with keywords that tend to look like casts - context = line[0:match.start(1) - 1] - if Match(r'.*\b(?:sizeof|alignof|alignas|[_A-Z][_A-Z0-9]*)\s*$', context): - return False - - # Try expanding current context to see if we one level of - # parentheses inside a macro. - if linenum > 0: - for i in xrange(linenum - 1, max(0, linenum - 5), -1): - context = clean_lines.elided[i] + context - if Match(r'.*\b[_A-Z][_A-Z0-9]*\s*\((?:\([^()]*\)|[^()])*$', context): - return False - - # operator++(int) and operator--(int) - if context.endswith(' operator++') or context.endswith(' operator--'): - return False - - # A single unnamed argument for a function tends to look like old - # style cast. If we see those, don't issue warnings for deprecated - # casts, instead issue warnings for unnamed arguments where - # appropriate. - # - # These are things that we want warnings for, since the style guide - # explicitly require all parameters to be named: - # Function(int); - # Function(int) { - # ConstMember(int) const; - # ConstMember(int) const { - # ExceptionMember(int) throw (...); - # ExceptionMember(int) throw (...) { - # PureVirtual(int) = 0; - # [](int) -> bool { - # - # These are functions of some sort, where the compiler would be fine - # if they had named parameters, but people often omit those - # identifiers to reduce clutter: - # (FunctionPointer)(int); - # (FunctionPointer)(int) = value; - # Function((function_pointer_arg)(int)) - # Function((function_pointer_arg)(int), int param) - # ; - # <(FunctionPointerTemplateArgument)(int)>; - remainder = line[match.end(0):] - if Match(r'^\s*(?:;|const\b|throw\b|final\b|override\b|[=>{),]|->)', - remainder): - # Looks like an unnamed parameter. - - # Don't warn on any kind of template arguments. - if Match(r'^\s*>', remainder): - return False - - # Don't warn on assignments to function pointers, but keep warnings for - # unnamed parameters to pure virtual functions. Note that this pattern - # will also pass on assignments of "0" to function pointers, but the - # preferred values for those would be "nullptr" or "NULL". - matched_zero = Match(r'^\s=\s*(\S+)\s*;', remainder) - if matched_zero and matched_zero.group(1) != '0': - return False - - # Don't warn on function pointer declarations. For this we need - # to check what came before the "(type)" string. - if Match(r'.*\)\s*$', line[0:match.start(0)]): - return False - - # Don't warn if the parameter is named with block comments, e.g.: - # Function(int /*unused_param*/); - raw_line = clean_lines.raw_lines[linenum] - if '/*' in raw_line: - return False - - # Passed all filters, issue warning here. - error(filename, linenum, 'readability/function', 3, - 'All parameters should be named in a function') - return True - - # At this point, all that should be left is actual casts. - error(filename, linenum, 'readability/casting', 4, - 'Using C-style cast. Use %s<%s>(...) instead' % - (cast_type, match.group(1))) - - return True - - -def ExpectingFunctionArgs(clean_lines, linenum): - """Checks whether where function type arguments are expected. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - - Returns: - True if the line at 'linenum' is inside something that expects arguments - of function types. - """ - line = clean_lines.elided[linenum] - return (Match(r'^\s*MOCK_(CONST_)?METHOD\d+(_T)?\(', line) or - (linenum >= 2 and - (Match(r'^\s*MOCK_(?:CONST_)?METHOD\d+(?:_T)?\((?:\S+,)?\s*$', - clean_lines.elided[linenum - 1]) or - Match(r'^\s*MOCK_(?:CONST_)?METHOD\d+(?:_T)?\(\s*$', - clean_lines.elided[linenum - 2]) or - Search(r'\bstd::m?function\s*\<\s*$', - clean_lines.elided[linenum - 1])))) - - -_HEADERS_CONTAINING_TEMPLATES = ( - ('', ('deque',)), - ('', ('unary_function', 'binary_function', - 'plus', 'minus', 'multiplies', 'divides', 'modulus', - 'negate', - 'equal_to', 'not_equal_to', 'greater', 'less', - 'greater_equal', 'less_equal', - 'logical_and', 'logical_or', 'logical_not', - 'unary_negate', 'not1', 'binary_negate', 'not2', - 'bind1st', 'bind2nd', - 'pointer_to_unary_function', - 'pointer_to_binary_function', - 'ptr_fun', - 'mem_fun_t', 'mem_fun', 'mem_fun1_t', 'mem_fun1_ref_t', - 'mem_fun_ref_t', - 'const_mem_fun_t', 'const_mem_fun1_t', - 'const_mem_fun_ref_t', 'const_mem_fun1_ref_t', - 'mem_fun_ref', - )), - ('', ('numeric_limits',)), - ('', ('list',)), - ('', ('map', 'multimap',)), - ('', ('allocator',)), - ('', ('queue', 'priority_queue',)), - ('', ('set', 'multiset',)), - ('', ('stack',)), - ('', ('char_traits', 'basic_string',)), - ('', ('tuple',)), - ('', ('pair',)), - ('', ('vector',)), - - # gcc extensions. - # Note: std::hash is their hash, ::hash is our hash - ('', ('hash_map', 'hash_multimap',)), - ('', ('hash_set', 'hash_multiset',)), - ('', ('slist',)), - ) - -_RE_PATTERN_STRING = re.compile(r'\bstring\b') - -_re_pattern_algorithm_header = [] -for _template in ('copy', 'max', 'min', 'min_element', 'sort', 'swap', - 'transform'): - # Match max(..., ...), max(..., ...), but not foo->max, foo.max or - # type::max(). - _re_pattern_algorithm_header.append( - (re.compile(r'[^>.]\b' + _template + r'(<.*?>)?\([^\)]'), - _template, - '')) - -_re_pattern_templates = [] -for _header, _templates in _HEADERS_CONTAINING_TEMPLATES: - for _template in _templates: - _re_pattern_templates.append( - (re.compile(r'(\<|\b)' + _template + r'\s*\<'), - _template + '<>', - _header)) - - -def FilesBelongToSameModule(filename_cc, filename_h): - """Check if these two filenames belong to the same module. - - The concept of a 'module' here is a as follows: - foo.h, foo-inl.h, foo.cc, foo_test.cc and foo_unittest.cc belong to the - same 'module' if they are in the same directory. - some/path/public/xyzzy and some/path/internal/xyzzy are also considered - to belong to the same module here. - - If the filename_cc contains a longer path than the filename_h, for example, - '/absolute/path/to/base/sysinfo.cc', and this file would include - 'base/sysinfo.h', this function also produces the prefix needed to open the - header. This is used by the caller of this function to more robustly open the - header file. We don't have access to the real include paths in this context, - so we need this guesswork here. - - Known bugs: tools/base/bar.cc and base/bar.h belong to the same module - according to this implementation. Because of this, this function gives - some false positives. This should be sufficiently rare in practice. - - Args: - filename_cc: is the path for the .cc file - filename_h: is the path for the header path - - Returns: - Tuple with a bool and a string: - bool: True if filename_cc and filename_h belong to the same module. - string: the additional prefix needed to open the header file. - """ - - if not filename_cc.endswith('.cc'): - return (False, '') - filename_cc = filename_cc[:-len('.cc')] - if filename_cc.endswith('_unittest'): - filename_cc = filename_cc[:-len('_unittest')] - elif filename_cc.endswith('_test'): - filename_cc = filename_cc[:-len('_test')] - filename_cc = filename_cc.replace('/public/', '/') - filename_cc = filename_cc.replace('/internal/', '/') - - if not filename_h.endswith('.h'): - return (False, '') - filename_h = filename_h[:-len('.h')] - if filename_h.endswith('-inl'): - filename_h = filename_h[:-len('-inl')] - filename_h = filename_h.replace('/public/', '/') - filename_h = filename_h.replace('/internal/', '/') - - files_belong_to_same_module = filename_cc.endswith(filename_h) - common_path = '' - if files_belong_to_same_module: - common_path = filename_cc[:-len(filename_h)] - return files_belong_to_same_module, common_path - - -def UpdateIncludeState(filename, include_dict, io=codecs): - """Fill up the include_dict with new includes found from the file. - - Args: - filename: the name of the header to read. - include_dict: a dictionary in which the headers are inserted. - io: The io factory to use to read the file. Provided for testability. - - Returns: - True if a header was successfully added. False otherwise. - """ - headerfile = None - try: - headerfile = io.open(filename, 'r', 'utf8', 'replace') - except IOError: - return False - linenum = 0 - for line in headerfile: - linenum += 1 - clean_line = CleanseComments(line) - match = _RE_PATTERN_INCLUDE.search(clean_line) - if match: - include = match.group(2) - include_dict.setdefault(include, linenum) - return True - - -def CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error, - io=codecs): - """Reports for missing stl includes. - - This function will output warnings to make sure you are including the headers - necessary for the stl containers and functions that you use. We only give one - reason to include a header. For example, if you use both equal_to<> and - less<> in a .h file, only one (the latter in the file) of these will be - reported as a reason to include the . - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - include_state: An _IncludeState instance. - error: The function to call with any errors found. - io: The IO factory to use to read the header file. Provided for unittest - injection. - """ - required = {} # A map of header name to linenumber and the template entity. - # Example of required: { '': (1219, 'less<>') } - - for linenum in xrange(clean_lines.NumLines()): - line = clean_lines.elided[linenum] - if not line or line[0] == '#': - continue - - # String is special -- it is a non-templatized type in STL. - matched = _RE_PATTERN_STRING.search(line) - if matched: - # Don't warn about strings in non-STL namespaces: - # (We check only the first match per line; good enough.) - prefix = line[:matched.start()] - if prefix.endswith('std::') or not prefix.endswith('::'): - required[''] = (linenum, 'string') - - for pattern, template, header in _re_pattern_algorithm_header: - if pattern.search(line): - required[header] = (linenum, template) - - # The following function is just a speed up, no semantics are changed. - if not '<' in line: # Reduces the cpu time usage by skipping lines. - continue - - for pattern, template, header in _re_pattern_templates: - if pattern.search(line): - required[header] = (linenum, template) - - # The policy is that if you #include something in foo.h you don't need to - # include it again in foo.cc. Here, we will look at possible includes. - # Let's flatten the include_state include_list and copy it into a dictionary. - include_dict = dict([item for sublist in include_state.include_list - for item in sublist]) - - # Did we find the header for this file (if any) and successfully load it? - header_found = False - - # Use the absolute path so that matching works properly. - abs_filename = FileInfo(filename).FullName() - - # For Emacs's flymake. - # If cpplint is invoked from Emacs's flymake, a temporary file is generated - # by flymake and that file name might end with '_flymake.cc'. In that case, - # restore original file name here so that the corresponding header file can be - # found. - # e.g. If the file name is 'foo_flymake.cc', we should search for 'foo.h' - # instead of 'foo_flymake.h' - abs_filename = re.sub(r'_flymake\.cc$', '.cc', abs_filename) - - # include_dict is modified during iteration, so we iterate over a copy of - # the keys. - header_keys = include_dict.keys() - for header in header_keys: - (same_module, common_path) = FilesBelongToSameModule(abs_filename, header) - fullpath = common_path + header - if same_module and UpdateIncludeState(fullpath, include_dict, io): - header_found = True - - # If we can't find the header file for a .cc, assume it's because we don't - # know where to look. In that case we'll give up as we're not sure they - # didn't include it in the .h file. - # TODO(unknown): Do a better job of finding .h files so we are confident that - # not having the .h file means there isn't one. - if filename.endswith('.cc') and not header_found: - return - - # All the lines have been processed, report the errors found. - for required_header_unstripped in required: - template = required[required_header_unstripped][1] - if required_header_unstripped.strip('<>"') not in include_dict: - error(filename, required[required_header_unstripped][0], - 'build/include_what_you_use', 4, - 'Add #include ' + required_header_unstripped + ' for ' + template) - - -_RE_PATTERN_EXPLICIT_MAKEPAIR = re.compile(r'\bmake_pair\s*<') - - -def CheckMakePairUsesDeduction(filename, clean_lines, linenum, error): - """Check that make_pair's template arguments are deduced. - - G++ 4.6 in C++11 mode fails badly if make_pair's template arguments are - specified explicitly, and such use isn't intended in any case. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - match = _RE_PATTERN_EXPLICIT_MAKEPAIR.search(line) - if match: - error(filename, linenum, 'build/explicit_make_pair', - 4, # 4 = high confidence - 'For C++11-compatibility, omit template arguments from make_pair' - ' OR use pair directly OR if appropriate, construct a pair directly') - - -def CheckDefaultLambdaCaptures(filename, clean_lines, linenum, error): - """Check that default lambda captures are not used. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # A lambda introducer specifies a default capture if it starts with "[=" - # or if it starts with "[&" _not_ followed by an identifier. - match = Match(r'^(.*)\[\s*(?:=|&[^\w])', line) - if match: - # Found a potential error, check what comes after the lambda-introducer. - # If it's not open parenthesis (for lambda-declarator) or open brace - # (for compound-statement), it's not a lambda. - line, _, pos = CloseExpression(clean_lines, linenum, len(match.group(1))) - if pos >= 0 and Match(r'^\s*[{(]', line[pos:]): - error(filename, linenum, 'build/c++11', - 4, # 4 = high confidence - 'Default lambda captures are an unapproved C++ feature.') - - -def CheckRedundantVirtual(filename, clean_lines, linenum, error): - """Check if line contains a redundant "virtual" function-specifier. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - # Look for "virtual" on current line. - line = clean_lines.elided[linenum] - virtual = Match(r'^(.*)(\bvirtual\b)(.*)$', line) - if not virtual: return - - # Ignore "virtual" keywords that are near access-specifiers. These - # are only used in class base-specifier and do not apply to member - # functions. - if (Search(r'\b(public|protected|private)\s+$', virtual.group(1)) or - Match(r'^\s+(public|protected|private)\b', virtual.group(3))): - return - - # Ignore the "virtual" keyword from virtual base classes. Usually - # there is a column on the same line in these cases (virtual base - # classes are rare in google3 because multiple inheritance is rare). - if Match(r'^.*[^:]:[^:].*$', line): return - - # Look for the next opening parenthesis. This is the start of the - # parameter list (possibly on the next line shortly after virtual). - # TODO(unknown): doesn't work if there are virtual functions with - # decltype() or other things that use parentheses, but csearch suggests - # that this is rare. - end_col = -1 - end_line = -1 - start_col = len(virtual.group(2)) - for start_line in xrange(linenum, min(linenum + 3, clean_lines.NumLines())): - line = clean_lines.elided[start_line][start_col:] - parameter_list = Match(r'^([^(]*)\(', line) - if parameter_list: - # Match parentheses to find the end of the parameter list - (_, end_line, end_col) = CloseExpression( - clean_lines, start_line, start_col + len(parameter_list.group(1))) - break - start_col = 0 - - if end_col < 0: - return # Couldn't find end of parameter list, give up - - # Look for "override" or "final" after the parameter list - # (possibly on the next few lines). - for i in xrange(end_line, min(end_line + 3, clean_lines.NumLines())): - line = clean_lines.elided[i][end_col:] - match = Search(r'\b(override|final)\b', line) - if match: - error(filename, linenum, 'readability/inheritance', 4, - ('"virtual" is redundant since function is ' - 'already declared as "%s"' % match.group(1))) - - # Set end_col to check whole lines after we are done with the - # first line. - end_col = 0 - if Search(r'[^\w]\s*$', line): - break - - -def CheckRedundantOverrideOrFinal(filename, clean_lines, linenum, error): - """Check if line contains a redundant "override" or "final" virt-specifier. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - # Look for closing parenthesis nearby. We need one to confirm where - # the declarator ends and where the virt-specifier starts to avoid - # false positives. - line = clean_lines.elided[linenum] - declarator_end = line.rfind(')') - if declarator_end >= 0: - fragment = line[declarator_end:] - else: - if linenum > 1 and clean_lines.elided[linenum - 1].rfind(')') >= 0: - fragment = line - else: - return - - # Check that at most one of "override" or "final" is present, not both - if Search(r'\boverride\b', fragment) and Search(r'\bfinal\b', fragment): - error(filename, linenum, 'readability/inheritance', 4, - ('"override" is redundant since function is ' - 'already declared as "final"')) - - - - -# Returns true if we are at a new block, and it is directly -# inside of a namespace. -def IsBlockInNameSpace(nesting_state, is_forward_declaration): - """Checks that the new block is directly in a namespace. - - Args: - nesting_state: The _NestingState object that contains info about our state. - is_forward_declaration: If the class is a forward declared class. - Returns: - Whether or not the new block is directly in a namespace. - """ - if is_forward_declaration: - if len(nesting_state.stack) >= 1 and ( - isinstance(nesting_state.stack[-1], _NamespaceInfo)): - return True - else: - return False - - return (len(nesting_state.stack) > 1 and - nesting_state.stack[-1].check_namespace_indentation and - isinstance(nesting_state.stack[-2], _NamespaceInfo)) - - -def ShouldCheckNamespaceIndentation(nesting_state, is_namespace_indent_item, - raw_lines_no_comments, linenum): - """This method determines if we should apply our namespace indentation check. - - Args: - nesting_state: The current nesting state. - is_namespace_indent_item: If we just put a new class on the stack, True. - If the top of the stack is not a class, or we did not recently - add the class, False. - raw_lines_no_comments: The lines without the comments. - linenum: The current line number we are processing. - - Returns: - True if we should apply our namespace indentation check. Currently, it - only works for classes and namespaces inside of a namespace. - """ - - is_forward_declaration = IsForwardClassDeclaration(raw_lines_no_comments, - linenum) - - if not (is_namespace_indent_item or is_forward_declaration): - return False - - # If we are in a macro, we do not want to check the namespace indentation. - if IsMacroDefinition(raw_lines_no_comments, linenum): - return False - - return IsBlockInNameSpace(nesting_state, is_forward_declaration) - - -# Call this method if the line is directly inside of a namespace. -# If the line above is blank (excluding comments) or the start of -# an inner namespace, it cannot be indented. -def CheckItemIndentationInNamespace(filename, raw_lines_no_comments, linenum, - error): - line = raw_lines_no_comments[linenum] - if Match(r'^\s+', line): - error(filename, linenum, 'runtime/indentation_namespace', 4, - 'Do not indent within a namespace') - - -def ProcessLine(filename, file_extension, clean_lines, line, - include_state, function_state, nesting_state, error, - extra_check_functions=[]): - """Processes a single line in the file. - - Args: - filename: Filename of the file that is being processed. - file_extension: The extension (dot not included) of the file. - clean_lines: An array of strings, each representing a line of the file, - with comments stripped. - line: Number of line being processed. - include_state: An _IncludeState instance in which the headers are inserted. - function_state: A _FunctionState instance which counts function lines, etc. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - error: A callable to which errors are reported, which takes 4 arguments: - filename, line number, error level, and message - extra_check_functions: An array of additional check functions that will be - run on each source line. Each function takes 4 - arguments: filename, clean_lines, line, error - """ - raw_lines = clean_lines.raw_lines - ParseNolintSuppressions(filename, raw_lines[line], line, error) - nesting_state.Update(filename, clean_lines, line, error) - CheckForNamespaceIndentation(filename, nesting_state, clean_lines, line, - error) - if nesting_state.InAsmBlock(): return - CheckForFunctionLengths(filename, clean_lines, line, function_state, error) - CheckForMultilineCommentsAndStrings(filename, clean_lines, line, error) - CheckStyle(filename, clean_lines, line, file_extension, nesting_state, error) - CheckLanguage(filename, clean_lines, line, file_extension, include_state, - nesting_state, error) - CheckForNonConstReference(filename, clean_lines, line, nesting_state, error) - CheckForNonStandardConstructs(filename, clean_lines, line, - nesting_state, error) - CheckVlogArguments(filename, clean_lines, line, error) - CheckPosixThreading(filename, clean_lines, line, error) - CheckInvalidIncrement(filename, clean_lines, line, error) - CheckMakePairUsesDeduction(filename, clean_lines, line, error) - CheckDefaultLambdaCaptures(filename, clean_lines, line, error) - CheckRedundantVirtual(filename, clean_lines, line, error) - CheckRedundantOverrideOrFinal(filename, clean_lines, line, error) - for check_fn in extra_check_functions: - check_fn(filename, clean_lines, line, error) - -def FlagCxx11Features(filename, clean_lines, linenum, error): - """Flag those c++11 features that we only allow in certain places. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Flag unapproved C++11 headers. - include = Match(r'\s*#\s*include\s+[<"]([^<"]+)[">]', line) - if include and include.group(1) in ('cfenv', - 'condition_variable', - 'fenv.h', - 'future', - 'mutex', - 'thread', - 'chrono', - 'ratio', - 'regex', - 'system_error', - ): - error(filename, linenum, 'build/c++11', 5, - ('<%s> is an unapproved C++11 header.') % include.group(1)) - - # The only place where we need to worry about C++11 keywords and library - # features in preprocessor directives is in macro definitions. - if Match(r'\s*#', line) and not Match(r'\s*#\s*define\b', line): return - - # These are classes and free functions. The classes are always - # mentioned as std::*, but we only catch the free functions if - # they're not found by ADL. They're alphabetical by header. - for top_name in ( - # type_traits - 'alignment_of', - 'aligned_union', - ): - if Search(r'\bstd::%s\b' % top_name, line): - error(filename, linenum, 'build/c++11', 5, - ('std::%s is an unapproved C++11 class or function. Send c-style ' - 'an example of where it would make your code more readable, and ' - 'they may let you use it.') % top_name) - - -def ProcessFileData(filename, file_extension, lines, error, - extra_check_functions=[]): - """Performs lint checks and reports any errors to the given error function. - - Args: - filename: Filename of the file that is being processed. - file_extension: The extension (dot not included) of the file. - lines: An array of strings, each representing a line of the file, with the - last element being empty if the file is terminated with a newline. - error: A callable to which errors are reported, which takes 4 arguments: - filename, line number, error level, and message - extra_check_functions: An array of additional check functions that will be - run on each source line. Each function takes 4 - arguments: filename, clean_lines, line, error - """ - lines = (['// marker so line numbers and indices both start at 1'] + lines + - ['// marker so line numbers end in a known way']) - - include_state = _IncludeState() - function_state = _FunctionState() - nesting_state = NestingState() - - ResetNolintSuppressions() - - CheckForCopyright(filename, lines, error) - - RemoveMultiLineComments(filename, lines, error) - clean_lines = CleansedLines(lines) - - if file_extension == 'h': - CheckForHeaderGuard(filename, clean_lines, error) - - for line in xrange(clean_lines.NumLines()): - ProcessLine(filename, file_extension, clean_lines, line, - include_state, function_state, nesting_state, error, - extra_check_functions) - FlagCxx11Features(filename, clean_lines, line, error) - nesting_state.CheckCompletedBlocks(filename, error) - - CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error) - - # Check that the .cc file has included its header if it exists. - if file_extension == 'cc': - CheckHeaderFileIncluded(filename, include_state, error) - - # We check here rather than inside ProcessLine so that we see raw - # lines rather than "cleaned" lines. - CheckForBadCharacters(filename, lines, error) - - CheckForNewlineAtEOF(filename, lines, error) - -def ProcessConfigOverrides(filename): - """ Loads the configuration files and processes the config overrides. - - Args: - filename: The name of the file being processed by the linter. - - Returns: - False if the current |filename| should not be processed further. - """ - - abs_filename = os.path.abspath(filename) - cfg_filters = [] - keep_looking = True - while keep_looking: - abs_path, base_name = os.path.split(abs_filename) - if not base_name: - break # Reached the root directory. - - cfg_file = os.path.join(abs_path, "CPPLINT.cfg") - abs_filename = abs_path - if not os.path.isfile(cfg_file): - continue - - try: - with open(cfg_file) as file_handle: - for line in file_handle: - line, _, _ = line.partition('#') # Remove comments. - if not line.strip(): - continue - - name, _, val = line.partition('=') - name = name.strip() - val = val.strip() - if name == 'set noparent': - keep_looking = False - elif name == 'filter': - cfg_filters.append(val) - elif name == 'exclude_files': - # When matching exclude_files pattern, use the base_name of - # the current file name or the directory name we are processing. - # For example, if we are checking for lint errors in /foo/bar/baz.cc - # and we found the .cfg file at /foo/CPPLINT.cfg, then the config - # file's "exclude_files" filter is meant to be checked against "bar" - # and not "baz" nor "bar/baz.cc". - if base_name: - pattern = re.compile(val) - if pattern.match(base_name): - sys.stderr.write('Ignoring "%s": file excluded by "%s". ' - 'File path component "%s" matches ' - 'pattern "%s"\n' % - (filename, cfg_file, base_name, val)) - return False - elif name == 'linelength': - global _line_length - try: - _line_length = int(val) - except ValueError: - sys.stderr.write('Line length must be numeric.') - else: - sys.stderr.write( - 'Invalid configuration option (%s) in file %s\n' % - (name, cfg_file)) - - except IOError: - sys.stderr.write( - "Skipping config file '%s': Can't open for reading\n" % cfg_file) - keep_looking = False - - # Apply all the accumulated filters in reverse order (top-level directory - # config options having the least priority). - for filter in reversed(cfg_filters): - _AddFilters(filter) - - return True - - -def ProcessFile(filename, vlevel, extra_check_functions=[]): - """Does google-lint on a single file. - - Args: - filename: The name of the file to parse. - - vlevel: The level of errors to report. Every error of confidence - >= verbose_level will be reported. 0 is a good default. - - extra_check_functions: An array of additional check functions that will be - run on each source line. Each function takes 4 - arguments: filename, clean_lines, line, error - """ - - _SetVerboseLevel(vlevel) - _BackupFilters() - - if not ProcessConfigOverrides(filename): - _RestoreFilters() - return - - lf_lines = [] - crlf_lines = [] - try: - # Support the UNIX convention of using "-" for stdin. Note that - # we are not opening the file with universal newline support - # (which codecs doesn't support anyway), so the resulting lines do - # contain trailing '\r' characters if we are reading a file that - # has CRLF endings. - # If after the split a trailing '\r' is present, it is removed - # below. - if filename == '-': - lines = codecs.StreamReaderWriter(sys.stdin, - codecs.getreader('utf8'), - codecs.getwriter('utf8'), - 'replace').read().split('\n') - else: - lines = codecs.open(filename, 'r', 'utf8', 'replace').read().split('\n') - - # Remove trailing '\r'. - # The -1 accounts for the extra trailing blank line we get from split() - for linenum in range(len(lines) - 1): - if lines[linenum].endswith('\r'): - lines[linenum] = lines[linenum].rstrip('\r') - crlf_lines.append(linenum + 1) - else: - lf_lines.append(linenum + 1) - - except IOError: - sys.stderr.write( - "Skipping input '%s': Can't open for reading\n" % filename) - _RestoreFilters() - return - - # Note, if no dot is found, this will give the entire filename as the ext. - file_extension = filename[filename.rfind('.') + 1:] - - # When reading from stdin, the extension is unknown, so no cpplint tests - # should rely on the extension. - if filename != '-' and file_extension not in _valid_extensions: - sys.stderr.write('Ignoring %s; not a valid file name ' - '(%s)\n' % (filename, ', '.join(_valid_extensions))) - else: - ProcessFileData(filename, file_extension, lines, Error, - extra_check_functions) - - # If end-of-line sequences are a mix of LF and CR-LF, issue - # warnings on the lines with CR. - # - # Don't issue any warnings if all lines are uniformly LF or CR-LF, - # since critique can handle these just fine, and the style guide - # doesn't dictate a particular end of line sequence. - # - # We can't depend on os.linesep to determine what the desired - # end-of-line sequence should be, since that will return the - # server-side end-of-line sequence. - if lf_lines and crlf_lines: - # Warn on every line with CR. An alternative approach might be to - # check whether the file is mostly CRLF or just LF, and warn on the - # minority, we bias toward LF here since most tools prefer LF. - for linenum in crlf_lines: - Error(filename, linenum, 'whitespace/newline', 1, - 'Unexpected \\r (^M) found; better to use only \\n') - - sys.stderr.write('Done processing %s\n' % filename) - _RestoreFilters() - - -def PrintUsage(message): - """Prints a brief usage string and exits, optionally with an error message. - - Args: - message: The optional error message. - """ - sys.stderr.write(_USAGE) - if message: - sys.exit('\nFATAL ERROR: ' + message) - else: - sys.exit(1) - - -def PrintCategories(): - """Prints a list of all the error-categories used by error messages. - - These are the categories used to filter messages via --filter. - """ - sys.stderr.write(''.join(' %s\n' % cat for cat in _ERROR_CATEGORIES)) - sys.exit(0) - - -def ParseArguments(args): - """Parses the command line arguments. - - This may set the output format and verbosity level as side-effects. - - Args: - args: The command line arguments: - - Returns: - The list of filenames to lint. - """ - try: - (opts, filenames) = getopt.getopt(args, '', ['help', 'output=', 'verbose=', - 'counting=', - 'filter=', - 'root=', - 'linelength=', - 'extensions=']) - except getopt.GetoptError: - PrintUsage('Invalid arguments.') - - verbosity = _VerboseLevel() - output_format = _OutputFormat() - filters = '' - counting_style = '' - - for (opt, val) in opts: - if opt == '--help': - PrintUsage(None) - elif opt == '--output': - if val not in ('emacs', 'vs7', 'eclipse'): - PrintUsage('The only allowed output formats are emacs, vs7 and eclipse.') - output_format = val - elif opt == '--verbose': - verbosity = int(val) - elif opt == '--filter': - filters = val - if not filters: - PrintCategories() - elif opt == '--counting': - if val not in ('total', 'toplevel', 'detailed'): - PrintUsage('Valid counting options are total, toplevel, and detailed') - counting_style = val - elif opt == '--root': - global _root - _root = val - elif opt == '--linelength': - global _line_length - try: - _line_length = int(val) - except ValueError: - PrintUsage('Line length must be digits.') - elif opt == '--extensions': - global _valid_extensions - try: - _valid_extensions = set(val.split(',')) - except ValueError: - PrintUsage('Extensions must be comma seperated list.') - - if not filenames: - PrintUsage('No files were specified.') - - _SetOutputFormat(output_format) - _SetVerboseLevel(verbosity) - _SetFilters(filters) - _SetCountingStyle(counting_style) - - return filenames - - -def main(): - filenames = ParseArguments(sys.argv[1:]) - - # Change stderr to write with replacement characters so we don't die - # if we try to print something containing non-ASCII characters. - sys.stderr = codecs.StreamReaderWriter(sys.stderr, - codecs.getreader('utf8'), - codecs.getwriter('utf8'), - 'replace') - - _cpplint_state.ResetErrorCounts() - for filename in filenames: - ProcessFile(filename, _cpplint_state.verbose_level) - _cpplint_state.PrintErrorCounts() - - sys.exit(_cpplint_state.error_count > 0) - - -if __name__ == '__main__': - main() From aabd793563e31cb171f0655c8a06ad11b28c437d Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 2 Feb 2016 07:03:24 -0500 Subject: [PATCH 103/212] install cpplint and run make ci on Travis --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2ea69873..a3516d84 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,14 @@ language: cpp script: - ./autogen.sh && ./configure --enable-coverage - - make test - - make valgrind + - make ci install: - gem install fpm - gem install package_cloud before_script: +- curl https://raw.githubusercontent.com/google/styleguide/gh-pages/cpplint/cpplint.py -o cpplint +- chmod +x cpplint +- export PATH=$PATH:`pwd` - ./utils/build_gtest.sh - gem install coveralls-lcov after_success: From 0d840bdc9d9f4a2e248fe03e5e87a8865ea96c13 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 2 Feb 2016 07:09:21 -0500 Subject: [PATCH 104/212] fix some typos in the README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5f5c7857..5d7bde8b 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ RestClient::response.headers // HTTP response headers The connection object also provides a simple way to get some diagnostics and metrics information via `conn->GetInfo()`. The result is a -`RestClient::ConnectionInfo` struct and looks like this: +`RestClient::Connection::Info` struct and looks like this: ```cpp typedef struct { @@ -135,7 +135,7 @@ typedef struct { #### Persistent connections/Keep-Alive The connection object stores the curl easy handle in an instance variable and -uses that for lifetime of the object. This means curl will [automatically +uses that for the lifetime of the object. This means curl will [automatically reuse connections][curl_keepalive] made with that handle. From 6c7b5483affa03ddd5a0fae5a76d38635b393166 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 2 Feb 2016 07:18:01 -0500 Subject: [PATCH 105/212] make valgrind blocking on CI this fixes #37 --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 9f65e1d7..67c699ce 100644 --- a/Makefile.am +++ b/Makefile.am @@ -25,7 +25,7 @@ test: check ./test-program valgrind: check - valgrind --leak-check=full --error-exitcode=0 ./test-program + valgrind --leak-check=full --error-exitcode=1 ./test-program lint: cpplint --filter=-legal/copyright include/restclient-cpp/*.h source/*.cc From d2cd8efe446ab814dd75d141dbede667d32a704c Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 2 Feb 2016 07:19:51 -0500 Subject: [PATCH 106/212] fix type name for RestClient::Response in README --- README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 5d7bde8b..2afa63a2 100644 --- a/README.md +++ b/README.md @@ -23,19 +23,19 @@ verbs: ```cpp #include "restclient-cpp/restclient.h" -RestClient::response r = RestClient::get("http://url.com") -RestClient::response r = RestClient::post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}") -RestClient::response r = RestClient::put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}") -RestClient::response r = RestClient::del("http://url.com/delete") +RestClient::Response r = RestClient::get("http://url.com") +RestClient::Response r = RestClient::post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}") +RestClient::Response r = RestClient::put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}") +RestClient::Response r = RestClient::del("http://url.com/delete") ``` -The response is of type [RestClient::response][restclient_response] and has +The response is of type [RestClient::Response][restclient_response] and has three attributes: ```cpp -RestClient::response.code // HTTP response code -RestClient::response.body // HTTP response body -RestClient::response.headers // HTTP response headers +RestClient::Response.code // HTTP response code +RestClient::Response.body // HTTP response body +RestClient::Response.headers // HTTP response headers ``` ### Advanced Usage @@ -72,10 +72,10 @@ conn->SetHeaders(headers) // append additional headers conn->AppendHeader("X-MY-HEADER", "foo") -RestClient::response r = conn->get("/get") -RestClient::response r = conn->post("/post", "text/json", "{\"foo\": \"bla\"}") -RestClient::response r = conn->put("/put", "text/json", "{\"foo\": \"bla\"}") -RestClient::response r = conn->del("/delete") +RestClient::Response r = conn->get("/get") +RestClient::Response r = conn->post("/post", "text/json", "{\"foo\": \"bla\"}") +RestClient::Response r = conn->put("/put", "text/json", "{\"foo\": \"bla\"}") +RestClient::Response r = conn->del("/delete") // deinit RestClient. After calling this you have to call RestClient::init() // again before you can use it @@ -86,9 +86,9 @@ The responses are again of type [RestClient::response][restclient_response] and have three attributes: ```cpp -RestClient::response.code // HTTP response code -RestClient::response.body // HTTP response body -RestClient::response.headers // HTTP response headers +RestClient::Response.code // HTTP response code +RestClient::Response.body // HTTP response body +RestClient::Response.headers // HTTP response headers ``` The connection object also provides a simple way to get some diagnostics and From 16120c81f92803a23a28f9ff2783ac7d1db32091 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 2 Feb 2016 07:29:13 -0500 Subject: [PATCH 107/212] correct URL to RestClient::Response docs --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2afa63a2..99c84fd2 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ RestClient::Response r = conn->del("/delete") RestClient::disable(); ``` -The responses are again of type [RestClient::response][restclient_response] +The responses are again of type [RestClient::Response][restclient_response] and have three attributes: ```cpp @@ -182,4 +182,4 @@ merged as fast as possible. [contributing]: https://github.com/mrtazz/restclient-cpp/blob/master/CONTRIBUTING.md [curl_keepalive]: http://curl.haxx.se/docs/faq.html#What_about_Keep_Alive_or_persist [curl_threadsafety]: http://curl.haxx.se/libcurl/c/threadsafe.html -[restclient_response]: http://code.mrtazz.com/restclient-cpp/ref/struct_rest_client_1_1response.html +[restclient_response]: http://code.mrtazz.com/restclient-cpp/ref/struct_rest_client_1_1_response.html From 2b54768632a1894e701bfebf011377be6ec64e0f Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 2 Feb 2016 07:33:23 -0500 Subject: [PATCH 108/212] update CHANGELOG and bump to v0.4.0 this closes #38 --- CHANGELOG.md | 20 +++++++++++++++++++- Makefile.am | 2 +- configure.ac | 2 +- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 564a0c00..488e2246 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,24 @@ # Changelog -## v0.4.0 (???) +## v0.4.0 (2nd February 2016) + +### Features +**This is a major backwards-incompatible API refactor please read carefully** + +- split out into a simple and an advanced API + - simple API via static methods + - advanced usage via a connection object +- support for custom user agent strings +- support for connection pooling and keep-alive +- support for following redirects +- support for getting request metrics from the Connection object + +### Improvements and fixes +- increased test coverage +- addition of valgrind and lint runs on CI +- fixed some memory leaks +- improved documentation coverage + ## v0.3.0 (10th January 2016) diff --git a/Makefile.am b/Makefile.am index 67c699ce..d8af8a95 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,7 +12,7 @@ test_program_CPPFLAGS=-Iinclude -Ivendor/gtest-1.7.0/include -Ivendor/jsoncpp-0. lib_LTLIBRARIES=librestclient-cpp.la librestclient_cpp_la_SOURCES=source/restclient.cc source/connection.cc source/helpers.cc librestclient_cpp_la_CXXFLAGS=-fPIC -librestclient_cpp_la_LDFLAGS=-version-info 1:0:1 +librestclient_cpp_la_LDFLAGS=-version-info 2:1:1 dist_doc_DATA = README.md diff --git a/configure.ac b/configure.ac index 7382168f..88b6b719 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ([2.52]) -AC_INIT([restclient-cpp], [0.3.0], [d@unwiredcouch.com]) +AC_INIT([restclient-cpp], [0.4.0], [d@unwiredcouch.com]) AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT AC_CONFIG_HEADERS([config.h]) From 4599ecc2962e0bf7728f733b85ff87363f826ab3 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 2 Feb 2016 07:44:51 -0500 Subject: [PATCH 109/212] include new header files in package build --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index d8af8a95..5d0a9e7a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,7 @@ ACLOCAL_AMFLAGS=-I m4 CPPFLAGS=-Iinclude check_PROGRAMS = test-program -pkginclude_HEADERS = include/restclient-cpp/restclient.h include/restclient-cpp/version.h +pkginclude_HEADERS = include/restclient-cpp/restclient.h include/restclient-cpp/version.h include/restclient-cpp/connection.h include/restclient-cpp/helpers.h BUILT_SOURCES = include/restclient-cpp/version.h test_program_SOURCES = vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp test/tests.cpp test/test_restclient.cc test/test_connection.cc From 9268b553aaf105f4cde2049e1892b3a451c35dbe Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 2 Feb 2016 07:45:50 -0500 Subject: [PATCH 110/212] bump to 0.4.1 --- CHANGELOG.md | 3 +++ configure.ac | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 488e2246..4f503170 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## v0.4.1 (2nd February 2016) +- fix package build to include new header files from refactoring + ## v0.4.0 (2nd February 2016) ### Features diff --git a/configure.ac b/configure.ac index 88b6b719..a901562e 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ([2.52]) -AC_INIT([restclient-cpp], [0.4.0], [d@unwiredcouch.com]) +AC_INIT([restclient-cpp], [0.4.1], [d@unwiredcouch.com]) AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT AC_CONFIG_HEADERS([config.h]) From 0d6e64d097858b18538f6c96b97460d4dd7f7540 Mon Sep 17 00:00:00 2001 From: Marc Zych Date: Tue, 19 Apr 2016 15:02:27 -0700 Subject: [PATCH 111/212] Connection: Initialize timeout and followRedirects (#46) This fixes the following Valgrind failure: ``` ==6158== Conditional jump or move depends on uninitialised value(s) ==6158== at 0x4738F2: RestClient::Connection::performCurlRequest(std::string const&) (REDACTED) ==6158== by 0x473D10: RestClient::Connection::get(std::string const&) (REDACTED) ==6158== by 0x472779: RestClient::get(std::string const&) (REDACTED) ==6158== by 0x40E59F: RestClientCpp_Http_Test::TestBody() (REDACTED) ==6158== by 0x447798: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) (REDACTED) ==6158== by 0x43A2CE: testing::Test::Run() (REDACTED) ==6158== by 0x43A38C: testing::TestInfo::Run() (REDACTED) ==6158== by 0x43A4A4: testing::TestCase::Run() (REDACTED) ==6158== by 0x43A757: testing::internal::UnitTestImpl::RunAllTests() (REDACTED) ==6158== by 0x43A9F8: testing::UnitTest::Run() (REDACTED) ==6158== by 0x40C99F: main (REDACTED) ==6158== { Memcheck:Cond fun:_ZN10RestClient10Connection18performCurlRequestERKSs fun:_ZN10RestClient10Connection3getERKSs fun:_ZN10RestClient3getERKSs fun:_ZN23RestClientCpp_Http_Test8TestBodyEv fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8UnitTest3RunEv fun:main } ``` --- source/connection.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/connection.cc b/source/connection.cc index 25163a6d..7c4a5c91 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -31,6 +31,8 @@ RestClient::Connection::Connection(const std::string baseUrl) throw std::runtime_error("Couldn't initialize curl handle"); } this->baseUrl = baseUrl; + this->timeout = 0; + this->followRedirects = false; } RestClient::Connection::~Connection() { From 64867ca2e388794bf982af0228910043bbc3d1eb Mon Sep 17 00:00:00 2001 From: Marc Zych Date: Tue, 19 Apr 2016 15:05:46 -0700 Subject: [PATCH 112/212] README: Update Advanced Example (#45) This fixes 2 problems that I encountered with the example: 1. You need to include `connection.h`. 1. You need a pointer type to handle the `new RestClient...`. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 99c84fd2..bffc4261 100644 --- a/README.md +++ b/README.md @@ -43,13 +43,14 @@ However if you want more sophisticated features like connection reuse, timeouts or authentication, there is also a different, more configurable way. ```cpp +#include "restclient-cpp/connection.h" #include "restclient-cpp/restclient.h" // initialize RestClient RestClient::init(); // get a connection object -RestClient::Connection conn = new RestClient::Connection("http://url.com"); +RestClient::Connection conn* = new RestClient::Connection("http://url.com"); // configure basic auth conn->SetBasicAuth("WarMachine68", "WARMACHINEROX"); From f4521498c630f68ca4c05eb3d4465dde12cc2b14 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 19 Apr 2016 22:05:27 -0400 Subject: [PATCH 113/212] add clang to the travis build matrix (#43) --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index a3516d84..aa45f5c8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,7 @@ language: cpp +compiler: + - gcc + - clang script: - ./autogen.sh && ./configure --enable-coverage - make ci From 5c65335ea78e31996d08b6e3c3aca42db6b335c4 Mon Sep 17 00:00:00 2001 From: tgoetze Date: Wed, 20 Apr 2016 09:35:14 -0700 Subject: [PATCH 114/212] Add option to set the Certificate Authority (CA) Info option. (#44) * Add option to set the Certificate Authority (CA) Info option. This is used when verifying a peer. See CURLOPT_CAINFO. --- README.md | 5 ++++- include/restclient-cpp/connection.h | 5 +++++ source/connection.cc | 17 +++++++++++++++++ test/test_connection.cc | 10 ++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bffc4261..df054d69 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ timeouts or authentication, there is also a different, more configurable way. RestClient::init(); // get a connection object -RestClient::Connection conn* = new RestClient::Connection("http://url.com"); +RestClient::Connection* conn = new RestClient::Connection("http://url.com"); // configure basic auth conn->SetBasicAuth("WarMachine68", "WARMACHINEROX"); @@ -73,6 +73,9 @@ conn->SetHeaders(headers) // append additional headers conn->AppendHeader("X-MY-HEADER", "foo") +// if using a non-standard Certificate Authority (CA) trust file +conn->SetCAInfoFilePath("/etc/custom-ca.crt") + RestClient::Response r = conn->get("/get") RestClient::Response r = conn->post("/post", "text/json", "{\"foo\": \"bla\"}") RestClient::Response r = conn->put("/put", "text/json", "{\"foo\": \"bla\"}") diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index bf628b22..e8a471e0 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -122,6 +122,10 @@ class Connection { // (this will result in the UA "foo/cool restclient-cpp/VERSION") void SetUserAgent(const std::string& userAgent); + // set the Certificate Authority (CA) Info which is the path to file holding + // certificates to be used to verify peers. See CURLOPT_CAINFO + void SetCAInfoFilePath(const std::string& caInfoFilePath); + std::string GetUserAgent(); RestClient::Connection::Info GetInfo(); @@ -156,6 +160,7 @@ class Connection { std::string password; } basicAuth; std::string customUserAgent; + std::string caInfoFilePath; RequestInfo lastRequest; RestClient::Response performCurlRequest(const std::string& uri); }; diff --git a/source/connection.cc b/source/connection.cc index 7c4a5c91..3cef27f9 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -119,6 +119,18 @@ RestClient::Connection::SetUserAgent(const std::string& userAgent) { this->customUserAgent = userAgent; } +/** + * @brief set custom Certificate Authority (CA) path + * + * @param caInfoFilePath - The path to a file holding the certificates used to + * verify the peer with. See CURLOPT_CAINFO + * + */ +void +RestClient::Connection::SetCAInfoFilePath(const std::string& caInfoFilePath) { + this->caInfoFilePath = caInfoFilePath; +} + /** * @brief get the user agent to add to the request * @@ -225,6 +237,11 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { if (this->followRedirects == true) { curl_easy_setopt(this->curlHandle, CURLOPT_FOLLOWLOCATION, 1L); } + // if provided, supply CA path + if (!this->caInfoFilePath.empty()) { + curl_easy_setopt(this->curlHandle, CURLOPT_CAINFO, + this->caInfoFilePath.c_str()); + } res = curl_easy_perform(this->curlHandle); if (res != CURLE_OK) { if (res == CURLE_OPERATION_TIMEDOUT) { diff --git a/test/test_connection.cc b/test/test_connection.cc index 332e6868..b71e497a 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -39,6 +39,16 @@ TEST_F(ConnectionTest, TestTimeout) EXPECT_EQ(28, res.code); } +TEST_F(ConnectionTest, TestFailForInvalidCA) +{ + // set a non-existing file for the CA file and it should fail to verify the peer + conn->SetCAInfoFilePath("non-existent file"); + RestClient::Response res = conn->get("/get"); + + EXPECT_EQ("Failed to query.", res.body); + EXPECT_EQ(-1, res.code); +} + TEST_F(ConnectionTest, TestDefaultUserAgent) { RestClient::Response res = conn->get("/get"); From de37323fd52c60b23c305ed123be9a9fc77ae265 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 13 May 2016 22:19:50 -0400 Subject: [PATCH 115/212] add an ldconfig script to package builds this allows for packages to update the linker config when restclient-cpp gets installed or uninstalled via packages. fixes #48 --- Makefile.packaging.mk | 1 + utils/runldconfig.sh | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 utils/runldconfig.sh diff --git a/Makefile.packaging.mk b/Makefile.packaging.mk index 268b4017..ae5f18e7 100644 --- a/Makefile.packaging.mk +++ b/Makefile.packaging.mk @@ -12,6 +12,7 @@ PROJECT_URL="https://github.com/mrtazz/$(NAME)" FPM_FLAGS= --name $(NAME) --version $(VERSION) --iteration $(PKG_RELEASE) \ --epoch 1 --license MIT --maintainer "$(BUILDER)" --url $(PROJECT_URL) \ --vendor mrtazz --description "C++ client for making HTTP/REST requests" \ + --after-install utils/runldconfig.sh --after-remove utils/runldconfig.sh \ --depends curl usr rpm: diff --git a/utils/runldconfig.sh b/utils/runldconfig.sh new file mode 100644 index 00000000..4be8c583 --- /dev/null +++ b/utils/runldconfig.sh @@ -0,0 +1,2 @@ +#!/bin/sh +/sbin/ldconfig From 3244a01c5a2bc0d2b77f1d5b6091d8280a672dec Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 13 May 2016 22:46:53 -0400 Subject: [PATCH 116/212] release v0.4.2 --- CHANGELOG.md | 7 +++++++ configure.ac | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f503170..40d61f23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## v0.4.2 (13th May 2016) +- add an ldconfig script to package builds (Daniel Schauenberg) +- Add option to set the Certificate Authority (CA) Info option. (tgoetze) +- add clang to the travis build matrix (Daniel Schauenberg) +- README: Update Advanced Example (Marc Zych) +- Connection: Initialize timeout and followRedirects (Marc Zych) + ## v0.4.1 (2nd February 2016) - fix package build to include new header files from refactoring diff --git a/configure.ac b/configure.ac index a901562e..a8ba5362 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ([2.52]) -AC_INIT([restclient-cpp], [0.4.1], [d@unwiredcouch.com]) +AC_INIT([restclient-cpp], [0.4.2], [d@unwiredcouch.com]) AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT AC_CONFIG_HEADERS([config.h]) From c8e025b1d253071fad9830da5e6d4e45a45c5640 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 13 May 2016 22:50:56 -0400 Subject: [PATCH 117/212] only release packages from gcc builds --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index aa45f5c8..79278687 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,6 +35,7 @@ deploy: script: ./autogen.sh && ./configure --prefix=`pwd`/usr && make deploy-packages on: tags: true + condition: $CXX = g++ env: global: - secure: i+h0SxjrHCfvoaXCJ1b+tK0vvNgoLq7Xl/eh34tb3QokacWO+piyLcbSxvz0IcE50ye0x8CyMn2hyyGCgzwHDgaUCmkILS+3y+9E7FC4nYwLvi2mJ2Q9DI1Q5aXhcMXiEYb9b1LjrorUdgs6DcfJVq7ZSU3CawKU/uBtKfC39iQ= From e6dc27a4c9519c5dba29ae03a17566e5a4e73219 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 13 May 2016 22:55:40 -0400 Subject: [PATCH 118/212] bump to 0.4.4 --- CHANGELOG.md | 6 ++++++ configure.ac | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40d61f23..96954f94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## v0.4.4 (13th May 2016) +- bump version because v0.4.3 was mistagged + +## v0.4.3 (13th May 2016) +- only release packages from gcc builds (Daniel Schauenberg) + ## v0.4.2 (13th May 2016) - add an ldconfig script to package builds (Daniel Schauenberg) - Add option to set the Certificate Authority (CA) Info option. (tgoetze) diff --git a/configure.ac b/configure.ac index a8ba5362..804daf36 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ([2.52]) -AC_INIT([restclient-cpp], [0.4.2], [d@unwiredcouch.com]) +AC_INIT([restclient-cpp], [0.4.4], [d@unwiredcouch.com]) AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT AC_CONFIG_HEADERS([config.h]) From 97457338210e88dfa044655841d4426b4660a9f4 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 13 May 2016 23:08:52 -0400 Subject: [PATCH 119/212] add OSX install instructions to README --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index df054d69..bb5ee04c 100644 --- a/README.md +++ b/README.md @@ -165,6 +165,13 @@ thread-safe**. ## Installation There are some packages available for Linux on [packagecloud][packagecloud]. +And for OSX you can get it from the mrtazz/oss homebrew tap: + +```bash +brew tap mrtazz/oss +brew install restclient-cpp +``` + Otherwise you can do the regular autotools dance: ```bash From ad96b123cf9d7f321897569e3f0cfe220e2579e0 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 14 May 2016 00:00:02 -0400 Subject: [PATCH 120/212] move gh-pages generation to kramdown --- Makefile.docs.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.docs.mk b/Makefile.docs.mk index c509095d..350b329f 100644 --- a/Makefile.docs.mk +++ b/Makefile.docs.mk @@ -11,7 +11,7 @@ jekyll: echo "gaugesid: $(GAUGES_CODE)" > docs/_config.yml echo "projecturl: $(PROJECT_URL)" >> docs/_config.yml echo "basesite: http://www.unwiredcouch.com" >> docs/_config.yml - echo "markdown: redcarpet" >> docs/_config.yml + echo "markdown: kramdown" >> docs/_config.yml echo "---" > docs/index.md echo "layout: project" >> docs/index.md echo "title: $(NAME)" >> docs/index.md From fd0ab0fe49f04b62fe10f0b7b094157d8f0a9df7 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 29 Aug 2016 20:07:48 -0400 Subject: [PATCH 121/212] fix README examples for conn->post, conn->put this fixes #58 --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bb5ee04c..f4b90a12 100644 --- a/README.md +++ b/README.md @@ -77,10 +77,13 @@ conn->AppendHeader("X-MY-HEADER", "foo") conn->SetCAInfoFilePath("/etc/custom-ca.crt") RestClient::Response r = conn->get("/get") -RestClient::Response r = conn->post("/post", "text/json", "{\"foo\": \"bla\"}") -RestClient::Response r = conn->put("/put", "text/json", "{\"foo\": \"bla\"}") RestClient::Response r = conn->del("/delete") +// set different content header for POST and PUT +conn->AppendHeader("Content-Type", "text/json") +RestClient::Response r = conn->post("/post", "{\"foo\": \"bla\"}") +RestClient::Response r = conn->put("/put", "text/json", "{\"foo\": \"bla\"}") + // deinit RestClient. After calling this you have to call RestClient::init() // again before you can use it RestClient::disable(); From 03272c4e9dcb1f9cc979964e3d93a2d0eff2a1c7 Mon Sep 17 00:00:00 2001 From: Daniel Perez Date: Tue, 13 Sep 2016 16:30:32 +0900 Subject: [PATCH 122/212] Fix -Wpedantic warning --- include/restclient-cpp/restclient.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index dd011d03..8084fed3 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -59,6 +59,6 @@ Response put(const std::string& url, const std::string& data); Response del(const std::string& url); -}; // namespace RestClient +} // namespace RestClient #endif // INCLUDE_RESTCLIENT_CPP_RESTCLIENT_H_ From f47acbbedd97fd8be8283d996aed35d605a73e51 Mon Sep 17 00:00:00 2001 From: limhyungseok Date: Tue, 15 Nov 2016 18:05:29 +0900 Subject: [PATCH 123/212] add HEAD method this closes #63 --- README.md | 2 ++ include/restclient-cpp/connection.h | 1 + include/restclient-cpp/restclient.h | 1 + source/connection.cc | 18 ++++++++++++++++++ source/restclient.cc | 14 ++++++++++++++ test/test_connection.cc | 15 +++++++++++++++ test/test_restclient.cc | 6 ++++++ 7 files changed, 57 insertions(+) diff --git a/README.md b/README.md index f4b90a12..7424d2df 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ RestClient::Response r = RestClient::get("http://url.com") RestClient::Response r = RestClient::post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}") RestClient::Response r = RestClient::put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}") RestClient::Response r = RestClient::del("http://url.com/delete") +RestClient::Response r = RestClient::head("http://url.com") ``` The response is of type [RestClient::Response][restclient_response] and has @@ -77,6 +78,7 @@ conn->AppendHeader("X-MY-HEADER", "foo") conn->SetCAInfoFilePath("/etc/custom-ca.crt") RestClient::Response r = conn->get("/get") +RestClient::Response r = conn->head("/get") RestClient::Response r = conn->del("/delete") // set different content header for POST and PUT diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index e8a471e0..515d8d9d 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -148,6 +148,7 @@ class Connection { RestClient::Response put(const std::string& uri, const std::string& data); RestClient::Response del(const std::string& uri); + RestClient::Response head(const std::string& uri); private: CURL* curlHandle; diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index 8084fed3..75dc7c6e 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -58,6 +58,7 @@ Response put(const std::string& url, const std::string& content_type, const std::string& data); Response del(const std::string& url); +Response head(const std::string& url); } // namespace RestClient diff --git a/source/connection.cc b/source/connection.cc index 3cef27f9..59555774 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -358,3 +358,21 @@ RestClient::Connection::del(const std::string& url) { return this->performCurlRequest(url); } +/** + * @brief HTTP HEAD method + * + * @param url to query + * + * @return response struct + */ +RestClient::Response +RestClient::Connection::head(const std::string& url) { + /** we want HTTP HEAD */ + const char* http_head = "HEAD"; + + /** set HTTP HEAD METHOD */ + curl_easy_setopt(this->curlHandle, CURLOPT_CUSTOMREQUEST, http_head); + curl_easy_setopt(this->curlHandle, CURLOPT_NOBODY, 1L); + + return this->performCurlRequest(url); +} diff --git a/source/restclient.cc b/source/restclient.cc index f5fd8ed8..962d4dec 100644 --- a/source/restclient.cc +++ b/source/restclient.cc @@ -108,3 +108,17 @@ RestClient::Response RestClient::del(const std::string& url) { return ret; } +/** + * @brief HTTP HEAD method + * + * @param url to query + * + * @return response struct + */ +RestClient::Response RestClient::head(const std::string& url) { + RestClient::Response ret; + RestClient::Connection *conn = new RestClient::Connection(""); + ret = conn->head(url); + delete conn; + return ret; +} diff --git a/test/test_connection.cc b/test/test_connection.cc index b71e497a..0726cfe2 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -182,3 +182,18 @@ TEST_F(ConnectionTest, TestGetInfoFromRedirect) EXPECT_NE(0, info.lastRequest.redirectTime); EXPECT_NE(0, info.lastRequest.redirectCount); } + +TEST_F(ConnectionTest, TestHeadHeaders) +{ + RestClient::HeaderFields headers; + headers["Foo"] = "bar"; + headers["Bla"] = "lol"; + conn->SetHeaders(headers); + RestClient::Response res = conn->head("/headers"); + EXPECT_EQ(200, res.code); + EXPECT_EQ("", res.body); + + RestClient::HeaderFields headers_returned = conn->GetHeaders(); + EXPECT_EQ("bar", headers_returned["Foo"]); + EXPECT_EQ("lol", headers_returned["Bla"]); +} diff --git a/test/test_restclient.cc b/test/test_restclient.cc index 122148fc..b1d89d24 100644 --- a/test/test_restclient.cc +++ b/test/test_restclient.cc @@ -164,3 +164,9 @@ TEST_F(RestClientTest, TestRestClientAuth) res = RestClient::get("http://httpbin.org/basic-auth/foo/bar"); EXPECT_EQ(401, res.code); } +TEST_F(RestClientTest, TestRestClientHeadCode) +{ + RestClient::Response res = RestClient::head("http://httpbin.org/get"); + EXPECT_EQ(200, res.code); + EXPECT_EQ("", res.body); +} From 143f35578dbd3d8945677a41255a544a4462466e Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sun, 27 Nov 2016 21:18:23 -0500 Subject: [PATCH 124/212] move docs to ./docs folder this makes it so gh-pages is published from that folder and makes a whole lot of makefile logic obsolete that deals with generating a gh-pages branch from master. In addition to that it also removes the need for an encrypted GH_TOKEN. --- .gitignore | 1 - .gitmodules | 3 + .travis.yml | 3 - Makefile.docs.mk | 20 +- docs/_config.yml | 4 + docs/_layouts | 1 + docs/index.md | 205 +++ docs/ref/annotated.html | 110 ++ docs/ref/arrowdown.png | Bin 0 -> 246 bytes docs/ref/arrowright.png | Bin 0 -> 229 bytes docs/ref/bc_s.png | Bin 0 -> 676 bytes docs/ref/bdwn.png | Bin 0 -> 147 bytes ...ss_rest_client_1_1_connection-members.html | 125 ++ .../ref/class_rest_client_1_1_connection.html | 615 +++++++ docs/ref/classes.html | 112 ++ docs/ref/closed.png | Bin 0 -> 132 bytes docs/ref/connection_8h.html | 139 ++ docs/ref/connection_8h_source.html | 241 +++ .../dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html | 106 ++ .../dir_d44c64559bbebec7f509842c48db8b23.html | 102 ++ .../dir_d7863d21b35bfd92001c24d3be435c80.html | 111 ++ docs/ref/doc.png | Bin 0 -> 746 bytes docs/ref/doxygen.css | 1449 +++++++++++++++++ docs/ref/doxygen.png | Bin 0 -> 3779 bytes docs/ref/dynsections.js | 97 ++ docs/ref/files.html | 108 ++ docs/ref/folderclosed.png | Bin 0 -> 616 bytes docs/ref/folderopen.png | Bin 0 -> 597 bytes docs/ref/functions.html | 277 ++++ docs/ref/functions_func.html | 152 ++ docs/ref/functions_vars.html | 162 ++ docs/ref/helpers_8h.html | 147 ++ docs/ref/helpers_8h_source.html | 161 ++ docs/ref/index.html | 142 ++ docs/ref/jquery.js | 68 + docs/ref/md__c_h_a_n_g_e_l_o_g.html | 184 +++ docs/ref/md__c_o_n_t_r_i_b_u_t_i_n_g.html | 106 ++ docs/ref/namespace_rest_client.html | 332 ++++ .../namespace_rest_client_1_1_helpers.html | 285 ++++ docs/ref/namespacemembers.html | 136 ++ docs/ref/namespacemembers_func.html | 133 ++ docs/ref/namespacemembers_type.html | 106 ++ docs/ref/namespaces.html | 104 ++ docs/ref/nav_f.png | Bin 0 -> 153 bytes docs/ref/nav_g.png | Bin 0 -> 95 bytes docs/ref/nav_h.png | Bin 0 -> 98 bytes docs/ref/open.png | Bin 0 -> 123 bytes docs/ref/pages.html | 98 ++ docs/ref/restclient_8h.html | 165 ++ docs/ref/restclient_8h_source.html | 151 ++ docs/ref/search/all_0.html | 26 + docs/ref/search/all_0.js | 5 + docs/ref/search/all_1.html | 26 + docs/ref/search/all_1.js | 6 + docs/ref/search/all_2.html | 26 + docs/ref/search/all_2.js | 11 + docs/ref/search/all_3.html | 26 + docs/ref/search/all_3.js | 6 + docs/ref/search/all_4.html | 26 + docs/ref/search/all_4.js | 4 + docs/ref/search/all_5.html | 26 + docs/ref/search/all_5.js | 7 + docs/ref/search/all_6.html | 26 + docs/ref/search/all_6.js | 8 + docs/ref/search/all_7.html | 26 + docs/ref/search/all_7.js | 5 + docs/ref/search/all_8.html | 26 + docs/ref/search/all_8.js | 5 + docs/ref/search/all_9.html | 26 + docs/ref/search/all_9.js | 4 + docs/ref/search/all_a.html | 26 + docs/ref/search/all_a.js | 6 + docs/ref/search/all_b.html | 26 + docs/ref/search/all_b.js | 11 + docs/ref/search/all_c.html | 26 + docs/ref/search/all_c.js | 9 + docs/ref/search/all_d.html | 26 + docs/ref/search/all_d.js | 5 + docs/ref/search/all_e.html | 26 + docs/ref/search/all_e.js | 4 + docs/ref/search/all_f.html | 26 + docs/ref/search/all_f.js | 4 + docs/ref/search/classes_0.html | 26 + docs/ref/search/classes_0.js | 4 + docs/ref/search/classes_1.html | 26 + docs/ref/search/classes_1.js | 4 + docs/ref/search/classes_2.html | 26 + docs/ref/search/classes_2.js | 5 + docs/ref/search/classes_3.html | 26 + docs/ref/search/classes_3.js | 4 + docs/ref/search/close.png | Bin 0 -> 273 bytes docs/ref/search/files_0.html | 26 + docs/ref/search/files_0.js | 4 + docs/ref/search/files_1.html | 26 + docs/ref/search/files_1.js | 4 + docs/ref/search/files_2.html | 26 + docs/ref/search/files_2.js | 4 + docs/ref/search/functions_0.html | 26 + docs/ref/search/functions_0.js | 4 + docs/ref/search/functions_1.html | 26 + docs/ref/search/functions_1.js | 4 + docs/ref/search/functions_2.html | 26 + docs/ref/search/functions_2.js | 5 + docs/ref/search/functions_3.html | 26 + docs/ref/search/functions_3.js | 4 + docs/ref/search/functions_4.html | 26 + docs/ref/search/functions_4.js | 7 + docs/ref/search/functions_5.html | 26 + docs/ref/search/functions_5.js | 5 + docs/ref/search/functions_6.html | 26 + docs/ref/search/functions_6.js | 4 + docs/ref/search/functions_7.html | 26 + docs/ref/search/functions_7.js | 5 + docs/ref/search/functions_8.html | 26 + docs/ref/search/functions_8.js | 4 + docs/ref/search/functions_9.html | 26 + docs/ref/search/functions_9.js | 8 + docs/ref/search/functions_a.html | 26 + docs/ref/search/functions_a.js | 4 + docs/ref/search/mag_sel.png | Bin 0 -> 563 bytes docs/ref/search/namespaces_0.html | 26 + docs/ref/search/namespaces_0.js | 5 + docs/ref/search/nomatches.html | 12 + docs/ref/search/pages_0.html | 26 + docs/ref/search/pages_0.js | 5 + docs/ref/search/search.css | 271 +++ docs/ref/search/search.js | 791 +++++++++ docs/ref/search/search_l.png | Bin 0 -> 604 bytes docs/ref/search/search_m.png | Bin 0 -> 158 bytes docs/ref/search/search_r.png | Bin 0 -> 612 bytes docs/ref/search/searchdata.js | 36 + docs/ref/search/typedefs_0.html | 26 + docs/ref/search/typedefs_0.js | 4 + docs/ref/search/variables_0.html | 26 + docs/ref/search/variables_0.js | 4 + docs/ref/search/variables_1.html | 26 + docs/ref/search/variables_1.js | 6 + docs/ref/search/variables_2.html | 26 + docs/ref/search/variables_2.js | 6 + docs/ref/search/variables_3.html | 26 + docs/ref/search/variables_3.js | 4 + docs/ref/search/variables_4.html | 26 + docs/ref/search/variables_4.js | 4 + docs/ref/search/variables_5.html | 26 + docs/ref/search/variables_5.js | 4 + docs/ref/search/variables_6.html | 26 + docs/ref/search/variables_6.js | 5 + docs/ref/search/variables_7.html | 26 + docs/ref/search/variables_7.js | 4 + docs/ref/search/variables_8.html | 26 + docs/ref/search/variables_8.js | 4 + docs/ref/search/variables_9.html | 26 + docs/ref/search/variables_9.js | 5 + docs/ref/search/variables_a.html | 26 + docs/ref/search/variables_a.js | 4 + docs/ref/search/variables_b.html | 26 + docs/ref/search/variables_b.js | 5 + docs/ref/splitbar.png | Bin 0 -> 314 bytes ...lient_1_1_connection_1_1_info-members.html | 115 ++ ...t_rest_client_1_1_connection_1_1_info.html | 233 +++ ...1_connection_1_1_request_info-members.html | 114 ++ ...lient_1_1_connection_1_1_request_info.html | 241 +++ ...1_1_helpers_1_1_upload_object-members.html | 108 ++ ..._client_1_1_helpers_1_1_upload_object.html | 151 ++ ...ruct_rest_client_1_1_response-members.html | 109 ++ docs/ref/struct_rest_client_1_1_response.html | 166 ++ docs/ref/sync_off.png | Bin 0 -> 853 bytes docs/ref/sync_on.png | Bin 0 -> 845 bytes docs/ref/tab_a.png | Bin 0 -> 142 bytes docs/ref/tab_b.png | Bin 0 -> 169 bytes docs/ref/tab_h.png | Bin 0 -> 177 bytes docs/ref/tab_s.png | Bin 0 -> 184 bytes docs/ref/tabs.css | 60 + docs/ref/version_8h_source.html | 105 ++ 174 files changed, 10481 insertions(+), 18 deletions(-) create mode 100644 .gitmodules create mode 100644 docs/_config.yml create mode 160000 docs/_layouts create mode 100644 docs/index.md create mode 100644 docs/ref/annotated.html create mode 100644 docs/ref/arrowdown.png create mode 100644 docs/ref/arrowright.png create mode 100644 docs/ref/bc_s.png create mode 100644 docs/ref/bdwn.png create mode 100644 docs/ref/class_rest_client_1_1_connection-members.html create mode 100644 docs/ref/class_rest_client_1_1_connection.html create mode 100644 docs/ref/classes.html create mode 100644 docs/ref/closed.png create mode 100644 docs/ref/connection_8h.html create mode 100644 docs/ref/connection_8h_source.html create mode 100644 docs/ref/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html create mode 100644 docs/ref/dir_d44c64559bbebec7f509842c48db8b23.html create mode 100644 docs/ref/dir_d7863d21b35bfd92001c24d3be435c80.html create mode 100644 docs/ref/doc.png create mode 100644 docs/ref/doxygen.css create mode 100644 docs/ref/doxygen.png create mode 100644 docs/ref/dynsections.js create mode 100644 docs/ref/files.html create mode 100644 docs/ref/folderclosed.png create mode 100644 docs/ref/folderopen.png create mode 100644 docs/ref/functions.html create mode 100644 docs/ref/functions_func.html create mode 100644 docs/ref/functions_vars.html create mode 100644 docs/ref/helpers_8h.html create mode 100644 docs/ref/helpers_8h_source.html create mode 100644 docs/ref/index.html create mode 100644 docs/ref/jquery.js create mode 100644 docs/ref/md__c_h_a_n_g_e_l_o_g.html create mode 100644 docs/ref/md__c_o_n_t_r_i_b_u_t_i_n_g.html create mode 100644 docs/ref/namespace_rest_client.html create mode 100644 docs/ref/namespace_rest_client_1_1_helpers.html create mode 100644 docs/ref/namespacemembers.html create mode 100644 docs/ref/namespacemembers_func.html create mode 100644 docs/ref/namespacemembers_type.html create mode 100644 docs/ref/namespaces.html create mode 100644 docs/ref/nav_f.png create mode 100644 docs/ref/nav_g.png create mode 100644 docs/ref/nav_h.png create mode 100644 docs/ref/open.png create mode 100644 docs/ref/pages.html create mode 100644 docs/ref/restclient_8h.html create mode 100644 docs/ref/restclient_8h_source.html create mode 100644 docs/ref/search/all_0.html create mode 100644 docs/ref/search/all_0.js create mode 100644 docs/ref/search/all_1.html create mode 100644 docs/ref/search/all_1.js create mode 100644 docs/ref/search/all_2.html create mode 100644 docs/ref/search/all_2.js create mode 100644 docs/ref/search/all_3.html create mode 100644 docs/ref/search/all_3.js create mode 100644 docs/ref/search/all_4.html create mode 100644 docs/ref/search/all_4.js create mode 100644 docs/ref/search/all_5.html create mode 100644 docs/ref/search/all_5.js create mode 100644 docs/ref/search/all_6.html create mode 100644 docs/ref/search/all_6.js create mode 100644 docs/ref/search/all_7.html create mode 100644 docs/ref/search/all_7.js create mode 100644 docs/ref/search/all_8.html create mode 100644 docs/ref/search/all_8.js create mode 100644 docs/ref/search/all_9.html create mode 100644 docs/ref/search/all_9.js create mode 100644 docs/ref/search/all_a.html create mode 100644 docs/ref/search/all_a.js create mode 100644 docs/ref/search/all_b.html create mode 100644 docs/ref/search/all_b.js create mode 100644 docs/ref/search/all_c.html create mode 100644 docs/ref/search/all_c.js create mode 100644 docs/ref/search/all_d.html create mode 100644 docs/ref/search/all_d.js create mode 100644 docs/ref/search/all_e.html create mode 100644 docs/ref/search/all_e.js create mode 100644 docs/ref/search/all_f.html create mode 100644 docs/ref/search/all_f.js create mode 100644 docs/ref/search/classes_0.html create mode 100644 docs/ref/search/classes_0.js create mode 100644 docs/ref/search/classes_1.html create mode 100644 docs/ref/search/classes_1.js create mode 100644 docs/ref/search/classes_2.html create mode 100644 docs/ref/search/classes_2.js create mode 100644 docs/ref/search/classes_3.html create mode 100644 docs/ref/search/classes_3.js create mode 100644 docs/ref/search/close.png create mode 100644 docs/ref/search/files_0.html create mode 100644 docs/ref/search/files_0.js create mode 100644 docs/ref/search/files_1.html create mode 100644 docs/ref/search/files_1.js create mode 100644 docs/ref/search/files_2.html create mode 100644 docs/ref/search/files_2.js create mode 100644 docs/ref/search/functions_0.html create mode 100644 docs/ref/search/functions_0.js create mode 100644 docs/ref/search/functions_1.html create mode 100644 docs/ref/search/functions_1.js create mode 100644 docs/ref/search/functions_2.html create mode 100644 docs/ref/search/functions_2.js create mode 100644 docs/ref/search/functions_3.html create mode 100644 docs/ref/search/functions_3.js create mode 100644 docs/ref/search/functions_4.html create mode 100644 docs/ref/search/functions_4.js create mode 100644 docs/ref/search/functions_5.html create mode 100644 docs/ref/search/functions_5.js create mode 100644 docs/ref/search/functions_6.html create mode 100644 docs/ref/search/functions_6.js create mode 100644 docs/ref/search/functions_7.html create mode 100644 docs/ref/search/functions_7.js create mode 100644 docs/ref/search/functions_8.html create mode 100644 docs/ref/search/functions_8.js create mode 100644 docs/ref/search/functions_9.html create mode 100644 docs/ref/search/functions_9.js create mode 100644 docs/ref/search/functions_a.html create mode 100644 docs/ref/search/functions_a.js create mode 100644 docs/ref/search/mag_sel.png create mode 100644 docs/ref/search/namespaces_0.html create mode 100644 docs/ref/search/namespaces_0.js create mode 100644 docs/ref/search/nomatches.html create mode 100644 docs/ref/search/pages_0.html create mode 100644 docs/ref/search/pages_0.js create mode 100644 docs/ref/search/search.css create mode 100644 docs/ref/search/search.js create mode 100644 docs/ref/search/search_l.png create mode 100644 docs/ref/search/search_m.png create mode 100644 docs/ref/search/search_r.png create mode 100644 docs/ref/search/searchdata.js create mode 100644 docs/ref/search/typedefs_0.html create mode 100644 docs/ref/search/typedefs_0.js create mode 100644 docs/ref/search/variables_0.html create mode 100644 docs/ref/search/variables_0.js create mode 100644 docs/ref/search/variables_1.html create mode 100644 docs/ref/search/variables_1.js create mode 100644 docs/ref/search/variables_2.html create mode 100644 docs/ref/search/variables_2.js create mode 100644 docs/ref/search/variables_3.html create mode 100644 docs/ref/search/variables_3.js create mode 100644 docs/ref/search/variables_4.html create mode 100644 docs/ref/search/variables_4.js create mode 100644 docs/ref/search/variables_5.html create mode 100644 docs/ref/search/variables_5.js create mode 100644 docs/ref/search/variables_6.html create mode 100644 docs/ref/search/variables_6.js create mode 100644 docs/ref/search/variables_7.html create mode 100644 docs/ref/search/variables_7.js create mode 100644 docs/ref/search/variables_8.html create mode 100644 docs/ref/search/variables_8.js create mode 100644 docs/ref/search/variables_9.html create mode 100644 docs/ref/search/variables_9.js create mode 100644 docs/ref/search/variables_a.html create mode 100644 docs/ref/search/variables_a.js create mode 100644 docs/ref/search/variables_b.html create mode 100644 docs/ref/search/variables_b.js create mode 100644 docs/ref/splitbar.png create mode 100644 docs/ref/struct_rest_client_1_1_connection_1_1_info-members.html create mode 100644 docs/ref/struct_rest_client_1_1_connection_1_1_info.html create mode 100644 docs/ref/struct_rest_client_1_1_connection_1_1_request_info-members.html create mode 100644 docs/ref/struct_rest_client_1_1_connection_1_1_request_info.html create mode 100644 docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object-members.html create mode 100644 docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object.html create mode 100644 docs/ref/struct_rest_client_1_1_response-members.html create mode 100644 docs/ref/struct_rest_client_1_1_response.html create mode 100644 docs/ref/sync_off.png create mode 100644 docs/ref/sync_on.png create mode 100644 docs/ref/tab_a.png create mode 100644 docs/ref/tab_b.png create mode 100644 docs/ref/tab_h.png create mode 100644 docs/ref/tab_s.png create mode 100644 docs/ref/tabs.css create mode 100644 docs/ref/version_8h_source.html diff --git a/.gitignore b/.gitignore index 388e0056..967e5ba7 100644 --- a/.gitignore +++ b/.gitignore @@ -42,5 +42,4 @@ coverage.info usr # generated files -docs include/restclient-cpp/version.h diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..79ab4b5f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "docs/_layouts"] + path = docs/_layouts + url = https://github.com/mrtazz/jekyll-layouts.git diff --git a/.travis.yml b/.travis.yml index 79278687..0a005b5e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,8 +19,6 @@ after_success: - export PATH=$PATH:`pwd`/lcov-1.11/bin - make coverage.info - coveralls-lcov coverage.info -- test $TRAVIS_PULL_REQUEST == "false" && test $TRAVIS_BRANCH == "master" && make - deploy-docs sudo: false addons: apt: @@ -38,5 +36,4 @@ deploy: condition: $CXX = g++ env: global: - - secure: i+h0SxjrHCfvoaXCJ1b+tK0vvNgoLq7Xl/eh34tb3QokacWO+piyLcbSxvz0IcE50ye0x8CyMn2hyyGCgzwHDgaUCmkILS+3y+9E7FC4nYwLvi2mJ2Q9DI1Q5aXhcMXiEYb9b1LjrorUdgs6DcfJVq7ZSU3CawKU/uBtKfC39iQ= - secure: IdA0aOUuazgCVT3X8bmOjC2mJpHIk+eakCUgiPGhsMsg6Nhe+OgYUF9uGLgz3py5qZq3ns+9WV1IVZVhwd1CFz+2wFKHM6WRnvlfFJ/aV+rb10I2tiX8BrepNcZzCvwuTxIgqb3m97DHRmf/s8DnnmF6v5pvUaKb9SjxFQ1d/XY= diff --git a/Makefile.docs.mk b/Makefile.docs.mk index 350b329f..28202dd9 100644 --- a/Makefile.docs.mk +++ b/Makefile.docs.mk @@ -1,12 +1,15 @@ # Make tasks to create and deploy documentation -.PHONY: docs clean-docs deploy-docs doxygen jekyll +.PHONY: docs clean-docs deploy-docs doxygen update-docs-from-readme jekyll-layouts GAUGES_CODE="539c6c8de32bb442640005f3" +jekyll-layouts: + git submodule update --init + doxygen: doxygen doxygen.config -jekyll: +update-docs-from-readme: jekyll-layouts install -d docs echo "gaugesid: $(GAUGES_CODE)" > docs/_config.yml echo "projecturl: $(PROJECT_URL)" >> docs/_config.yml @@ -18,18 +21,7 @@ jekyll: echo "---" >> docs/index.md cat README.md >> docs/index.md -docs: doxygen jekyll +docs: doxygen update-docs-from-readme clean-docs: rm -rf ./docs - -deploy-docs: docs - @cd docs && git init && git remote add upstream "https://${GH_TOKEN}@github.com/mrtazz/$(NAME).git" && \ - git submodule add https://github.com/mrtazz/jekyll-layouts.git ./_layouts && \ - git submodule update --init && \ - git fetch upstream && git reset upstream/gh-pages && \ - git config user.name 'Daniel Schauenberg' && git config user.email d@unwiredcouch.com && \ - touch . && git add -A . && \ - git commit -m "rebuild pages at $(VERSION)" && \ - git push -q upstream HEAD:gh-pages - diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 00000000..e31df3e4 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,4 @@ +gaugesid: 539c6c8de32bb442640005f3 +projecturl: https://github.com/mrtazz/restclient-cpp +basesite: http://www.unwiredcouch.com +markdown: kramdown diff --git a/docs/_layouts b/docs/_layouts new file mode 160000 index 00000000..45dd7d4a --- /dev/null +++ b/docs/_layouts @@ -0,0 +1 @@ +Subproject commit 45dd7d4a5c2686eb9997d5658fd455d09d3a5e4a diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..32c91f3b --- /dev/null +++ b/docs/index.md @@ -0,0 +1,205 @@ +--- +layout: project +title: restclient-cpp +--- +# REST client for C++ +[![Build Status](https://travis-ci.org/mrtazz/restclient-cpp.svg?branch=master)](https://travis-ci.org/mrtazz/restclient-cpp) +[![Coverage Status](https://coveralls.io/repos/mrtazz/restclient-cpp/badge.svg?branch=master&service=github)](https://coveralls.io/github/mrtazz/restclient-cpp?branch=master) +[![Packagecloud](https://img.shields.io/badge/packagecloud-available-brightgreen.svg)](https://packagecloud.io/mrtazz/restclient-cpp) +[![doxygen](https://img.shields.io/badge/doxygen-reference-blue.svg)](http://code.mrtazz.com/restclient-cpp/ref/) +[![MIT license](https://img.shields.io/badge/license-MIT-blue.svg)](http://opensource.org/licenses/MIT) + + +## About +This is a simple REST client for C++. It wraps [libcurl][] for HTTP requests. + +## Usage +restclient-cpp provides two ways of interacting with REST endpoints. There is +a simple one, which doesn't need you to configure an object to interact with +an API. However the simple way doesn't provide a lot of configuration options +either. So if you need more than just a simple HTTP call, you will probably +want to check out the advanced usage. + +### Simple Usage +The simple API is just some static methods modeled after the most common HTTP +verbs: + +```cpp +#include "restclient-cpp/restclient.h" + +RestClient::Response r = RestClient::get("http://url.com") +RestClient::Response r = RestClient::post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}") +RestClient::Response r = RestClient::put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}") +RestClient::Response r = RestClient::del("http://url.com/delete") +RestClient::Response r = RestClient::head("http://url.com") +``` + +The response is of type [RestClient::Response][restclient_response] and has +three attributes: + +```cpp +RestClient::Response.code // HTTP response code +RestClient::Response.body // HTTP response body +RestClient::Response.headers // HTTP response headers +``` + +### Advanced Usage +However if you want more sophisticated features like connection reuse, +timeouts or authentication, there is also a different, more configurable way. + +```cpp +#include "restclient-cpp/connection.h" +#include "restclient-cpp/restclient.h" + +// initialize RestClient +RestClient::init(); + +// get a connection object +RestClient::Connection* conn = new RestClient::Connection("http://url.com"); + +// configure basic auth +conn->SetBasicAuth("WarMachine68", "WARMACHINEROX"); + +// set connection timeout to 5s +conn->SetTimeout(5); + +// set custom user agent +// (this will result in the UA "foo/cool restclient-cpp/VERSION") +conn->SetUserAgent("foo/cool"); + +// enable following of redirects (default is off) +conn->FollowRedirects(true); + +// set headers +RestClient::HeaderFields headers; +headers["Accept"] = "application/json"; +conn->SetHeaders(headers) + +// append additional headers +conn->AppendHeader("X-MY-HEADER", "foo") + +// if using a non-standard Certificate Authority (CA) trust file +conn->SetCAInfoFilePath("/etc/custom-ca.crt") + +RestClient::Response r = conn->get("/get") +RestClient::Response r = conn->head("/get") +RestClient::Response r = conn->del("/delete") + +// set different content header for POST and PUT +conn->AppendHeader("Content-Type", "text/json") +RestClient::Response r = conn->post("/post", "{\"foo\": \"bla\"}") +RestClient::Response r = conn->put("/put", "text/json", "{\"foo\": \"bla\"}") + +// deinit RestClient. After calling this you have to call RestClient::init() +// again before you can use it +RestClient::disable(); +``` + +The responses are again of type [RestClient::Response][restclient_response] +and have three attributes: + +```cpp +RestClient::Response.code // HTTP response code +RestClient::Response.body // HTTP response body +RestClient::Response.headers // HTTP response headers +``` + +The connection object also provides a simple way to get some diagnostics and +metrics information via `conn->GetInfo()`. The result is a +`RestClient::Connection::Info` struct and looks like this: + +```cpp +typedef struct { + std::string base_url; + RestClients::HeaderFields headers; + int timeout; + struct { + std::string username; + std::string password; + } basicAuth; + std::string customUserAgent; + struct { + // total time of the last request in seconds Total time of previous + // transfer. See CURLINFO_TOTAL_TIME + int totalTime; + // time spent in DNS lookup in seconds Time from start until name + // resolving completed. See CURLINFO_NAMELOOKUP_TIME + int nameLookupTime; + // time it took until Time from start until remote host or proxy + // completed. See CURLINFO_CONNECT_TIME + int connectTime; + // Time from start until SSL/SSH handshake completed. See + // CURLINFO_APPCONNECT_TIME + int appConnectTime; + // Time from start until just before the transfer begins. See + // CURLINFO_PRETRANSFER_TIME + int preTransferTime; + // Time from start until just when the first byte is received. See + // CURLINFO_STARTTRANSFER_TIME + int startTransferTime; + // Time taken for all redirect steps before the final transfer. See + // CURLINFO_REDIRECT_TIME + int redirectTime; + // number of redirects followed. See CURLINFO_REDIRECT_COUNT + int redirectCount; + } lastRequest; +} Info; +``` + +#### Persistent connections/Keep-Alive +The connection object stores the curl easy handle in an instance variable and +uses that for the lifetime of the object. This means curl will [automatically +reuse connections][curl_keepalive] made with that handle. + + +## Thread Safety +restclient-cpp leans heavily on libcurl as it aims to provide a thin wrapper +around it. This means it adheres to the basic level of thread safety [provided +by libcurl][curl_threadsafety]. The `RestClient::init()` and +`RestClient::disable()` methods basically correspond to `curl_global_init` and +`curl_global_cleanup` and thus need to be called right at the beginning of +your program and before shutdown respectively. These set up the environment +and are **not thread-safe**. After that you can create connection objects in +your threads. Do not share connection objects across threads as this would +mean accessing curl handles from multiple threads at the same time which is +not allowed. + +In order to provide an easy to use API, the simple usage via the static +methods implicitly calls the curl global functions and is therefore also **not +thread-safe**. + + +## Dependencies +- [libcurl][] + +## Installation +There are some packages available for Linux on [packagecloud][packagecloud]. +And for OSX you can get it from the mrtazz/oss homebrew tap: + +```bash +brew tap mrtazz/oss +brew install restclient-cpp +``` + +Otherwise you can do the regular autotools dance: + +```bash +./autogen.sh +./configure +make install +``` + +## Contribute +All contributions are highly appreciated. This includes filing issues, +updating documentation and writing code. Please take a look at the +[contributing guidelines][contributing] before so your contribution can be +merged as fast as possible. + + +[libcurl]: http://curl.haxx.se/libcurl/ +[gtest]: http://code.google.com/p/googletest/ +[packagecloud]: https://packagecloud.io/mrtazz/restclient-cpp +[contributing]: https://github.com/mrtazz/restclient-cpp/blob/master/CONTRIBUTING.md +[curl_keepalive]: http://curl.haxx.se/docs/faq.html#What_about_Keep_Alive_or_persist +[curl_threadsafety]: http://curl.haxx.se/libcurl/c/threadsafe.html +[restclient_response]: http://code.mrtazz.com/restclient-cpp/ref/struct_rest_client_1_1_response.html diff --git a/docs/ref/annotated.html b/docs/ref/annotated.html new file mode 100644 index 00000000..07f3466f --- /dev/null +++ b/docs/ref/annotated.html @@ -0,0 +1,110 @@ + + + + + + +restclient-cpp: Class List + + + + + + + + + + +
+
+

$func_code$count_code
$name$count
+ + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 123]
+ + + + + + + +
 NRestClientNamespace for all RestClient definitions
 NHelpers: namespace for all helper functions
 CUploadObjectThis structure represents the payload to upload on POST requests
 CConnectionConnection object for advanced usage
 CInfoHolds some diagnostics information about the connection object it came from
 CRequestInfoHolds some diagnostics information about a request
 CResponseThis structure represents the HTTP response data
+
+
+ + + + diff --git a/docs/ref/arrowdown.png b/docs/ref/arrowdown.png new file mode 100644 index 0000000000000000000000000000000000000000..0b63f6d38c4b9ec907b820192ebe9724ed6eca22 GIT binary patch literal 246 zcmVkw!R34#Lv2LOS^S2tZA31X++9RY}n zChwn@Z)Wz*WWHH{)HDtJnq&A2hk$b-y(>?@z0iHr41EKCGp#T5?07*qoM6N<$f(V3Pvj6}9 literal 0 HcmV?d00001 diff --git a/docs/ref/arrowright.png b/docs/ref/arrowright.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ee22f937a07d1dbfc27c669d11f8ed13e2f152 GIT binary patch literal 229 zcmV^P)R?RzRoKvklcaQ%HF6%rK2&ZgO(-ihJ_C zzrKgp4jgO( fd_(yg|3PpEQb#9`a?Pz_00000NkvXXu0mjftR`5K literal 0 HcmV?d00001 diff --git a/docs/ref/bc_s.png b/docs/ref/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/docs/ref/bdwn.png b/docs/ref/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + +restclient-cpp: Member List + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RestClient::Connection Member List
+
+
+ +

This is the complete list of members for RestClient::Connection, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
AppendHeader(const std::string &key, const std::string &value)RestClient::Connection
Connection(const std::string baseUrl)RestClient::Connectionexplicit
del(const std::string &uri)RestClient::Connection
FollowRedirects(bool follow)RestClient::Connection
get(const std::string &uri)RestClient::Connection
GetHeaders()RestClient::Connection
GetInfo()RestClient::Connection
GetUserAgent()RestClient::Connection
head(const std::string &uri)RestClient::Connection
password (defined in RestClient::Connection)RestClient::Connection
post(const std::string &uri, const std::string &data)RestClient::Connection
put(const std::string &uri, const std::string &data)RestClient::Connection
SetBasicAuth(const std::string &username, const std::string &password)RestClient::Connection
SetCAInfoFilePath(const std::string &caInfoFilePath)RestClient::Connection
SetHeaders(RestClient::HeaderFields headers)RestClient::Connection
SetTimeout(int seconds)RestClient::Connection
SetUserAgent(const std::string &userAgent)RestClient::Connection
username (defined in RestClient::Connection)RestClient::Connection
~Connection() (defined in RestClient::Connection)RestClient::Connection
+ + + + diff --git a/docs/ref/class_rest_client_1_1_connection.html b/docs/ref/class_rest_client_1_1_connection.html new file mode 100644 index 00000000..a85f9cde --- /dev/null +++ b/docs/ref/class_rest_client_1_1_connection.html @@ -0,0 +1,615 @@ + + + + + + +restclient-cpp: RestClient::Connection Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RestClient::Connection Class Reference
+
+
+ +

Connection object for advanced usage. + More...

+ +

#include <connection.h>

+ + + + + + + + +

+Classes

struct  Info
 holds some diagnostics information about the connection object it came from More...
 
struct  RequestInfo
 holds some diagnostics information about a request More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Connection (const std::string baseUrl)
 constructor for the Connection object More...
 
void SetBasicAuth (const std::string &username, const std::string &password)
 set username and password for basic auth More...
 
void SetTimeout (int seconds)
 set timeout for connection More...
 
void FollowRedirects (bool follow)
 configure whether to follow redirects on this connection More...
 
void SetUserAgent (const std::string &userAgent)
 set custom user agent for connection. This gets prepended to the default restclient-cpp/RESTCLIENT_VERSION string More...
 
void SetCAInfoFilePath (const std::string &caInfoFilePath)
 set custom Certificate Authority (CA) path More...
 
std::string GetUserAgent ()
 get the user agent to add to the request More...
 
RestClient::Connection::Info GetInfo ()
 get diagnostic information about the connection object More...
 
void SetHeaders (RestClient::HeaderFields headers)
 set the custom headers map. This will replace the currently configured headers with the provided ones. If you want to add additional headers, use AppendHeader() More...
 
RestClient::HeaderFields GetHeaders ()
 get all custom headers set on the connection More...
 
void AppendHeader (const std::string &key, const std::string &value)
 append a header to the internal map More...
 
RestClient::Response get (const std::string &uri)
 HTTP GET method. More...
 
RestClient::Response post (const std::string &uri, const std::string &data)
 HTTP POST method. More...
 
RestClient::Response put (const std::string &uri, const std::string &data)
 HTTP PUT method. More...
 
RestClient::Response del (const std::string &uri)
 HTTP DELETE method. More...
 
RestClient::Response head (const std::string &uri)
 HTTP HEAD method. More...
 
+

Detailed Description

+

Connection object for advanced usage.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
RestClient::Connection::Connection (const std::string baseUrl)
+
+explicit
+
+ +

constructor for the Connection object

+
Parameters
+ + +
baseUrl- base URL for the connection to use
+
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
void RestClient::Connection::AppendHeader (const std::string & key,
const std::string & value 
)
+
+ +

append a header to the internal map

+
Parameters
+ + + +
keyfor the header field
valuefor the header field
+
+
+ +
+
+ +
+
+ + + + + + + + +
RestClient::Response RestClient::Connection::del (const std::string & url)
+
+ +

HTTP DELETE method.

+
Parameters
+ + +
urlto query
+
+
+
Returns
response struct
+

we want HTTP DELETE

+

set HTTP DELETE METHOD

+ +
+
+ +
+
+ + + + + + + + +
void RestClient::Connection::FollowRedirects (bool follow)
+
+ +

configure whether to follow redirects on this connection

+
Parameters
+ + +
follow- boolean whether to follow redirects
+
+
+ +
+
+ +
+
+ + + + + + + + +
RestClient::Response RestClient::Connection::get (const std::string & url)
+
+ +

HTTP GET method.

+
Parameters
+ + +
urlto query
+
+
+
Returns
response struct
+ +
+
+ +
+
+ + + + + + + +
RestClient::HeaderFields RestClient::Connection::GetHeaders ()
+
+ +

get all custom headers set on the connection

+
Returns
a RestClient::HeaderFields map containing the custom headers
+ +
+
+ +
+
+ + + + + + + +
RestClient::Connection::Info RestClient::Connection::GetInfo ()
+
+ +

get diagnostic information about the connection object

+
Returns
RestClient::Connection::Info struct
+ +
+
+ +
+
+ + + + + + + +
std::string RestClient::Connection::GetUserAgent ()
+
+ +

get the user agent to add to the request

+
Returns
user agent as std::string
+ +
+
+ +
+
+ + + + + + + + +
RestClient::Response RestClient::Connection::head (const std::string & url)
+
+ +

HTTP HEAD method.

+
Parameters
+ + +
urlto query
+
+
+
Returns
response struct
+

we want HTTP HEAD

+

set HTTP HEAD METHOD

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
RestClient::Response RestClient::Connection::post (const std::string & url,
const std::string & data 
)
+
+ +

HTTP POST method.

+
Parameters
+ + + +
urlto query
dataHTTP POST body
+
+
+
Returns
response struct
+

Now specify we want to POST data

+

set post fields

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
RestClient::Response RestClient::Connection::put (const std::string & url,
const std::string & data 
)
+
+ +

HTTP PUT method.

+
Parameters
+ + + +
urlto query
dataHTTP PUT body
+
+
+
Returns
response struct
+

initialize upload object

+

Now specify we want to PUT data

+

set read callback function

+

set data object to pass to callback function

+

set data size

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void RestClient::Connection::SetBasicAuth (const std::string & username,
const std::string & password 
)
+
+ +

set username and password for basic auth

+
Parameters
+ + + +
username
password
+
+
+ +
+
+ +
+
+ + + + + + + + +
void RestClient::Connection::SetCAInfoFilePath (const std::string & caInfoFilePath)
+
+ +

set custom Certificate Authority (CA) path

+
Parameters
+ + +
caInfoFilePath- The path to a file holding the certificates used to verify the peer with. See CURLOPT_CAINFO
+
+
+ +
+
+ +
+
+ + + + + + + + +
void RestClient::Connection::SetHeaders (RestClient::HeaderFields headers)
+
+ +

set the custom headers map. This will replace the currently configured headers with the provided ones. If you want to add additional headers, use AppendHeader()

+
Parameters
+ + +
headersto set
+
+
+ +
+
+ +
+
+ + + + + + + + +
void RestClient::Connection::SetTimeout (int seconds)
+
+ +

set timeout for connection

+
Parameters
+ + +
seconds- timeout in seconds
+
+
+ +
+
+ +
+
+ + + + + + + + +
void RestClient::Connection::SetUserAgent (const std::string & userAgent)
+
+ +

set custom user agent for connection. This gets prepended to the default restclient-cpp/RESTCLIENT_VERSION string

+
Parameters
+ + +
userAgent- custom userAgent prefix
+
+
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • include/restclient-cpp/connection.h
  • +
  • source/connection.cc
  • +
+
+ + + + diff --git a/docs/ref/classes.html b/docs/ref/classes.html new file mode 100644 index 00000000..0c4b21de --- /dev/null +++ b/docs/ref/classes.html @@ -0,0 +1,112 @@ + + + + + + +restclient-cpp: Class Index + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class Index
+
+
+
C | I | R | U
+ + + + + + +
  C  
+
  I  
+
  R  
+
Response (RestClient)   
  U  
+
Connection (RestClient)   Connection::Info (RestClient)   Connection::RequestInfo (RestClient)   
UploadObject (RestClient::Helpers)   
+
C | I | R | U
+
+ + + + diff --git a/docs/ref/closed.png b/docs/ref/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/docs/ref/connection_8h.html b/docs/ref/connection_8h.html new file mode 100644 index 00000000..682a77ea --- /dev/null +++ b/docs/ref/connection_8h.html @@ -0,0 +1,139 @@ + + + + + + +restclient-cpp: include/restclient-cpp/connection.h File Reference + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
connection.h File Reference
+
+
+ +

header definitions for restclient-cpp connection class +More...

+
#include <curl/curl.h>
+#include <string>
+#include <map>
+#include <cstdlib>
+#include "restclient-cpp/restclient.h"
+#include "restclient-cpp/version.h"
+
+

Go to the source code of this file.

+ + + + + + + + + + + +

+Classes

class  RestClient::Connection
 Connection object for advanced usage. More...
 
struct  RestClient::Connection::RequestInfo
 holds some diagnostics information about a request More...
 
struct  RestClient::Connection::Info
 holds some diagnostics information about the connection object it came from More...
 
+ + + + +

+Namespaces

 RestClient
 namespace for all RestClient definitions
 
+

Detailed Description

+

header definitions for restclient-cpp connection class

+
Author
Daniel Schauenberg d@unw.nosp@m.ired.nosp@m.couch.nosp@m..com
+
Version
+
Date
2010-10-11
+
+ + + + diff --git a/docs/ref/connection_8h_source.html b/docs/ref/connection_8h_source.html new file mode 100644 index 00000000..2d745a89 --- /dev/null +++ b/docs/ref/connection_8h_source.html @@ -0,0 +1,241 @@ + + + + + + +restclient-cpp: include/restclient-cpp/connection.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
connection.h
+
+
+Go to the documentation of this file.
1 
+
9 #ifndef INCLUDE_RESTCLIENT_CPP_CONNECTION_H_
+
10 #define INCLUDE_RESTCLIENT_CPP_CONNECTION_H_
+
11 
+
12 #include <curl/curl.h>
+
13 #include <string>
+
14 #include <map>
+
15 #include <cstdlib>
+
16 
+ +
18 #include "restclient-cpp/version.h"
+
19 
+
23 namespace RestClient {
+
24 
+
28 class Connection {
+
29  public:
+
60  typedef struct {
+
61  double totalTime;
+ +
63  double connectTime;
+ + + +
67  double redirectTime;
+ +
69  } RequestInfo;
+
93  typedef struct {
+
94  std::string baseUrl;
+ +
96  int timeout;
+ +
98  struct {
+
99  std::string username;
+
100  std::string password;
+
101  } basicAuth;
+
102  std::string customUserAgent;
+ +
104  } Info;
+
105 
+
106 
+
107  explicit Connection(const std::string baseUrl);
+
108  ~Connection();
+
109 
+
110  // Instance configuration methods
+
111  // configure basic auth
+
112  void SetBasicAuth(const std::string& username,
+
113  const std::string& password);
+
114 
+
115  // set connection timeout to seconds
+
116  void SetTimeout(int seconds);
+
117 
+
118  // set whether to follow redirects
+
119  void FollowRedirects(bool follow);
+
120 
+
121  // set custom user agent
+
122  // (this will result in the UA "foo/cool restclient-cpp/VERSION")
+
123  void SetUserAgent(const std::string& userAgent);
+
124 
+
125  // set the Certificate Authority (CA) Info which is the path to file holding
+
126  // certificates to be used to verify peers. See CURLOPT_CAINFO
+
127  void SetCAInfoFilePath(const std::string& caInfoFilePath);
+
128 
+
129  std::string GetUserAgent();
+
130 
+ +
132 
+
133  // set headers
+
134  void SetHeaders(RestClient::HeaderFields headers);
+
135 
+
136  // get headers
+ +
138 
+
139  // append additional headers
+
140  void AppendHeader(const std::string& key,
+
141  const std::string& value);
+
142 
+
143 
+
144  // Basic HTTP verb methods
+
145  RestClient::Response get(const std::string& uri);
+
146  RestClient::Response post(const std::string& uri,
+
147  const std::string& data);
+
148  RestClient::Response put(const std::string& uri,
+
149  const std::string& data);
+
150  RestClient::Response del(const std::string& uri);
+
151  RestClient::Response head(const std::string& uri);
+
152 
+
153  private:
+
154  CURL* curlHandle;
+
155  std::string baseUrl;
+
156  RestClient::HeaderFields headerFields;
+
157  int timeout;
+
158  bool followRedirects;
+
159  struct {
+
160  std::string username;
+
161  std::string password;
+
162  } basicAuth;
+
163  std::string customUserAgent;
+
164  std::string caInfoFilePath;
+
165  RequestInfo lastRequest;
+
166  RestClient::Response performCurlRequest(const std::string& uri);
+
167 };
+
168 }; // namespace RestClient
+
169 
+
170 #endif // INCLUDE_RESTCLIENT_CPP_CONNECTION_H_
+
This structure represents the HTTP response data.
Definition: restclient.h:38
+
RestClient::HeaderFields GetHeaders()
get all custom headers set on the connection
Definition: connection.cc:96
+
double totalTime
Definition: connection.h:61
+
double preTransferTime
Definition: connection.h:65
+
double redirectTime
Definition: connection.h:67
+
RestClient::Connection::Info GetInfo()
get diagnostic information about the connection object
Definition: connection.cc:52
+
libcurl wrapper for REST calls
+
void FollowRedirects(bool follow)
configure whether to follow redirects on this connection
Definition: connection.cc:106
+
holds some diagnostics information about a request
Definition: connection.h:60
+
int redirectCount
Definition: connection.h:68
+
holds some diagnostics information about the connection object it came from
Definition: connection.h:93
+
RestClient::HeaderFields headers
Definition: connection.h:95
+
void SetUserAgent(const std::string &userAgent)
set custom user agent for connection. This gets prepended to the default restclient-cpp/RESTCLIENT_VE...
Definition: connection.cc:118
+
std::string GetUserAgent()
get the user agent to add to the request
Definition: connection.cc:140
+
void SetHeaders(RestClient::HeaderFields headers)
set the custom headers map. This will replace the currently configured headers with the provided ones...
Definition: connection.cc:86
+
void SetCAInfoFilePath(const std::string &caInfoFilePath)
set custom Certificate Authority (CA) path
Definition: connection.cc:130
+
std::map< std::string, std::string > HeaderFields
Definition: restclient.h:27
+
RestClient::Response post(const std::string &uri, const std::string &data)
HTTP POST method.
Definition: connection.cc:303
+
void SetTimeout(int seconds)
set timeout for connection
Definition: connection.cc:155
+
void AppendHeader(const std::string &key, const std::string &value)
append a header to the internal map
Definition: connection.cc:73
+
RestClient::Response del(const std::string &uri)
HTTP DELETE method.
Definition: connection.cc:351
+
RestClient::Response put(const std::string &uri, const std::string &data)
HTTP PUT method.
Definition: connection.cc:322
+
RestClient::Response head(const std::string &uri)
HTTP HEAD method.
Definition: connection.cc:369
+
double startTransferTime
Definition: connection.h:66
+
Connection(const std::string baseUrl)
constructor for the Connection object
Definition: connection.cc:27
+
Connection object for advanced usage.
Definition: connection.h:28
+
bool followRedirects
Definition: connection.h:97
+
std::string customUserAgent
Definition: connection.h:102
+
std::string baseUrl
Definition: connection.h:94
+
double appConnectTime
Definition: connection.h:64
+
double connectTime
Definition: connection.h:63
+
double nameLookupTime
Definition: connection.h:62
+
RequestInfo lastRequest
Definition: connection.h:103
+
void SetBasicAuth(const std::string &username, const std::string &password)
set username and password for basic auth
Definition: connection.cc:167
+
int timeout
Definition: connection.h:96
+
namespace for all RestClient definitions
Definition: connection.h:23
+
+ + + + diff --git a/docs/ref/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html b/docs/ref/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html new file mode 100644 index 00000000..97aebb98 --- /dev/null +++ b/docs/ref/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html @@ -0,0 +1,106 @@ + + + + + + +restclient-cpp: source Directory Reference + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + +
+
+ + +
+ +
+ + +
+
+
+
source Directory Reference
+
+
+ + + + + + + + +

+Files

file  connection.cc
 
file  helpers.cc
 
file  restclient.cc
 
+
+ + + + diff --git a/docs/ref/dir_d44c64559bbebec7f509842c48db8b23.html b/docs/ref/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 00000000..e39027e7 --- /dev/null +++ b/docs/ref/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,102 @@ + + + + + + +restclient-cpp: include Directory Reference + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + +
+
+ + +
+ +
+ + +
+
+
+
include Directory Reference
+
+
+ + + + +

+Directories

directory  restclient-cpp
 
+
+ + + + diff --git a/docs/ref/dir_d7863d21b35bfd92001c24d3be435c80.html b/docs/ref/dir_d7863d21b35bfd92001c24d3be435c80.html new file mode 100644 index 00000000..79d10114 --- /dev/null +++ b/docs/ref/dir_d7863d21b35bfd92001c24d3be435c80.html @@ -0,0 +1,111 @@ + + + + + + +restclient-cpp: include/restclient-cpp Directory Reference + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + +
+
+ + +
+ +
+ + +
+
+
+
restclient-cpp Directory Reference
+
+
+ + + + + + + + + + + + + +

+Files

file  connection.h [code]
 header definitions for restclient-cpp connection class
 
file  helpers.h [code]
 header file for restclient-cpp helpers
 
file  restclient.h [code]
 libcurl wrapper for REST calls
 
file  version.h [code]
 
+
+ + + + diff --git a/docs/ref/doc.png b/docs/ref/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/docs/ref/doxygen.css b/docs/ref/doxygen.css new file mode 100644 index 00000000..a0008331 --- /dev/null +++ b/docs/ref/doxygen.css @@ -0,0 +1,1449 @@ +/* The standard CSS for doxygen 1.8.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #ffffff; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 4px 6px; + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: bold; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl +{ + padding: 0 0 0 10px; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ +dl.section +{ + margin-left: 0px; + padding-left: 0px; +} + +dl.note +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00D000; +} + +dl.deprecated +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #505050; +} + +dl.todo +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00C0E0; +} + +dl.test +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #3030E0; +} + +dl.bug +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 20px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + diff --git a/docs/ref/doxygen.png b/docs/ref/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff17d807fd8aa003bed8bb2a69e8f0909592fd1 GIT binary patch literal 3779 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 literal 0 HcmV?d00001 diff --git a/docs/ref/dynsections.js b/docs/ref/dynsections.js new file mode 100644 index 00000000..85e18369 --- /dev/null +++ b/docs/ref/dynsections.js @@ -0,0 +1,97 @@ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + +restclient-cpp: File List + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + +
+ +
+
+ + +
+ +
+ +
+
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
[detail level 123]
+ + + + + + + +
  include
  restclient-cpp
 connection.hHeader definitions for restclient-cpp connection class
 helpers.hHeader file for restclient-cpp helpers
 restclient.hLibcurl wrapper for REST calls
 version.h
 config.h
+
+
+ + + + diff --git a/docs/ref/folderclosed.png b/docs/ref/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/docs/ref/functions.html b/docs/ref/functions.html new file mode 100644 index 00000000..d387b819 --- /dev/null +++ b/docs/ref/functions.html @@ -0,0 +1,277 @@ + + + + + + +restclient-cpp: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- l -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+
+ + + + diff --git a/docs/ref/functions_func.html b/docs/ref/functions_func.html new file mode 100644 index 00000000..5d602dd8 --- /dev/null +++ b/docs/ref/functions_func.html @@ -0,0 +1,152 @@ + + + + + + +restclient-cpp: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/ref/functions_vars.html b/docs/ref/functions_vars.html new file mode 100644 index 00000000..be506ecd --- /dev/null +++ b/docs/ref/functions_vars.html @@ -0,0 +1,162 @@ + + + + + + +restclient-cpp: Class Members - Variables + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/docs/ref/helpers_8h.html b/docs/ref/helpers_8h.html new file mode 100644 index 00000000..92d0bf55 --- /dev/null +++ b/docs/ref/helpers_8h.html @@ -0,0 +1,147 @@ + + + + + + +restclient-cpp: include/restclient-cpp/helpers.h File Reference + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
helpers.h File Reference
+
+
+ +

header file for restclient-cpp helpers +More...

+
#include <string>
+#include <algorithm>
+#include <functional>
+#include "restclient-cpp/version.h"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

struct  RestClient::Helpers::UploadObject
 This structure represents the payload to upload on POST requests. More...
 
+ + + + + + + +

+Namespaces

 RestClient
 namespace for all RestClient definitions
 
 RestClient::Helpers
 : namespace for all helper functions
 
+ + + + + + + + + + +

+Functions

size_t RestClient::Helpers::write_callback (void *ptr, size_t size, size_t nmemb, void *userdata)
 write callback function for libcurl More...
 
size_t RestClient::Helpers::header_callback (void *ptr, size_t size, size_t nmemb, void *userdata)
 header callback for libcurl More...
 
size_t RestClient::Helpers::read_callback (void *ptr, size_t size, size_t nmemb, void *userdata)
 read callback function for libcurl More...
 
+

Detailed Description

+

header file for restclient-cpp helpers

+
Author
Daniel Schauenberg d@unw.nosp@m.ired.nosp@m.couch.nosp@m..com
+
Version
+
Date
2010-10-11
+
+ + + + diff --git a/docs/ref/helpers_8h_source.html b/docs/ref/helpers_8h_source.html new file mode 100644 index 00000000..6b3c9bc6 --- /dev/null +++ b/docs/ref/helpers_8h_source.html @@ -0,0 +1,161 @@ + + + + + + +restclient-cpp: include/restclient-cpp/helpers.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
helpers.h
+
+
+Go to the documentation of this file.
1 
+
9 #ifndef INCLUDE_RESTCLIENT_CPP_HELPERS_H_
+
10 #define INCLUDE_RESTCLIENT_CPP_HELPERS_H_
+
11 
+
12 #include <string>
+
13 #include <algorithm>
+
14 #include <functional>
+
15 
+
16 #include "restclient-cpp/version.h"
+
17 
+
21 namespace RestClient {
+
22 
+
26 namespace Helpers {
+
27 
+
36  typedef struct {
+
37  const char* data;
+
38  size_t length;
+
39  } UploadObject;
+
40 
+
41  // writedata callback function
+
42  size_t write_callback(void *ptr, size_t size, size_t nmemb,
+
43  void *userdata);
+
44 
+
45  // header callback function
+
46  size_t header_callback(void *ptr, size_t size, size_t nmemb,
+
47  void *userdata);
+
48  // read callback function
+
49  size_t read_callback(void *ptr, size_t size, size_t nmemb,
+
50  void *userdata);
+
51 
+
52  // trim from start
+
53  static inline std::string &ltrim(std::string &s) { // NOLINT
+
54  s.erase(s.begin(), std::find_if(s.begin(), s.end(),
+
55  std::not1(std::ptr_fun<int, int>(std::isspace))));
+
56  return s;
+
57  }
+
58 
+
59  // trim from end
+
60  static inline std::string &rtrim(std::string &s) { // NOLINT
+
61  s.erase(std::find_if(s.rbegin(), s.rend(),
+
62  std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
+
63  return s;
+
64  }
+
65 
+
66  // trim from both ends
+
67  static inline std::string &trim(std::string &s) { // NOLINT
+
68  return ltrim(rtrim(s));
+
69  }
+
70 }; // namespace Helpers
+
71 
+
72 }; // namespace RestClient
+
73 
+
74 #endif // INCLUDE_RESTCLIENT_CPP_HELPERS_H_
+
size_t header_callback(void *ptr, size_t size, size_t nmemb, void *userdata)
header callback for libcurl
Definition: helpers.cc:41
+
const char * data
Definition: helpers.h:37
+
size_t write_callback(void *ptr, size_t size, size_t nmemb, void *userdata)
write callback function for libcurl
Definition: helpers.cc:23
+
This structure represents the payload to upload on POST requests.
Definition: helpers.h:36
+
size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userdata)
read callback function for libcurl
Definition: helpers.cc:75
+
size_t length
Definition: helpers.h:38
+
namespace for all RestClient definitions
Definition: connection.h:23
+
+ + + + diff --git a/docs/ref/index.html b/docs/ref/index.html new file mode 100644 index 00000000..bea8a01e --- /dev/null +++ b/docs/ref/index.html @@ -0,0 +1,142 @@ + + + + + + +restclient-cpp: Main Page + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + +
+ +
+
+ + +
+ +
+ +
+
+
restclient-cpp Documentation
+
+
+

![Build Status](https://travis-ci.org/mrtazz/restclient-cpp.svg?branch=master) ![Coverage Status](https://coveralls.io/repos/mrtazz/restclient-cpp/badge.svg?branch=master&service=github) ![Packagecloud](https://img.shields.io/badge/packagecloud-available-brightgreen.svg) ![doxygen](https://img.shields.io/badge/doxygen-reference-blue.svg) ![MIT license](https://img.shields.io/badge/license-MIT-blue.svg)

+

About

+

This is a simple REST client for C++. It wraps libcurl for HTTP requests.

+

Usage

+

restclient-cpp provides two ways of interacting with REST endpoints. There is a simple one, which doesn't need you to configure an object to interact with an API. However the simple way doesn't provide a lot of configuration options either. So if you need more than just a simple HTTP call, you will probably want to check out the advanced usage.

+

Simple Usage

+

The simple API is just some static methods modeled after the most common HTTP verbs:

+

```cpp #include "restclient-cpp/restclient.h"

+

RestClient::Response r = RestClient::get("http://url.com") RestClient::Response r = RestClient::post("http://url.com/post", "text/json", "{\"foo": "bla"}") +RestClient::Response r = RestClient::put("http://url.com/put", "text/json", "{"foo": "bla"}") +RestClient::Response r = RestClient::del("http://url.com/delete") +RestClient::Response r = RestClient::head("http://url.com") ```

+

The response is of type RestClient::Response and has three attributes:

+

```cpp RestClient::Response.code // HTTP response code RestClient::Response.body // HTTP response body RestClient::Response.headers // HTTP response headers ```

+

Advanced Usage

+

However if you want more sophisticated features like connection reuse, timeouts or authentication, there is also a different, more configurable way.

+

```cpp #include "restclient-cpp/connection.h" #include "restclient-cpp/restclient.h"

+

// initialize RestClient RestClient::init();

+

// get a connection object RestClient::Connection* conn = new RestClient::Connection("http://url.com");

+

// configure basic auth conn->SetBasicAuth("WarMachine68", "WARMACHINEROX");

+

// set connection timeout to 5s conn->SetTimeout(5);

+

// set custom user agent // (this will result in the UA "foo/cool restclient-cpp/VERSION") conn->SetUserAgent("foo/cool");

+

// enable following of redirects (default is off) conn->FollowRedirects(true);

+

// set headers RestClient::HeaderFields headers; headers["Accept"] = "application/json"; conn->SetHeaders(headers)

+

// append additional headers conn->AppendHeader("X-MY-HEADER", "foo")

+

// if using a non-standard Certificate Authority (CA) trust file conn->SetCAInfoFilePath("/etc/custom-ca.crt")

+

RestClient::Response r = conn->get("/get") RestClient::Response r = conn->head("/get") RestClient::Response r = conn->del("/delete")

+

// set different content header for POST and PUT conn->AppendHeader("Content-Type", "text/json") RestClient::Response r = conn->post("/post", "{\"foo": "bla"}") +RestClient::Response r = conn->put("/put", "text/json", "{"foo": "bla"}")

+

// deinit RestClient. After calling this you have to call RestClient::init() // again before you can use it RestClient::disable(); ```

+

The responses are again of type RestClient::Response and have three attributes:

+

```cpp RestClient::Response.code // HTTP response code RestClient::Response.body // HTTP response body RestClient::Response.headers // HTTP response headers ```

+

The connection object also provides a simple way to get some diagnostics and metrics information via conn->GetInfo(). The result is a RestClient::Connection::Info struct and looks like this:

+

```cpp typedef struct { std::string base_url; RestClients::HeaderFields headers; int timeout; struct { std::string username; std::string password; } basicAuth; std::string customUserAgent; struct { // total time of the last request in seconds Total time of previous // transfer. See CURLINFO_TOTAL_TIME int totalTime; // time spent in DNS lookup in seconds Time from start until name // resolving completed. See CURLINFO_NAMELOOKUP_TIME int nameLookupTime; // time it took until Time from start until remote host or proxy // completed. See CURLINFO_CONNECT_TIME int connectTime; // Time from start until SSL/SSH handshake completed. See // CURLINFO_APPCONNECT_TIME int appConnectTime; // Time from start until just before the transfer begins. See // CURLINFO_PRETRANSFER_TIME int preTransferTime; // Time from start until just when the first byte is received. See // CURLINFO_STARTTRANSFER_TIME int startTransferTime; // Time taken for all redirect steps before the final transfer. See // CURLINFO_REDIRECT_TIME int redirectTime; // number of redirects followed. See CURLINFO_REDIRECT_COUNT int redirectCount; } lastRequest; } Info; ```

+

Persistent connections/Keep-Alive

+

The connection object stores the curl easy handle in an instance variable and uses that for the lifetime of the object. This means curl will automatically reuse connections made with that handle.

+

Thread Safety

+

restclient-cpp leans heavily on libcurl as it aims to provide a thin wrapper around it. This means it adheres to the basic level of thread safety provided by libcurl. The RestClient::init() and RestClient::disable() methods basically correspond to curl_global_init and curl_global_cleanup and thus need to be called right at the beginning of your program and before shutdown respectively. These set up the environment and are not thread-safe. After that you can create connection objects in your threads. Do not share connection objects across threads as this would mean accessing curl handles from multiple threads at the same time which is not allowed.

+

In order to provide an easy to use API, the simple usage via the static methods implicitly calls the curl global functions and is therefore also not thread-safe.

+

Dependencies

+ +

Installation

+

There are some packages available for Linux on packagecloud. And for OSX you can get it from the mrtazz/oss homebrew tap:

+

```bash brew tap mrtazz/oss brew install restclient-cpp ```

+

Otherwise you can do the regular autotools dance:

+

```bash ./autogen.sh ./configure make install ```

+

Contribute

+

All contributions are highly appreciated. This includes filing issues, updating documentation and writing code. Please take a look at the https://github.com/mrtazz/restclient-cpp/blob/master/CONTRIBUTING.md "contributing guidelines" before so your contribution can be merged as fast as possible.

+
+ + + + diff --git a/docs/ref/jquery.js b/docs/ref/jquery.js new file mode 100644 index 00000000..1f4d0b47 --- /dev/null +++ b/docs/ref/jquery.js @@ -0,0 +1,68 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
t
";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
","
"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*! + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*! + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*! + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$(' + + + +
+
+
Changelog
+
+
+

v0.4.4 (13th May 2016)

+
    +
  • bump version because v0.4.3 was mistagged
  • +
+

v0.4.3 (13th May 2016)

+
    +
  • only release packages from gcc builds (Daniel Schauenberg)
  • +
+

v0.4.2 (13th May 2016)

+
    +
  • add an ldconfig script to package builds (Daniel Schauenberg)
  • +
  • Add option to set the Certificate Authority (CA) Info option. (tgoetze)
  • +
  • add clang to the travis build matrix (Daniel Schauenberg)
  • +
  • README: Update Advanced Example (Marc Zych)
  • +
  • Connection: Initialize timeout and followRedirects (Marc Zych)
  • +
+

v0.4.1 (2nd February 2016)

+
    +
  • fix package build to include new header files from refactoring
  • +
+

v0.4.0 (2nd February 2016)

+

Features

+

This is a major backwards-incompatible API refactor please read carefully

+
    +
  • split out into a simple and an advanced API
      +
    • simple API via static methods
    • +
    • advanced usage via a connection object
    • +
    +
  • +
  • support for custom user agent strings
  • +
  • support for connection pooling and keep-alive
  • +
  • support for following redirects
  • +
  • support for getting request metrics from the Connection object
  • +
+

Improvements and fixes

+
    +
  • increased test coverage
  • +
  • addition of valgrind and lint runs on CI
  • +
  • fixed some memory leaks
  • +
  • improved documentation coverage
  • +
+

v0.3.0 (10th January 2016)

+

Features

+
    +
  • added support for connection timeouts (Islam Yasar)
  • +
  • Allow for setting additional HTTP headers (Karol Samborski)
  • +
+

Improvements and Bug fixes

+
    +
  • improve general documentation and add docs for auth (Daniel Schauenberg)
  • +
  • remove calls to curl_global_cleanup (Daniel Schauenberg)
  • +
  • add unit test for basic auth (Daniel Schauenberg)
  • +
  • switch unit tests to use [http://httpbin.org]() (Daniel Schauenberg)
  • +
  • move two include instructions (Jos)
  • +
  • added reporting for test coverage (Daniel Schauenberg)
  • +
  • cleanup version gen to be driven by git tags (Daniel Schauenberg)
  • +
  • clean up build and support building on FreeBSD (Daniel Schauenberg)
  • +
  • automate package deployment to packagecloud (Daniel Schauenberg)
  • +
  • add automatic doc build & deploy (Daniel Schauenberg)
  • +
  • Ensure the built shared library does not have dynamic references to libgtest (Thomas Goetze)
  • +
+

v0.2.0 (19th April 2015)

+
    +
  • support basic auth
  • +
  • Add header's to response object
  • +
  • fix memory leaks related to curl cleanup
  • +
  • add autotools build
  • +
  • add CONTRIBUTING.md
  • +
  • add vendorized gtest
  • +
+

v0.1.2 (22nd March 2011)

+
    +
  • return -1 for failed query instead of exit(1)
  • +
  • add unit tests for failed query returncode == -1
  • +
  • fix typos in README and add more sections
  • +
  • include cstring for memcpy
  • +
  • add cstdlib as include for proper dependencies
  • +
+

v0.1.1 (27th October 2010)

+
    +
  • bump version to v0.1.1
  • +
  • add target for static library
  • +
  • add target for dynamic library
  • +
  • ignore lib folder in gitignore
  • +
  • include meta.h from local include folder
  • +
  • update README
  • +
+

v0.1.0 (15th October 2010)

+
    +
  • initial release
  • +
  • support basic HTTP verbs (GET, POST, PUT, DELETE)
  • +
+
+ + + + diff --git a/docs/ref/md__c_o_n_t_r_i_b_u_t_i_n_g.html b/docs/ref/md__c_o_n_t_r_i_b_u_t_i_n_g.html new file mode 100644 index 00000000..c6e6757f --- /dev/null +++ b/docs/ref/md__c_o_n_t_r_i_b_u_t_i_n_g.html @@ -0,0 +1,106 @@ + + + + + + +restclient-cpp: Contribute + + + + + + + + + + +
+
+
+ + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
Contribute
+
+
+
    +
  • Fork the project.
  • +
  • Make your feature addition or bug fix.
  • +
  • Add tests for it. This is important so I don't break it in a future version unintentionally.
  • +
  • Commit, do not mess with version
  • +
  • If you add functionality, document it in the README
  • +
  • Send me a pull request. Bonus points for topic branches.
  • +
+

How to run tests

+
    +
  1. build vendorized gtest: ./utils/build_gtest.sh
  2. +
  3. build restclient-cpp: ./autogen.sh && ./configure && make check
  4. +
  5. run the unit test suite: make test
  6. +
+
+ + + + diff --git a/docs/ref/namespace_rest_client.html b/docs/ref/namespace_rest_client.html new file mode 100644 index 00000000..548a6d78 --- /dev/null +++ b/docs/ref/namespace_rest_client.html @@ -0,0 +1,332 @@ + + + + + + +restclient-cpp: RestClient Namespace Reference + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
RestClient Namespace Reference
+
+
+ +

namespace for all RestClient definitions +More...

+ + + + + +

+Namespaces

 Helpers
 : namespace for all helper functions
 
+ + + + + + + +

+Classes

class  Connection
 Connection object for advanced usage. More...
 
struct  Response
 This structure represents the HTTP response data. More...
 
+ + + +

+Typedefs

typedef std::map< std::string, std::string > HeaderFields
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Functions

+int init ()
 global init function. Call this before you start any threads.
 
+void disable ()
 global disable function. Call this before you terminate your program.
 
Response get (const std::string &url)
 HTTP GET method. More...
 
Response post (const std::string &url, const std::string &content_type, const std::string &data)
 HTTP POST method. More...
 
Response put (const std::string &url, const std::string &content_type, const std::string &data)
 HTTP PUT method. More...
 
Response del (const std::string &url)
 HTTP DELETE method. More...
 
Response head (const std::string &url)
 HTTP HEAD method. More...
 
+

Detailed Description

+

namespace for all RestClient definitions

+

Typedef Documentation

+ +
+
+ + + + +
typedef std::map<std::string, std::string> RestClient::HeaderFields
+
+

public data definitions

+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + +
RestClient::Response RestClient::del (const std::string & url)
+
+ +

HTTP DELETE method.

+
Parameters
+ + +
urlto query
+
+
+
Returns
response struct
+ +
+
+ +
+
+ + + + + + + + +
RestClient::Response RestClient::get (const std::string & url)
+
+ +

HTTP GET method.

+

public methods for the simple API. These don't allow a lot of configuration but are meant for simple HTTP calls.

+
Parameters
+ + +
urlto query
+
+
+
Returns
response struct
+ +
+
+ +
+
+ + + + + + + + +
RestClient::Response RestClient::head (const std::string & url)
+
+ +

HTTP HEAD method.

+
Parameters
+ + +
urlto query
+
+
+
Returns
response struct
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
RestClient::Response RestClient::post (const std::string & url,
const std::string & ctype,
const std::string & data 
)
+
+ +

HTTP POST method.

+
Parameters
+ + + + +
urlto query
ctypecontent type as string
dataHTTP POST body
+
+
+
Returns
response struct
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
RestClient::Response RestClient::put (const std::string & url,
const std::string & ctype,
const std::string & data 
)
+
+ +

HTTP PUT method.

+
Parameters
+ + + + +
urlto query
ctypecontent type as string
dataHTTP PUT body
+
+
+
Returns
response struct
+ +
+
+
+ + + + diff --git a/docs/ref/namespace_rest_client_1_1_helpers.html b/docs/ref/namespace_rest_client_1_1_helpers.html new file mode 100644 index 00000000..55082211 --- /dev/null +++ b/docs/ref/namespace_rest_client_1_1_helpers.html @@ -0,0 +1,285 @@ + + + + + + +restclient-cpp: RestClient::Helpers Namespace Reference + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RestClient::Helpers Namespace Reference
+
+
+ +

: namespace for all helper functions +More...

+ + + + + +

+Classes

struct  UploadObject
 This structure represents the payload to upload on POST requests. More...
 
+ + + + + + + + + + +

+Functions

size_t write_callback (void *ptr, size_t size, size_t nmemb, void *userdata)
 write callback function for libcurl More...
 
size_t header_callback (void *ptr, size_t size, size_t nmemb, void *userdata)
 header callback for libcurl More...
 
size_t read_callback (void *ptr, size_t size, size_t nmemb, void *userdata)
 read callback function for libcurl More...
 
+

Detailed Description

+

: namespace for all helper functions

+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
size_t RestClient::Helpers::header_callback (void * data,
size_t size,
size_t nmemb,
void * userdata 
)
+
+ +

header callback for libcurl

+
Parameters
+ + + + + +
datareturned (header line)
sizeof data
nmembmemblock
userdatapointer to user data object to save headr data
+
+
+
Returns
size * nmemb;
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
size_t RestClient::Helpers::read_callback (void * data,
size_t size,
size_t nmemb,
void * userdata 
)
+
+ +

read callback function for libcurl

+
Parameters
+ + + + + +
datapointer of max size (size*nmemb) to write data to
sizesize parameter
nmembmemblock parameter
userdatapointer to user data to read data from
+
+
+
Returns
(size * nmemb)
+

get upload struct

+

set correct sizes

+

copy data to buffer

+

decrement length and increment data pointer

+

return copied size

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
size_t RestClient::Helpers::write_callback (void * data,
size_t size,
size_t nmemb,
void * userdata 
)
+
+ +

write callback function for libcurl

+
Parameters
+ + + + + +
datareturned data of size (size*nmemb)
sizesize parameter
nmembmemblock parameter
userdatapointer to user data to save/work with return data
+
+
+
Returns
(size * nmemb)
+ +
+
+
+ + + + diff --git a/docs/ref/namespacemembers.html b/docs/ref/namespacemembers.html new file mode 100644 index 00000000..9f04d6a4 --- /dev/null +++ b/docs/ref/namespacemembers.html @@ -0,0 +1,136 @@ + + + + + + +restclient-cpp: Namespace Members + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented namespace members with links to the namespaces they belong to:
+
+ + + + diff --git a/docs/ref/namespacemembers_func.html b/docs/ref/namespacemembers_func.html new file mode 100644 index 00000000..e5dd393d --- /dev/null +++ b/docs/ref/namespacemembers_func.html @@ -0,0 +1,133 @@ + + + + + + +restclient-cpp: Namespace Members + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/ref/namespacemembers_type.html b/docs/ref/namespacemembers_type.html new file mode 100644 index 00000000..8b06b1e6 --- /dev/null +++ b/docs/ref/namespacemembers_type.html @@ -0,0 +1,106 @@ + + + + + + +restclient-cpp: Namespace Members + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/ref/namespaces.html b/docs/ref/namespaces.html new file mode 100644 index 00000000..c4f6792d --- /dev/null +++ b/docs/ref/namespaces.html @@ -0,0 +1,104 @@ + + + + + + +restclient-cpp: Namespace List + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Namespace List
+
+
+
Here is a list of all documented namespaces with brief descriptions:
+
[detail level 12]
+ + +
 NRestClientNamespace for all RestClient definitions
 NHelpers: namespace for all helper functions
+
+
+ + + + diff --git a/docs/ref/nav_f.png b/docs/ref/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/docs/ref/nav_g.png b/docs/ref/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + +restclient-cpp: Related Pages + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + +
+ +
+
+ + +
+ +
+ +
+
+
Related Pages
+
+
+
Here is a list of all related documentation pages:
+ + + +
 Changelog
 Contribute
+
+
+ + + + diff --git a/docs/ref/restclient_8h.html b/docs/ref/restclient_8h.html new file mode 100644 index 00000000..015cac9b --- /dev/null +++ b/docs/ref/restclient_8h.html @@ -0,0 +1,165 @@ + + + + + + +restclient-cpp: include/restclient-cpp/restclient.h File Reference + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
restclient.h File Reference
+
+
+ +

libcurl wrapper for REST calls +More...

+
#include <curl/curl.h>
+#include <string>
+#include <map>
+#include <cstdlib>
+#include "restclient-cpp/version.h"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

struct  RestClient::Response
 This structure represents the HTTP response data. More...
 
+ + + + +

+Namespaces

 RestClient
 namespace for all RestClient definitions
 
+ + + +

+Typedefs

typedef std::map< std::string, std::string > RestClient::HeaderFields
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Functions

+int RestClient::init ()
 global init function. Call this before you start any threads.
 
+void RestClient::disable ()
 global disable function. Call this before you terminate your program.
 
Response RestClient::get (const std::string &url)
 HTTP GET method. More...
 
Response RestClient::post (const std::string &url, const std::string &content_type, const std::string &data)
 HTTP POST method. More...
 
Response RestClient::put (const std::string &url, const std::string &content_type, const std::string &data)
 HTTP PUT method. More...
 
Response RestClient::del (const std::string &url)
 HTTP DELETE method. More...
 
Response RestClient::head (const std::string &url)
 HTTP HEAD method. More...
 
+

Detailed Description

+

libcurl wrapper for REST calls

+
Author
Daniel Schauenberg d@unw.nosp@m.ired.nosp@m.couch.nosp@m..com
+
Version
+
Date
2010-10-11
+
+ + + + diff --git a/docs/ref/restclient_8h_source.html b/docs/ref/restclient_8h_source.html new file mode 100644 index 00000000..ede253f3 --- /dev/null +++ b/docs/ref/restclient_8h_source.html @@ -0,0 +1,151 @@ + + + + + + +restclient-cpp: include/restclient-cpp/restclient.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
restclient.h
+
+
+Go to the documentation of this file.
1 
+
9 #ifndef INCLUDE_RESTCLIENT_CPP_RESTCLIENT_H_
+
10 #define INCLUDE_RESTCLIENT_CPP_RESTCLIENT_H_
+
11 
+
12 #include <curl/curl.h>
+
13 #include <string>
+
14 #include <map>
+
15 #include <cstdlib>
+
16 
+
17 #include "restclient-cpp/version.h"
+
18 
+
22 namespace RestClient {
+
23 
+
27 typedef std::map<std::string, std::string> HeaderFields;
+
28 
+
38 typedef struct {
+
39  int code;
+
40  std::string body;
+
41  HeaderFields headers;
+
42 } Response;
+
43 
+
44 // init and disable functions
+
45 int init();
+
46 void disable();
+
47 
+
53 Response get(const std::string& url);
+
54 Response post(const std::string& url,
+
55  const std::string& content_type,
+
56  const std::string& data);
+
57 Response put(const std::string& url,
+
58  const std::string& content_type,
+
59  const std::string& data);
+
60 Response del(const std::string& url);
+
61 Response head(const std::string& url);
+
62 
+
63 } // namespace RestClient
+
64 
+
65 #endif // INCLUDE_RESTCLIENT_CPP_RESTCLIENT_H_
+
HeaderFields headers
Definition: restclient.h:41
+
int code
Definition: restclient.h:39
+
This structure represents the HTTP response data.
Definition: restclient.h:38
+
std::map< std::string, std::string > HeaderFields
Definition: restclient.h:27
+
void disable()
global disable function. Call this before you terminate your program.
Definition: restclient.cc:37
+
Response head(const std::string &url)
HTTP HEAD method.
Definition: restclient.cc:118
+
Response del(const std::string &url)
HTTP DELETE method.
Definition: restclient.cc:103
+
Response put(const std::string &url, const std::string &content_type, const std::string &data)
HTTP PUT method.
Definition: restclient.cc:85
+
Response post(const std::string &url, const std::string &content_type, const std::string &data)
HTTP POST method.
Definition: restclient.cc:65
+
int init()
global init function. Call this before you start any threads.
Definition: restclient.cc:24
+
std::string body
Definition: restclient.h:40
+
namespace for all RestClient definitions
Definition: connection.h:23
+
+ + + + diff --git a/docs/ref/search/all_0.html b/docs/ref/search/all_0.html new file mode 100644 index 00000000..c491fd8f --- /dev/null +++ b/docs/ref/search/all_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_0.js b/docs/ref/search/all_0.js new file mode 100644 index 00000000..eafb95cb --- /dev/null +++ b/docs/ref/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['appconnecttime',['appConnectTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#a05d4f74f97a3e02cb9bbe3a6039135bc',1,'RestClient::Connection::RequestInfo']]], + ['appendheader',['AppendHeader',['../class_rest_client_1_1_connection.html#a60fd7521bfb4f604e6c7cdd278f038b3',1,'RestClient::Connection']]] +]; diff --git a/docs/ref/search/all_1.html b/docs/ref/search/all_1.html new file mode 100644 index 00000000..89fd5f83 --- /dev/null +++ b/docs/ref/search/all_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_1.js b/docs/ref/search/all_1.js new file mode 100644 index 00000000..885da35c --- /dev/null +++ b/docs/ref/search/all_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['baseurl',['baseUrl',['../struct_rest_client_1_1_connection_1_1_info.html#ae908949ed901ed0883da20efad56cf67',1,'RestClient::Connection::Info']]], + ['basicauth',['basicAuth',['../struct_rest_client_1_1_connection_1_1_info.html#ac659be6ed4f5f699ca7609b1e0f6863d',1,'RestClient::Connection::Info']]], + ['body',['body',['../struct_rest_client_1_1_response.html#a87ba6d5e5ae9ae7d628d5ed34b36cc95',1,'RestClient::Response']]] +]; diff --git a/docs/ref/search/all_2.html b/docs/ref/search/all_2.html new file mode 100644 index 00000000..2c23ed46 --- /dev/null +++ b/docs/ref/search/all_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_2.js b/docs/ref/search/all_2.js new file mode 100644 index 00000000..228e6700 --- /dev/null +++ b/docs/ref/search/all_2.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['code',['code',['../struct_rest_client_1_1_response.html#a3b3b63aeae7ca761d54a009ee329ea28',1,'RestClient::Response']]], + ['connection',['Connection',['../class_rest_client_1_1_connection.html#a42f991cc28f62deb120b96a50534884e',1,'RestClient::Connection']]], + ['connection',['Connection',['../class_rest_client_1_1_connection.html',1,'RestClient']]], + ['connection_2eh',['connection.h',['../connection_8h.html',1,'']]], + ['connecttime',['connectTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#a7c8347cc41e35a944663d333baea88a9',1,'RestClient::Connection::RequestInfo']]], + ['customuseragent',['customUserAgent',['../struct_rest_client_1_1_connection_1_1_info.html#a8cec6f505e26773638ea7c2df895b5e8',1,'RestClient::Connection::Info']]], + ['changelog',['Changelog',['../md__c_h_a_n_g_e_l_o_g.html',1,'']]], + ['contribute',['Contribute',['../md__c_o_n_t_r_i_b_u_t_i_n_g.html',1,'']]] +]; diff --git a/docs/ref/search/all_3.html b/docs/ref/search/all_3.html new file mode 100644 index 00000000..7ddb0cfb --- /dev/null +++ b/docs/ref/search/all_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_3.js b/docs/ref/search/all_3.js new file mode 100644 index 00000000..312c6d1c --- /dev/null +++ b/docs/ref/search/all_3.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['data',['data',['../struct_rest_client_1_1_helpers_1_1_upload_object.html#a0f0bebacc6bb930899ee9babadb92a31',1,'RestClient::Helpers::UploadObject']]], + ['del',['del',['../class_rest_client_1_1_connection.html#a4a14035f66375a7291f9d16d87db41f2',1,'RestClient::Connection::del()'],['../namespace_rest_client.html#a52975c3a96fe5f90b40adc74faae8f94',1,'RestClient::del()']]], + ['disable',['disable',['../namespace_rest_client.html#aa4dc1337561e6622b013d22639d3d26c',1,'RestClient']]] +]; diff --git a/docs/ref/search/all_4.html b/docs/ref/search/all_4.html new file mode 100644 index 00000000..eab9eb1b --- /dev/null +++ b/docs/ref/search/all_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_4.js b/docs/ref/search/all_4.js new file mode 100644 index 00000000..1945e234 --- /dev/null +++ b/docs/ref/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['followredirects',['followRedirects',['../struct_rest_client_1_1_connection_1_1_info.html#a4b194ea487bf48f55e597b3146bc0c9b',1,'RestClient::Connection::Info::followRedirects()'],['../class_rest_client_1_1_connection.html#a77c9d405950492f9bcec21ce79edd2b3',1,'RestClient::Connection::FollowRedirects()']]] +]; diff --git a/docs/ref/search/all_5.html b/docs/ref/search/all_5.html new file mode 100644 index 00000000..4dfd1d50 --- /dev/null +++ b/docs/ref/search/all_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_5.js b/docs/ref/search/all_5.js new file mode 100644 index 00000000..29443667 --- /dev/null +++ b/docs/ref/search/all_5.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['get',['get',['../class_rest_client_1_1_connection.html#ad52e3500f995cb681b5f3d7f83d36418',1,'RestClient::Connection::get()'],['../namespace_rest_client.html#a4b542b597eb854401c02520af258006f',1,'RestClient::get()']]], + ['getheaders',['GetHeaders',['../class_rest_client_1_1_connection.html#afa869b17f4fb6387c057bfb9fcbd0bbf',1,'RestClient::Connection']]], + ['getinfo',['GetInfo',['../class_rest_client_1_1_connection.html#ac489a801edc621a384cdfb29e7071231',1,'RestClient::Connection']]], + ['getuseragent',['GetUserAgent',['../class_rest_client_1_1_connection.html#aa4353eb1df932b254aa02446f4ac3b32',1,'RestClient::Connection']]] +]; diff --git a/docs/ref/search/all_6.html b/docs/ref/search/all_6.html new file mode 100644 index 00000000..b98d7310 --- /dev/null +++ b/docs/ref/search/all_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_6.js b/docs/ref/search/all_6.js new file mode 100644 index 00000000..c3aa5aa9 --- /dev/null +++ b/docs/ref/search/all_6.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['head',['head',['../class_rest_client_1_1_connection.html#a64f085227c8c4d47dc6c84fea4f71398',1,'RestClient::Connection::head()'],['../namespace_rest_client.html#a99dee400dfdab150b9fdce2ab6a0c2dc',1,'RestClient::head()']]], + ['header_5fcallback',['header_callback',['../namespace_rest_client_1_1_helpers.html#a464be55c71cef59eebb53d922956a4d1',1,'RestClient::Helpers']]], + ['headerfields',['HeaderFields',['../namespace_rest_client.html#ab2bbc7fd5ec10171e4e1fb2d7fc8e865',1,'RestClient']]], + ['headers',['headers',['../struct_rest_client_1_1_connection_1_1_info.html#a8e9c9ad0c74a6e6f5c73ced7306464d1',1,'RestClient::Connection::Info::headers()'],['../struct_rest_client_1_1_response.html#a2141b4d9929e0df26d918dfba8451496',1,'RestClient::Response::headers()']]], + ['helpers_2eh',['helpers.h',['../helpers_8h.html',1,'']]] +]; diff --git a/docs/ref/search/all_7.html b/docs/ref/search/all_7.html new file mode 100644 index 00000000..ef202229 --- /dev/null +++ b/docs/ref/search/all_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_7.js b/docs/ref/search/all_7.js new file mode 100644 index 00000000..2af06994 --- /dev/null +++ b/docs/ref/search/all_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['info',['Info',['../struct_rest_client_1_1_connection_1_1_info.html',1,'RestClient::Connection']]], + ['init',['init',['../namespace_rest_client.html#a38395626a68f2dc66e2acf5b01f5b70b',1,'RestClient']]] +]; diff --git a/docs/ref/search/all_8.html b/docs/ref/search/all_8.html new file mode 100644 index 00000000..12e5aff1 --- /dev/null +++ b/docs/ref/search/all_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_8.js b/docs/ref/search/all_8.js new file mode 100644 index 00000000..359ed049 --- /dev/null +++ b/docs/ref/search/all_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['lastrequest',['lastRequest',['../struct_rest_client_1_1_connection_1_1_info.html#ac9393ffec292dc9ef1f9378bf0df5f31',1,'RestClient::Connection::Info']]], + ['length',['length',['../struct_rest_client_1_1_helpers_1_1_upload_object.html#a8cfb479c87d4870a7e54e62dc0a3d3f6',1,'RestClient::Helpers::UploadObject']]] +]; diff --git a/docs/ref/search/all_9.html b/docs/ref/search/all_9.html new file mode 100644 index 00000000..7e100075 --- /dev/null +++ b/docs/ref/search/all_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_9.js b/docs/ref/search/all_9.js new file mode 100644 index 00000000..8bbc8dc8 --- /dev/null +++ b/docs/ref/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['namelookuptime',['nameLookupTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#a73d3bab1fd832feb912f1e20656b185d',1,'RestClient::Connection::RequestInfo']]] +]; diff --git a/docs/ref/search/all_a.html b/docs/ref/search/all_a.html new file mode 100644 index 00000000..95b4c8fc --- /dev/null +++ b/docs/ref/search/all_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_a.js b/docs/ref/search/all_a.js new file mode 100644 index 00000000..5a9fb554 --- /dev/null +++ b/docs/ref/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['post',['post',['../class_rest_client_1_1_connection.html#a76b11e6e01fb84cafdacf99e49aae6a7',1,'RestClient::Connection::post()'],['../namespace_rest_client.html#a7de7aa2d333b6e7c5f2c2726d4e5485e',1,'RestClient::post()']]], + ['pretransfertime',['preTransferTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#abcccb563d60a3f5325918ef912130e16',1,'RestClient::Connection::RequestInfo']]], + ['put',['put',['../class_rest_client_1_1_connection.html#af1a30c5aa6a646e6bad4caf2abb7084c',1,'RestClient::Connection::put()'],['../namespace_rest_client.html#ac180f6320d47cad592399378f8c45f7a',1,'RestClient::put()']]] +]; diff --git a/docs/ref/search/all_b.html b/docs/ref/search/all_b.html new file mode 100644 index 00000000..1f1beb55 --- /dev/null +++ b/docs/ref/search/all_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_b.js b/docs/ref/search/all_b.js new file mode 100644 index 00000000..b7c1d162 --- /dev/null +++ b/docs/ref/search/all_b.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['helpers',['Helpers',['../namespace_rest_client_1_1_helpers.html',1,'RestClient']]], + ['read_5fcallback',['read_callback',['../namespace_rest_client_1_1_helpers.html#a1209e4977d76d9be7d8b40328bcb464d',1,'RestClient::Helpers']]], + ['redirectcount',['redirectCount',['../struct_rest_client_1_1_connection_1_1_request_info.html#ab0240290fa51b11468936199ff0c248f',1,'RestClient::Connection::RequestInfo']]], + ['redirecttime',['redirectTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#af219b63ad58cb52748ba7afd5b2290aa',1,'RestClient::Connection::RequestInfo']]], + ['requestinfo',['RequestInfo',['../struct_rest_client_1_1_connection_1_1_request_info.html',1,'RestClient::Connection']]], + ['response',['Response',['../struct_rest_client_1_1_response.html',1,'RestClient']]], + ['restclient',['RestClient',['../namespace_rest_client.html',1,'']]], + ['restclient_2eh',['restclient.h',['../restclient_8h.html',1,'']]] +]; diff --git a/docs/ref/search/all_c.html b/docs/ref/search/all_c.html new file mode 100644 index 00000000..ec9a0c84 --- /dev/null +++ b/docs/ref/search/all_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_c.js b/docs/ref/search/all_c.js new file mode 100644 index 00000000..8064dad1 --- /dev/null +++ b/docs/ref/search/all_c.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['setbasicauth',['SetBasicAuth',['../class_rest_client_1_1_connection.html#a9fdc2ee1b3b2cc2cca1f9fd29e6fd73f',1,'RestClient::Connection']]], + ['setcainfofilepath',['SetCAInfoFilePath',['../class_rest_client_1_1_connection.html#afd74a344a00b58fc6997e34c37dde834',1,'RestClient::Connection']]], + ['setheaders',['SetHeaders',['../class_rest_client_1_1_connection.html#a6af41bf467a80deb83f20044f2c17344',1,'RestClient::Connection']]], + ['settimeout',['SetTimeout',['../class_rest_client_1_1_connection.html#ad7b6f92f59861b4c8dc914d4d226d89d',1,'RestClient::Connection']]], + ['setuseragent',['SetUserAgent',['../class_rest_client_1_1_connection.html#a3e510fdf8291e9e277df72b0fae0a111',1,'RestClient::Connection']]], + ['starttransfertime',['startTransferTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#a022ad817c51c37e781d3ef6590b47d96',1,'RestClient::Connection::RequestInfo']]] +]; diff --git a/docs/ref/search/all_d.html b/docs/ref/search/all_d.html new file mode 100644 index 00000000..654d1988 --- /dev/null +++ b/docs/ref/search/all_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_d.js b/docs/ref/search/all_d.js new file mode 100644 index 00000000..8483af7b --- /dev/null +++ b/docs/ref/search/all_d.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['timeout',['timeout',['../struct_rest_client_1_1_connection_1_1_info.html#a0a63e442ce474e50017fcbae563c4a7c',1,'RestClient::Connection::Info']]], + ['totaltime',['totalTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#a5febf41f2662384129b874e195e1c01e',1,'RestClient::Connection::RequestInfo']]] +]; diff --git a/docs/ref/search/all_e.html b/docs/ref/search/all_e.html new file mode 100644 index 00000000..812aced8 --- /dev/null +++ b/docs/ref/search/all_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_e.js b/docs/ref/search/all_e.js new file mode 100644 index 00000000..81fcdd5a --- /dev/null +++ b/docs/ref/search/all_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['uploadobject',['UploadObject',['../struct_rest_client_1_1_helpers_1_1_upload_object.html',1,'RestClient::Helpers']]] +]; diff --git a/docs/ref/search/all_f.html b/docs/ref/search/all_f.html new file mode 100644 index 00000000..c395a474 --- /dev/null +++ b/docs/ref/search/all_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/all_f.js b/docs/ref/search/all_f.js new file mode 100644 index 00000000..3fbfbab8 --- /dev/null +++ b/docs/ref/search/all_f.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['write_5fcallback',['write_callback',['../namespace_rest_client_1_1_helpers.html#a1dfc03258041ee29084ef9cf566ab836',1,'RestClient::Helpers']]] +]; diff --git a/docs/ref/search/classes_0.html b/docs/ref/search/classes_0.html new file mode 100644 index 00000000..8888fa80 --- /dev/null +++ b/docs/ref/search/classes_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/classes_0.js b/docs/ref/search/classes_0.js new file mode 100644 index 00000000..e4adc525 --- /dev/null +++ b/docs/ref/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection',['Connection',['../class_rest_client_1_1_connection.html',1,'RestClient']]] +]; diff --git a/docs/ref/search/classes_1.html b/docs/ref/search/classes_1.html new file mode 100644 index 00000000..a402bbef --- /dev/null +++ b/docs/ref/search/classes_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/classes_1.js b/docs/ref/search/classes_1.js new file mode 100644 index 00000000..1d2d2c98 --- /dev/null +++ b/docs/ref/search/classes_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['info',['Info',['../struct_rest_client_1_1_connection_1_1_info.html',1,'RestClient::Connection']]] +]; diff --git a/docs/ref/search/classes_2.html b/docs/ref/search/classes_2.html new file mode 100644 index 00000000..003214bb --- /dev/null +++ b/docs/ref/search/classes_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/classes_2.js b/docs/ref/search/classes_2.js new file mode 100644 index 00000000..a2dd4c85 --- /dev/null +++ b/docs/ref/search/classes_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['requestinfo',['RequestInfo',['../struct_rest_client_1_1_connection_1_1_request_info.html',1,'RestClient::Connection']]], + ['response',['Response',['../struct_rest_client_1_1_response.html',1,'RestClient']]] +]; diff --git a/docs/ref/search/classes_3.html b/docs/ref/search/classes_3.html new file mode 100644 index 00000000..fadcfc83 --- /dev/null +++ b/docs/ref/search/classes_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/classes_3.js b/docs/ref/search/classes_3.js new file mode 100644 index 00000000..81fcdd5a --- /dev/null +++ b/docs/ref/search/classes_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['uploadobject',['UploadObject',['../struct_rest_client_1_1_helpers_1_1_upload_object.html',1,'RestClient::Helpers']]] +]; diff --git a/docs/ref/search/close.png b/docs/ref/search/close.png new file mode 100644 index 0000000000000000000000000000000000000000..9342d3dfeea7b7c4ee610987e717804b5a42ceb9 GIT binary patch literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN literal 0 HcmV?d00001 diff --git a/docs/ref/search/files_0.html b/docs/ref/search/files_0.html new file mode 100644 index 00000000..04578537 --- /dev/null +++ b/docs/ref/search/files_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/files_0.js b/docs/ref/search/files_0.js new file mode 100644 index 00000000..52426caf --- /dev/null +++ b/docs/ref/search/files_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_2eh',['connection.h',['../connection_8h.html',1,'']]] +]; diff --git a/docs/ref/search/files_1.html b/docs/ref/search/files_1.html new file mode 100644 index 00000000..ce0a3a7a --- /dev/null +++ b/docs/ref/search/files_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/files_1.js b/docs/ref/search/files_1.js new file mode 100644 index 00000000..d9d90b08 --- /dev/null +++ b/docs/ref/search/files_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['helpers_2eh',['helpers.h',['../helpers_8h.html',1,'']]] +]; diff --git a/docs/ref/search/files_2.html b/docs/ref/search/files_2.html new file mode 100644 index 00000000..d188d98a --- /dev/null +++ b/docs/ref/search/files_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/files_2.js b/docs/ref/search/files_2.js new file mode 100644 index 00000000..df1528b1 --- /dev/null +++ b/docs/ref/search/files_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['restclient_2eh',['restclient.h',['../restclient_8h.html',1,'']]] +]; diff --git a/docs/ref/search/functions_0.html b/docs/ref/search/functions_0.html new file mode 100644 index 00000000..88c8a268 --- /dev/null +++ b/docs/ref/search/functions_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/functions_0.js b/docs/ref/search/functions_0.js new file mode 100644 index 00000000..2eb7fbbf --- /dev/null +++ b/docs/ref/search/functions_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['appendheader',['AppendHeader',['../class_rest_client_1_1_connection.html#a60fd7521bfb4f604e6c7cdd278f038b3',1,'RestClient::Connection']]] +]; diff --git a/docs/ref/search/functions_1.html b/docs/ref/search/functions_1.html new file mode 100644 index 00000000..215c1bf6 --- /dev/null +++ b/docs/ref/search/functions_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/functions_1.js b/docs/ref/search/functions_1.js new file mode 100644 index 00000000..f6dde7a9 --- /dev/null +++ b/docs/ref/search/functions_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection',['Connection',['../class_rest_client_1_1_connection.html#a42f991cc28f62deb120b96a50534884e',1,'RestClient::Connection']]] +]; diff --git a/docs/ref/search/functions_2.html b/docs/ref/search/functions_2.html new file mode 100644 index 00000000..f17abffc --- /dev/null +++ b/docs/ref/search/functions_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/functions_2.js b/docs/ref/search/functions_2.js new file mode 100644 index 00000000..1b8322a8 --- /dev/null +++ b/docs/ref/search/functions_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['del',['del',['../class_rest_client_1_1_connection.html#a4a14035f66375a7291f9d16d87db41f2',1,'RestClient::Connection::del()'],['../namespace_rest_client.html#a52975c3a96fe5f90b40adc74faae8f94',1,'RestClient::del()']]], + ['disable',['disable',['../namespace_rest_client.html#aa4dc1337561e6622b013d22639d3d26c',1,'RestClient']]] +]; diff --git a/docs/ref/search/functions_3.html b/docs/ref/search/functions_3.html new file mode 100644 index 00000000..8a4bbe14 --- /dev/null +++ b/docs/ref/search/functions_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/functions_3.js b/docs/ref/search/functions_3.js new file mode 100644 index 00000000..7ebfe6ca --- /dev/null +++ b/docs/ref/search/functions_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['followredirects',['FollowRedirects',['../class_rest_client_1_1_connection.html#a77c9d405950492f9bcec21ce79edd2b3',1,'RestClient::Connection']]] +]; diff --git a/docs/ref/search/functions_4.html b/docs/ref/search/functions_4.html new file mode 100644 index 00000000..cce7ce90 --- /dev/null +++ b/docs/ref/search/functions_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/functions_4.js b/docs/ref/search/functions_4.js new file mode 100644 index 00000000..29443667 --- /dev/null +++ b/docs/ref/search/functions_4.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['get',['get',['../class_rest_client_1_1_connection.html#ad52e3500f995cb681b5f3d7f83d36418',1,'RestClient::Connection::get()'],['../namespace_rest_client.html#a4b542b597eb854401c02520af258006f',1,'RestClient::get()']]], + ['getheaders',['GetHeaders',['../class_rest_client_1_1_connection.html#afa869b17f4fb6387c057bfb9fcbd0bbf',1,'RestClient::Connection']]], + ['getinfo',['GetInfo',['../class_rest_client_1_1_connection.html#ac489a801edc621a384cdfb29e7071231',1,'RestClient::Connection']]], + ['getuseragent',['GetUserAgent',['../class_rest_client_1_1_connection.html#aa4353eb1df932b254aa02446f4ac3b32',1,'RestClient::Connection']]] +]; diff --git a/docs/ref/search/functions_5.html b/docs/ref/search/functions_5.html new file mode 100644 index 00000000..e2f6e313 --- /dev/null +++ b/docs/ref/search/functions_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/functions_5.js b/docs/ref/search/functions_5.js new file mode 100644 index 00000000..81f4d441 --- /dev/null +++ b/docs/ref/search/functions_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['head',['head',['../class_rest_client_1_1_connection.html#a64f085227c8c4d47dc6c84fea4f71398',1,'RestClient::Connection::head()'],['../namespace_rest_client.html#a99dee400dfdab150b9fdce2ab6a0c2dc',1,'RestClient::head()']]], + ['header_5fcallback',['header_callback',['../namespace_rest_client_1_1_helpers.html#a464be55c71cef59eebb53d922956a4d1',1,'RestClient::Helpers']]] +]; diff --git a/docs/ref/search/functions_6.html b/docs/ref/search/functions_6.html new file mode 100644 index 00000000..342a0762 --- /dev/null +++ b/docs/ref/search/functions_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/functions_6.js b/docs/ref/search/functions_6.js new file mode 100644 index 00000000..af717672 --- /dev/null +++ b/docs/ref/search/functions_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['init',['init',['../namespace_rest_client.html#a38395626a68f2dc66e2acf5b01f5b70b',1,'RestClient']]] +]; diff --git a/docs/ref/search/functions_7.html b/docs/ref/search/functions_7.html new file mode 100644 index 00000000..04db8a64 --- /dev/null +++ b/docs/ref/search/functions_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/functions_7.js b/docs/ref/search/functions_7.js new file mode 100644 index 00000000..6e0c49fd --- /dev/null +++ b/docs/ref/search/functions_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['post',['post',['../class_rest_client_1_1_connection.html#a76b11e6e01fb84cafdacf99e49aae6a7',1,'RestClient::Connection::post()'],['../namespace_rest_client.html#a7de7aa2d333b6e7c5f2c2726d4e5485e',1,'RestClient::post()']]], + ['put',['put',['../class_rest_client_1_1_connection.html#af1a30c5aa6a646e6bad4caf2abb7084c',1,'RestClient::Connection::put()'],['../namespace_rest_client.html#ac180f6320d47cad592399378f8c45f7a',1,'RestClient::put()']]] +]; diff --git a/docs/ref/search/functions_8.html b/docs/ref/search/functions_8.html new file mode 100644 index 00000000..6bab2c81 --- /dev/null +++ b/docs/ref/search/functions_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/functions_8.js b/docs/ref/search/functions_8.js new file mode 100644 index 00000000..c01c9a03 --- /dev/null +++ b/docs/ref/search/functions_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['read_5fcallback',['read_callback',['../namespace_rest_client_1_1_helpers.html#a1209e4977d76d9be7d8b40328bcb464d',1,'RestClient::Helpers']]] +]; diff --git a/docs/ref/search/functions_9.html b/docs/ref/search/functions_9.html new file mode 100644 index 00000000..e32df637 --- /dev/null +++ b/docs/ref/search/functions_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/functions_9.js b/docs/ref/search/functions_9.js new file mode 100644 index 00000000..69b4a30b --- /dev/null +++ b/docs/ref/search/functions_9.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['setbasicauth',['SetBasicAuth',['../class_rest_client_1_1_connection.html#a9fdc2ee1b3b2cc2cca1f9fd29e6fd73f',1,'RestClient::Connection']]], + ['setcainfofilepath',['SetCAInfoFilePath',['../class_rest_client_1_1_connection.html#afd74a344a00b58fc6997e34c37dde834',1,'RestClient::Connection']]], + ['setheaders',['SetHeaders',['../class_rest_client_1_1_connection.html#a6af41bf467a80deb83f20044f2c17344',1,'RestClient::Connection']]], + ['settimeout',['SetTimeout',['../class_rest_client_1_1_connection.html#ad7b6f92f59861b4c8dc914d4d226d89d',1,'RestClient::Connection']]], + ['setuseragent',['SetUserAgent',['../class_rest_client_1_1_connection.html#a3e510fdf8291e9e277df72b0fae0a111',1,'RestClient::Connection']]] +]; diff --git a/docs/ref/search/functions_a.html b/docs/ref/search/functions_a.html new file mode 100644 index 00000000..1ae07c72 --- /dev/null +++ b/docs/ref/search/functions_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/functions_a.js b/docs/ref/search/functions_a.js new file mode 100644 index 00000000..3fbfbab8 --- /dev/null +++ b/docs/ref/search/functions_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['write_5fcallback',['write_callback',['../namespace_rest_client_1_1_helpers.html#a1dfc03258041ee29084ef9cf566ab836',1,'RestClient::Helpers']]] +]; diff --git a/docs/ref/search/mag_sel.png b/docs/ref/search/mag_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..81f6040a2092402b4d98f9ffa8855d12a0d4ca17 GIT binary patch literal 563 zcmV-30?hr1P)zxx&tqG15pu7)IiiXFflOc2k;dXd>%13GZAy? zRz!q0=|E6a6vV)&ZBS~G9oe0kbqyw1*gvY`{Pop2oKq#FlzgXt@Xh-7fxh>}`Fxg> z$%N%{$!4=5nM{(;=c!aG1Ofr^Do{u%Ih{^&Fc@H2)+a-?TBXrw5DW&z%Nb6mQ!L9O zl}b@6mB?f=tX3;#vl)}ggh(Vpyh(IK z(Mb0D{l{U$FsRjP;!{($+bsaaVi8T#1c0V#qEIOCYa9@UVLV`f__E81L;?WEaRA;Y zUH;rZ;vb;mk7JX|$=i3O~&If0O@oZfLg8gfIjW=dcBsz;gI=!{-r4# z4%6v$&~;q^j7Fo67yJ(NJWuX+I~I!tj^nW3?}^9bq|<3^+vapS5sgM^x7!cs(+mMT z&y%j};&~po+YO)3hoUH4E*E;e9>?R6SS&`X)p`njycAVcg{rEb41T{~Hk(bl-7eSb zmFxA2uIqo#@R?lKm50ND`~6Nfn|-b1|L6O98vt3Tx@gKz#isxO002ovPDHLkV1kyW B_l^Jn literal 0 HcmV?d00001 diff --git a/docs/ref/search/namespaces_0.html b/docs/ref/search/namespaces_0.html new file mode 100644 index 00000000..6d5853b6 --- /dev/null +++ b/docs/ref/search/namespaces_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/namespaces_0.js b/docs/ref/search/namespaces_0.js new file mode 100644 index 00000000..3df96531 --- /dev/null +++ b/docs/ref/search/namespaces_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['helpers',['Helpers',['../namespace_rest_client_1_1_helpers.html',1,'RestClient']]], + ['restclient',['RestClient',['../namespace_rest_client.html',1,'']]] +]; diff --git a/docs/ref/search/nomatches.html b/docs/ref/search/nomatches.html new file mode 100644 index 00000000..b1ded27e --- /dev/null +++ b/docs/ref/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
+
No Matches
+
+ + diff --git a/docs/ref/search/pages_0.html b/docs/ref/search/pages_0.html new file mode 100644 index 00000000..4b85b346 --- /dev/null +++ b/docs/ref/search/pages_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/pages_0.js b/docs/ref/search/pages_0.js new file mode 100644 index 00000000..b64fc338 --- /dev/null +++ b/docs/ref/search/pages_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['changelog',['Changelog',['../md__c_h_a_n_g_e_l_o_g.html',1,'']]], + ['contribute',['Contribute',['../md__c_o_n_t_r_i_b_u_t_i_n_g.html',1,'']]] +]; diff --git a/docs/ref/search/search.css b/docs/ref/search/search.css new file mode 100644 index 00000000..4d7612ff --- /dev/null +++ b/docs/ref/search/search.css @@ -0,0 +1,271 @@ +/*---------------- Search Box */ + +#FSearchBox { + float: left; +} + +#MSearchBox { + white-space : nowrap; + position: absolute; + float: none; + display: inline; + margin-top: 8px; + right: 0px; + width: 170px; + z-index: 102; + background-color: white; +} + +#MSearchBox .left +{ + display:block; + position:absolute; + left:10px; + width:20px; + height:19px; + background:url('search_l.png') no-repeat; + background-position:right; +} + +#MSearchSelect { + display:block; + position:absolute; + width:20px; + height:19px; +} + +.left #MSearchSelect { + left:4px; +} + +.right #MSearchSelect { + right:5px; +} + +#MSearchField { + display:block; + position:absolute; + height:19px; + background:url('search_m.png') repeat-x; + border:none; + width:111px; + margin-left:20px; + padding-left:4px; + color: #909090; + outline: none; + font: 9pt Arial, Verdana, sans-serif; +} + +#FSearchBox #MSearchField { + margin-left:15px; +} + +#MSearchBox .right { + display:block; + position:absolute; + right:10px; + top:0px; + width:20px; + height:19px; + background:url('search_r.png') no-repeat; + background-position:left; +} + +#MSearchClose { + display: none; + position: absolute; + top: 4px; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +.left #MSearchClose { + left: 6px; +} + +.right #MSearchClose { + right: 2px; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 1; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + +DIV.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/docs/ref/search/search.js b/docs/ref/search/search.js new file mode 100644 index 00000000..dedce3bf --- /dev/null +++ b/docs/ref/search/search.js @@ -0,0 +1,791 @@ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; ek7RCwB~R6VQOP#AvB$vH7i{6H{96zot$7cZT<7246EF5Np6N}+$IbiG6W zg#87A+NFaX+=_^xM1#gCtshC=E{%9^uQX_%?YwXvo{#q&MnpJ8uh(O?ZRc&~_1%^SsPxG@rfElJg-?U zm!Cz-IOn(qJP3kDp-^~qt+FGbl=5jNli^Wj_xIBG{Rc0en{!oFvyoNC7{V~T8}b>| z=jL2WIReZzX(YN(_9fV;BBD$VXQIxNasAL8ATvEu822WQ%mvv4FO#qs` BFGc_W literal 0 HcmV?d00001 diff --git a/docs/ref/search/search_r.png b/docs/ref/search/search_r.png new file mode 100644 index 0000000000000000000000000000000000000000..97ee8b439687084201b79c6f776a41f495c6392a GIT binary patch literal 612 zcmV-q0-ODbP)PbXFRCwB?)W514K@j&X?z2*SxFI6-@HT2E2K=9X9%Pb zEK*!TBw&g(DMC;|A)uGlRkOS9vd-?zNs%bR4d$w+ox_iFnE8fvIvv7^5<(>Te12Li z7C)9srCzmK{ZcNM{YIl9j{DePFgOWiS%xG@5CnnnJa4nvY<^glbz7^|-ZY!dUkAwd z{gaTC@_>b5h~;ug#R0wRL0>o5!hxm*s0VW?8dr}O#zXTRTnrQm_Z7z1Mrnx>&p zD4qifUjzLvbVVWi?l?rUzwt^sdb~d!f_LEhsRVIXZtQ=qSxuxqm zEX#tf>$?M_Y1-LSDT)HqG?`%-%ZpY!#{N!rcNIiL;G7F0`l?)mNGTD9;f9F5Up3Kg zw}a<-JylhG&;=!>B+fZaCX+?C+kHYrP%c?X2!Zu_olK|GcS4A70HEy;vn)I0>0kLH z`jc(WIaaHc7!HS@f*^R^Znx8W=_jIl2oWJoQ*h1^$FX!>*PqR1J8k|fw}w_y}TpE>7m8DqDO<3z`OzXt$ccSejbEZCg@0000 + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/typedefs_0.js b/docs/ref/search/typedefs_0.js new file mode 100644 index 00000000..36a191cc --- /dev/null +++ b/docs/ref/search/typedefs_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['headerfields',['HeaderFields',['../namespace_rest_client.html#ab2bbc7fd5ec10171e4e1fb2d7fc8e865',1,'RestClient']]] +]; diff --git a/docs/ref/search/variables_0.html b/docs/ref/search/variables_0.html new file mode 100644 index 00000000..2837a574 --- /dev/null +++ b/docs/ref/search/variables_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/variables_0.js b/docs/ref/search/variables_0.js new file mode 100644 index 00000000..fde1c467 --- /dev/null +++ b/docs/ref/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['appconnecttime',['appConnectTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#a05d4f74f97a3e02cb9bbe3a6039135bc',1,'RestClient::Connection::RequestInfo']]] +]; diff --git a/docs/ref/search/variables_1.html b/docs/ref/search/variables_1.html new file mode 100644 index 00000000..6a866b1b --- /dev/null +++ b/docs/ref/search/variables_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/variables_1.js b/docs/ref/search/variables_1.js new file mode 100644 index 00000000..885da35c --- /dev/null +++ b/docs/ref/search/variables_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['baseurl',['baseUrl',['../struct_rest_client_1_1_connection_1_1_info.html#ae908949ed901ed0883da20efad56cf67',1,'RestClient::Connection::Info']]], + ['basicauth',['basicAuth',['../struct_rest_client_1_1_connection_1_1_info.html#ac659be6ed4f5f699ca7609b1e0f6863d',1,'RestClient::Connection::Info']]], + ['body',['body',['../struct_rest_client_1_1_response.html#a87ba6d5e5ae9ae7d628d5ed34b36cc95',1,'RestClient::Response']]] +]; diff --git a/docs/ref/search/variables_2.html b/docs/ref/search/variables_2.html new file mode 100644 index 00000000..3115f99e --- /dev/null +++ b/docs/ref/search/variables_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/variables_2.js b/docs/ref/search/variables_2.js new file mode 100644 index 00000000..4ca6981e --- /dev/null +++ b/docs/ref/search/variables_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['code',['code',['../struct_rest_client_1_1_response.html#a3b3b63aeae7ca761d54a009ee329ea28',1,'RestClient::Response']]], + ['connecttime',['connectTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#a7c8347cc41e35a944663d333baea88a9',1,'RestClient::Connection::RequestInfo']]], + ['customuseragent',['customUserAgent',['../struct_rest_client_1_1_connection_1_1_info.html#a8cec6f505e26773638ea7c2df895b5e8',1,'RestClient::Connection::Info']]] +]; diff --git a/docs/ref/search/variables_3.html b/docs/ref/search/variables_3.html new file mode 100644 index 00000000..b2941ee6 --- /dev/null +++ b/docs/ref/search/variables_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/variables_3.js b/docs/ref/search/variables_3.js new file mode 100644 index 00000000..866c7139 --- /dev/null +++ b/docs/ref/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['data',['data',['../struct_rest_client_1_1_helpers_1_1_upload_object.html#a0f0bebacc6bb930899ee9babadb92a31',1,'RestClient::Helpers::UploadObject']]] +]; diff --git a/docs/ref/search/variables_4.html b/docs/ref/search/variables_4.html new file mode 100644 index 00000000..e14a4ffc --- /dev/null +++ b/docs/ref/search/variables_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/variables_4.js b/docs/ref/search/variables_4.js new file mode 100644 index 00000000..b2416c01 --- /dev/null +++ b/docs/ref/search/variables_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['followredirects',['followRedirects',['../struct_rest_client_1_1_connection_1_1_info.html#a4b194ea487bf48f55e597b3146bc0c9b',1,'RestClient::Connection::Info']]] +]; diff --git a/docs/ref/search/variables_5.html b/docs/ref/search/variables_5.html new file mode 100644 index 00000000..ee6461cb --- /dev/null +++ b/docs/ref/search/variables_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/variables_5.js b/docs/ref/search/variables_5.js new file mode 100644 index 00000000..1c53cf94 --- /dev/null +++ b/docs/ref/search/variables_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['headers',['headers',['../struct_rest_client_1_1_connection_1_1_info.html#a8e9c9ad0c74a6e6f5c73ced7306464d1',1,'RestClient::Connection::Info::headers()'],['../struct_rest_client_1_1_response.html#a2141b4d9929e0df26d918dfba8451496',1,'RestClient::Response::headers()']]] +]; diff --git a/docs/ref/search/variables_6.html b/docs/ref/search/variables_6.html new file mode 100644 index 00000000..9b457a20 --- /dev/null +++ b/docs/ref/search/variables_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/variables_6.js b/docs/ref/search/variables_6.js new file mode 100644 index 00000000..359ed049 --- /dev/null +++ b/docs/ref/search/variables_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['lastrequest',['lastRequest',['../struct_rest_client_1_1_connection_1_1_info.html#ac9393ffec292dc9ef1f9378bf0df5f31',1,'RestClient::Connection::Info']]], + ['length',['length',['../struct_rest_client_1_1_helpers_1_1_upload_object.html#a8cfb479c87d4870a7e54e62dc0a3d3f6',1,'RestClient::Helpers::UploadObject']]] +]; diff --git a/docs/ref/search/variables_7.html b/docs/ref/search/variables_7.html new file mode 100644 index 00000000..aae170d5 --- /dev/null +++ b/docs/ref/search/variables_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/variables_7.js b/docs/ref/search/variables_7.js new file mode 100644 index 00000000..8bbc8dc8 --- /dev/null +++ b/docs/ref/search/variables_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['namelookuptime',['nameLookupTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#a73d3bab1fd832feb912f1e20656b185d',1,'RestClient::Connection::RequestInfo']]] +]; diff --git a/docs/ref/search/variables_8.html b/docs/ref/search/variables_8.html new file mode 100644 index 00000000..7d96ca32 --- /dev/null +++ b/docs/ref/search/variables_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/variables_8.js b/docs/ref/search/variables_8.js new file mode 100644 index 00000000..fdc9cc86 --- /dev/null +++ b/docs/ref/search/variables_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['pretransfertime',['preTransferTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#abcccb563d60a3f5325918ef912130e16',1,'RestClient::Connection::RequestInfo']]] +]; diff --git a/docs/ref/search/variables_9.html b/docs/ref/search/variables_9.html new file mode 100644 index 00000000..29d10923 --- /dev/null +++ b/docs/ref/search/variables_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/variables_9.js b/docs/ref/search/variables_9.js new file mode 100644 index 00000000..6d28dda3 --- /dev/null +++ b/docs/ref/search/variables_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['redirectcount',['redirectCount',['../struct_rest_client_1_1_connection_1_1_request_info.html#ab0240290fa51b11468936199ff0c248f',1,'RestClient::Connection::RequestInfo']]], + ['redirecttime',['redirectTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#af219b63ad58cb52748ba7afd5b2290aa',1,'RestClient::Connection::RequestInfo']]] +]; diff --git a/docs/ref/search/variables_a.html b/docs/ref/search/variables_a.html new file mode 100644 index 00000000..b4a88a82 --- /dev/null +++ b/docs/ref/search/variables_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/variables_a.js b/docs/ref/search/variables_a.js new file mode 100644 index 00000000..8ec9c983 --- /dev/null +++ b/docs/ref/search/variables_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['starttransfertime',['startTransferTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#a022ad817c51c37e781d3ef6590b47d96',1,'RestClient::Connection::RequestInfo']]] +]; diff --git a/docs/ref/search/variables_b.html b/docs/ref/search/variables_b.html new file mode 100644 index 00000000..3eb3a399 --- /dev/null +++ b/docs/ref/search/variables_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/ref/search/variables_b.js b/docs/ref/search/variables_b.js new file mode 100644 index 00000000..8483af7b --- /dev/null +++ b/docs/ref/search/variables_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['timeout',['timeout',['../struct_rest_client_1_1_connection_1_1_info.html#a0a63e442ce474e50017fcbae563c4a7c',1,'RestClient::Connection::Info']]], + ['totaltime',['totalTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#a5febf41f2662384129b874e195e1c01e',1,'RestClient::Connection::RequestInfo']]] +]; diff --git a/docs/ref/splitbar.png b/docs/ref/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/docs/ref/struct_rest_client_1_1_connection_1_1_info-members.html b/docs/ref/struct_rest_client_1_1_connection_1_1_info-members.html new file mode 100644 index 00000000..cf2c7d37 --- /dev/null +++ b/docs/ref/struct_rest_client_1_1_connection_1_1_info-members.html @@ -0,0 +1,115 @@ + + + + + + +restclient-cpp: Member List + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RestClient::Connection::Info Member List
+
+ + + + + diff --git a/docs/ref/struct_rest_client_1_1_connection_1_1_info.html b/docs/ref/struct_rest_client_1_1_connection_1_1_info.html new file mode 100644 index 00000000..ca99d322 --- /dev/null +++ b/docs/ref/struct_rest_client_1_1_connection_1_1_info.html @@ -0,0 +1,233 @@ + + + + + + +restclient-cpp: RestClient::Connection::Info Struct Reference + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RestClient::Connection::Info Struct Reference
+
+
+ +

holds some diagnostics information about the connection object it came from + More...

+ +

#include <connection.h>

+ + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

std::string baseUrl
 
RestClient::HeaderFields headers
 
int timeout
 
bool followRedirects
 
struct {
+   std::string   username
 
+   std::string   password
 
basicAuth
 
std::string customUserAgent
 
RequestInfo lastRequest
 
+

Detailed Description

+

holds some diagnostics information about the connection object it came from

+

Member Data Documentation

+ +
+
+ + + + +
RestClient::Connection::Info::baseUrl
+
+

Member 'baseUrl' contains the base URL for the connection object

+ +
+
+ +
+
+ + + + +
RestClient::Connection::Info::basicAuth
+
+

Member 'basicAuth' contains information about basic auth

+ +
+
+ +
+
+ + + + +
RestClient::Connection::Info::customUserAgent
+
+

Member 'customUserAgent' contains the custom user agent

+ +
+
+ +
+
+ + + + +
RestClient::Connection::Info::followRedirects
+
+

Member 'followRedirects' contains whether or not to follow redirects

+ +
+
+ +
+
+ + + + +
RestClient::Connection::Info::headers
+
+

Member 'headers' contains the HeaderFields map

+ +
+
+ +
+
+ + + + +
RestClient::Connection::Info::lastRequest
+
+

Member 'lastRequest' contains metrics about the last request

+ +
+
+ +
+
+ + + + +
RestClient::Connection::Info::timeout
+
+

Member 'timeout' contains the configured timeout

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/ref/struct_rest_client_1_1_connection_1_1_request_info-members.html b/docs/ref/struct_rest_client_1_1_connection_1_1_request_info-members.html new file mode 100644 index 00000000..a5b1132c --- /dev/null +++ b/docs/ref/struct_rest_client_1_1_connection_1_1_request_info-members.html @@ -0,0 +1,114 @@ + + + + + + +restclient-cpp: Member List + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RestClient::Connection::RequestInfo Member List
+
+ + + + + diff --git a/docs/ref/struct_rest_client_1_1_connection_1_1_request_info.html b/docs/ref/struct_rest_client_1_1_connection_1_1_request_info.html new file mode 100644 index 00000000..7766c397 --- /dev/null +++ b/docs/ref/struct_rest_client_1_1_connection_1_1_request_info.html @@ -0,0 +1,241 @@ + + + + + + +restclient-cpp: RestClient::Connection::RequestInfo Struct Reference + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RestClient::Connection::RequestInfo Struct Reference
+
+
+ +

holds some diagnostics information about a request + More...

+ +

#include <connection.h>

+ + + + + + + + + + + + + + + + + + +

+Public Attributes

double totalTime
 
double nameLookupTime
 
double connectTime
 
double appConnectTime
 
double preTransferTime
 
double startTransferTime
 
double redirectTime
 
int redirectCount
 
+

Detailed Description

+

holds some diagnostics information about a request

+

Member Data Documentation

+ +
+
+ + + + +
RestClient::Connection::RequestInfo::appConnectTime
+
+

Member 'appConnectTime' contains the time from start until SSL/SSH handshake completed. See CURLINFO_APPCONNECT_TIME

+ +
+
+ +
+
+ + + + +
RestClient::Connection::RequestInfo::connectTime
+
+

Member 'connectTime' contains the time it took until Time from start until remote host or proxy completed. See CURLINFO_CONNECT_TIME

+ +
+
+ +
+
+ + + + +
RestClient::Connection::RequestInfo::nameLookupTime
+
+

Member 'nameLookupTime' contains the time spent in DNS lookup in seconds Time from start until name resolving completed. See CURLINFO_NAMELOOKUP_TIME

+ +
+
+ +
+
+ + + + +
RestClient::Connection::RequestInfo::preTransferTime
+
+

Member 'preTransferTime' contains the total time from start until just before the transfer begins. See CURLINFO_PRETRANSFER_TIME

+ +
+
+ +
+
+ + + + +
RestClient::Connection::RequestInfo::redirectCount
+
+

Member 'redirectCount' contains the number of redirects followed. See CURLINFO_REDIRECT_COUNT

+ +
+
+ +
+
+ + + + +
RestClient::Connection::RequestInfo::redirectTime
+
+

Member 'redirectTime' contains the total time taken for all redirect steps before the final transfer. See CURLINFO_REDIRECT_TIME

+ +
+
+ +
+
+ + + + +
RestClient::Connection::RequestInfo::startTransferTime
+
+

Member 'startTransferTime' contains the total time from start until just when the first byte is received. See CURLINFO_STARTTRANSFER_TIME

+ +
+
+ +
+
+ + + + +
RestClient::Connection::RequestInfo::totalTime
+
+

Member 'totalTime' contains the total time of the last request in seconds Total time of previous transfer. See CURLINFO_TOTAL_TIME

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object-members.html b/docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object-members.html new file mode 100644 index 00000000..c0e9d34c --- /dev/null +++ b/docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object-members.html @@ -0,0 +1,108 @@ + + + + + + +restclient-cpp: Member List + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RestClient::Helpers::UploadObject Member List
+
+
+ +

This is the complete list of members for RestClient::Helpers::UploadObject, including all inherited members.

+ + + +
dataRestClient::Helpers::UploadObject
lengthRestClient::Helpers::UploadObject
+ + + + diff --git a/docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object.html b/docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object.html new file mode 100644 index 00000000..f61c709c --- /dev/null +++ b/docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object.html @@ -0,0 +1,151 @@ + + + + + + +restclient-cpp: RestClient::Helpers::UploadObject Struct Reference + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RestClient::Helpers::UploadObject Struct Reference
+
+
+ +

This structure represents the payload to upload on POST requests. + More...

+ +

#include <helpers.h>

+ + + + + + +

+Public Attributes

const char * data
 
size_t length
 
+

Detailed Description

+

This structure represents the payload to upload on POST requests.

+

Member Data Documentation

+ +
+
+ + + + +
RestClient::Helpers::UploadObject::data
+
+

Member 'data' contains the data to upload

+ +
+
+ +
+
+ + + + +
RestClient::Helpers::UploadObject::length
+
+

Member 'length' contains the length of the data to upload

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/ref/struct_rest_client_1_1_response-members.html b/docs/ref/struct_rest_client_1_1_response-members.html new file mode 100644 index 00000000..e8027897 --- /dev/null +++ b/docs/ref/struct_rest_client_1_1_response-members.html @@ -0,0 +1,109 @@ + + + + + + +restclient-cpp: Member List + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RestClient::Response Member List
+
+
+ +

This is the complete list of members for RestClient::Response, including all inherited members.

+ + + + +
bodyRestClient::Response
codeRestClient::Response
headersRestClient::Response
+ + + + diff --git a/docs/ref/struct_rest_client_1_1_response.html b/docs/ref/struct_rest_client_1_1_response.html new file mode 100644 index 00000000..f064312f --- /dev/null +++ b/docs/ref/struct_rest_client_1_1_response.html @@ -0,0 +1,166 @@ + + + + + + +restclient-cpp: RestClient::Response Struct Reference + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RestClient::Response Struct Reference
+
+
+ +

This structure represents the HTTP response data. + More...

+ +

#include <restclient.h>

+ + + + + + + + +

+Public Attributes

int code
 
std::string body
 
HeaderFields headers
 
+

Detailed Description

+

This structure represents the HTTP response data.

+

Member Data Documentation

+ +
+
+ + + + +
RestClient::Response::body
+
+

Member 'body' contains the HTTP response body

+ +
+
+ +
+
+ + + + +
RestClient::Response::code
+
+

Member 'code' contains the HTTP response code

+ +
+
+ +
+
+ + + + +
RestClient::Response::headers
+
+

Member 'headers' contains the HTTP response headers

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/ref/sync_off.png b/docs/ref/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/docs/ref/sync_on.png b/docs/ref/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/docs/ref/tab_a.png b/docs/ref/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/docs/ref/tab_b.png b/docs/ref/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/docs/ref/tabs.css b/docs/ref/tabs.css new file mode 100644 index 00000000..9cf578f2 --- /dev/null +++ b/docs/ref/tabs.css @@ -0,0 +1,60 @@ +.tabs, .tabs2, .tabs3 { + background-image: url('tab_b.png'); + width: 100%; + z-index: 101; + font-size: 13px; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +.tabs2 { + font-size: 10px; +} +.tabs3 { + font-size: 9px; +} + +.tablist { + margin: 0; + padding: 0; + display: table; +} + +.tablist li { + float: left; + display: table-cell; + background-image: url('tab_b.png'); + line-height: 36px; + list-style: none; +} + +.tablist a { + display: block; + padding: 0 20px; + font-weight: bold; + background-image:url('tab_s.png'); + background-repeat:no-repeat; + background-position:right; + color: #283A5D; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; + outline: none; +} + +.tabs3 .tablist a { + padding: 0 10px; +} + +.tablist a:hover { + background-image: url('tab_h.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + text-decoration: none; +} + +.tablist li.current a { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} diff --git a/docs/ref/version_8h_source.html b/docs/ref/version_8h_source.html new file mode 100644 index 00000000..edbc0d3c --- /dev/null +++ b/docs/ref/version_8h_source.html @@ -0,0 +1,105 @@ + + + + + + +restclient-cpp: include/restclient-cpp/version.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
restclient-cpp +
+
C++ client for making HTTP/REST requests
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
version.h
+
+
+
1 #ifndef INCLUDE_RESTCLIENT_CPP_VERSION_H_
+
2 #define INCLUDE_RESTCLIENT_CPP_VERSION_H_
+
3 #define RESTCLIENT_VERSION "0.5.1"
+
4 #endif // INCLUDE_RESTCLIENT_CPP_VERSION_H_
+
+ + + + From ac7cef2a6728e18ebc4f131692d7bee15c6d2fb1 Mon Sep 17 00:00:00 2001 From: Martin Gerhardy Date: Fri, 25 Nov 2016 09:04:00 +0100 Subject: [PATCH 125/212] Small optimizations use std::move in c++11 mode pass by reference to prevent string copy use char in find_first_of (no length evaluation needed) closes #65 --- include/restclient-cpp/connection.h | 2 +- source/connection.cc | 7 ++++++- source/helpers.cc | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index 515d8d9d..e78b5b8f 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -104,7 +104,7 @@ class Connection { } Info; - explicit Connection(const std::string baseUrl); + explicit Connection(const std::string& baseUrl); ~Connection(); // Instance configuration methods diff --git a/source/connection.cc b/source/connection.cc index 59555774..2b0be945 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -13,6 +13,7 @@ #include #include #include +#include #include "restclient-cpp/restclient.h" #include "restclient-cpp/helpers.h" @@ -24,7 +25,7 @@ * @param baseUrl - base URL for the connection to use * */ -RestClient::Connection::Connection(const std::string baseUrl) +RestClient::Connection::Connection(const std::string& baseUrl) : lastRequest(), headerFields() { this->curlHandle = curl_easy_init(); if (!this->curlHandle) { @@ -84,7 +85,11 @@ RestClient::Connection::AppendHeader(const std::string& key, */ void RestClient::Connection::SetHeaders(RestClient::HeaderFields headers) { +#if __cplusplus >= 201103L + this->headerFields = std::move(headers); +#else this->headerFields = headers; +#endif } /** diff --git a/source/helpers.cc b/source/helpers.cc index 4efe9bdf..aa51bf58 100644 --- a/source/helpers.cc +++ b/source/helpers.cc @@ -43,7 +43,7 @@ size_t RestClient::Helpers::header_callback(void *data, size_t size, RestClient::Response* r; r = reinterpret_cast(userdata); std::string header(reinterpret_cast(data), size*nmemb); - size_t seperator = header.find_first_of(":"); + size_t seperator = header.find_first_of(':'); if ( std::string::npos == seperator ) { // roll with non seperated headers... trim(header); From ca39e2a0f3d0029a54731f3c610780cfb1713b6b Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 29 Nov 2016 20:00:31 -0500 Subject: [PATCH 126/212] move CI to run on travis trusty beta this enables newer versions of a lot of packages. But the main reason is really to be able to develop against newer versions of libcurl. closes #66 --- .travis.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0a005b5e..c83cdfcd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,7 @@ language: cpp +dist: trusty +sudo: required +group: beta compiler: - gcc - clang @@ -8,7 +11,11 @@ script: install: - gem install fpm - gem install package_cloud +- sudo apt-get install -qq doxygen +- sudo apt-get install -qq rpm +- sudo apt-get install -qq valgrind before_script: +- curl --version - curl https://raw.githubusercontent.com/google/styleguide/gh-pages/cpplint/cpplint.py -o cpplint - chmod +x cpplint - export PATH=$PATH:`pwd` @@ -19,15 +26,6 @@ after_success: - export PATH=$PATH:`pwd`/lcov-1.11/bin - make coverage.info - coveralls-lcov coverage.info -sudo: false -addons: - apt: - packages: - - build-essential - - libcurl4-openssl-dev - - doxygen - - rpm - - valgrind deploy: provider: script script: ./autogen.sh && ./configure --prefix=`pwd`/usr && make deploy-packages From 74f89377ad4f701e76a6be4312fe22255277870d Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Thu, 1 Dec 2016 13:42:35 -0500 Subject: [PATCH 127/212] add libcurl4-openssl-dev install back to travis build --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index c83cdfcd..a8ddd2b0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,7 @@ install: - sudo apt-get install -qq doxygen - sudo apt-get install -qq rpm - sudo apt-get install -qq valgrind +- sudo apt-get install -qq libcurl4-openssl-dev before_script: - curl --version - curl https://raw.githubusercontent.com/google/styleguide/gh-pages/cpplint/cpplint.py -o cpplint From 44208cf0af363c3aba12b7cd5951b836528f90b5 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Thu, 16 Jun 2016 21:10:48 -0400 Subject: [PATCH 128/212] add client cert & key support closes #51 --- README.md | 19 ++++++++++ include/restclient-cpp/connection.h | 16 +++++++++ source/connection.cc | 55 +++++++++++++++++++++++++---- test/test_connection.cc | 10 ++++++ 4 files changed, 94 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7424d2df..4ce22065 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,10 @@ typedef struct { std::string username; std::string password; } basicAuth; + + std::string certPath; + std::string certType; + std::string keyPath; std::string customUserAgent; struct { // total time of the last request in seconds Total time of previous @@ -164,6 +168,21 @@ In order to provide an easy to use API, the simple usage via the static methods implicitly calls the curl global functions and is therefore also **not thread-safe**. +## HTTPS User Certificate + +Simple wrapper functions are provided to allow clients to authenticate using certificates. +Under the hood these wrappers set cURL options, e.g. `CURLOPT_SSLCERT`, using `curl_easy_setopt`. +Note: currently `libcurl` compiled with `gnutls` (e.g. `libcurl4-gnutls-dev` on +ubuntu) is buggy in that it returns a wrong error code when these options are set to invalid values. + +```cpp +// set CURLOPT_SSLCERT +conn->SetCertPath(certPath); +// set CURLOPT_SSLCERTTYPE +conn->SetCertType(type); +// set CURLOPT_SSLKEY +conn->SetKeyPath(keyPath); +``` ## Dependencies - [libcurl][] diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index e78b5b8f..a9dc9116 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -99,6 +99,10 @@ class Connection { std::string username; std::string password; } basicAuth; + + std::string certPath; + std::string certType; + std::string keyPath; std::string customUserAgent; RequestInfo lastRequest; } Info; @@ -126,6 +130,15 @@ class Connection { // certificates to be used to verify peers. See CURLOPT_CAINFO void SetCAInfoFilePath(const std::string& caInfoFilePath); + // set CURLOPT_SSLCERT + void SetCertPath(const std::string& cert); + + // set CURLOPT_SSLCERTTYPE + void SetCertType(const std::string& type); + + // set CURLOPT_SSLKEY. Default format is PEM + void SetKeyPath(const std::string& keyPath); + std::string GetUserAgent(); RestClient::Connection::Info GetInfo(); @@ -163,6 +176,9 @@ class Connection { std::string customUserAgent; std::string caInfoFilePath; RequestInfo lastRequest; + std::string certPath; + std::string certType; + std::string keyPath; RestClient::Response performCurlRequest(const std::string& uri); }; }; // namespace RestClient diff --git a/source/connection.cc b/source/connection.cc index 2b0be945..b775e7c2 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -60,6 +60,10 @@ RestClient::Connection::GetInfo() { ret.customUserAgent = this->customUserAgent; ret.lastRequest = this->lastRequest; + ret.certPath = this->certPath; + ret.certType = this->certType; + ret.keyPath = this->keyPath; + return ret; } @@ -175,6 +179,21 @@ RestClient::Connection::SetBasicAuth(const std::string& username, this->basicAuth.password = password; } +void +RestClient::Connection::SetCertPath(const std::string& cert) { + this->certPath = cert; +} + +void +RestClient::Connection::SetCertType(const std::string& certType) { + this->certType = certType; +} + +void +RestClient::Connection::SetKeyPath(const std::string& keyPath) { + this->keyPath = keyPath; +} + /** * @brief helper function to get called from the actual request methods to * prepare the curlHandle for transfer with generic options, perform the @@ -247,14 +266,38 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { curl_easy_setopt(this->curlHandle, CURLOPT_CAINFO, this->caInfoFilePath.c_str()); } + + // set cert file path + if (!this->certPath.empty()) { + curl_easy_setopt(this->curlHandle, CURLOPT_SSLCERT, + this->certPath.c_str()); + } + + // set cert type + if (!this->certType.empty()) { + curl_easy_setopt(this->curlHandle, CURLOPT_SSLCERTTYPE, + this->certType.c_str()); + } + // set key file path + if (!this->keyPath.empty()) { + curl_easy_setopt(this->curlHandle, CURLOPT_SSLKEY, + this->keyPath.c_str()); + } + res = curl_easy_perform(this->curlHandle); if (res != CURLE_OK) { - if (res == CURLE_OPERATION_TIMEDOUT) { - ret.code = res; - ret.body = "Operation Timeout."; - } else { - ret.body = "Failed to query."; - ret.code = -1; + switch (res) { + case CURLE_OPERATION_TIMEDOUT: + ret.code = res; + ret.body = "Operation Timeout."; + break; + case CURLE_SSL_CERTPROBLEM: + ret.code = res; + ret.body = curl_easy_strerror(res); + break; + default: + ret.body = "Failed to query."; + ret.code = -1; } } else { int64_t http_code = 0; diff --git a/test/test_connection.cc b/test/test_connection.cc index 0726cfe2..2e790e25 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -92,6 +92,16 @@ TEST_F(ConnectionTest, TestBasicAuth) } +TEST_F(ConnectionTest, TestSSLCert) +{ + conn->SetCertPath("non-existent file"); + conn->SetKeyPath("non-existent key path"); + conn->SetCertType("invalid cert type"); + RestClient::Response res = conn->get("/get"); + + EXPECT_EQ(58, res.code); +} + TEST_F(ConnectionTest, TestSetHeaders) { RestClient::HeaderFields headers; From ed3cbe678b537ea6857275950fa55377fe01001a Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 2 Dec 2016 10:47:18 -0500 Subject: [PATCH 129/212] add .github folder with issue/PR templates --- CONTRIBUTING.md => .github/CONTRIBUTING.md | 0 .github/ISSUE_TEMPLATE.md | 13 +++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 9 +++++++++ 3 files changed, 22 insertions(+) rename CONTRIBUTING.md => .github/CONTRIBUTING.md (100%) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/CONTRIBUTING.md b/.github/CONTRIBUTING.md similarity index 100% rename from CONTRIBUTING.md rename to .github/CONTRIBUTING.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..a7a7482a --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,13 @@ +### Expected behaviour + +### Actual behaviour + +### Environment and debugging details + +- compiler and version +- operating system +- libcurl version and compile flags +- full error output of your build as an inline codeblock or gist + +(some of these things might not apply but the more you can provide the easier +it will be to fix this bug. Thanks!) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..f4d4e3fd --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,9 @@ +## Checklist +Not all of these might apply to your change but the more you are able to check +the easier it will be to get your contribution merged. + +- [ ] CI passes +- [ ] Description of proposed change +- [ ] Documentation (README, code doc blocks, etc) is updated +- [ ] Existing issue is referenced if there is one +- [ ] Unit tests for the proposed change From d3d2f18c5cdec35b5d4c5c1aad62a7c430c88758 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 2 Dec 2016 10:53:22 -0500 Subject: [PATCH 130/212] update docs for HTTPS user certificate feature --- docs/index.md | 19 ++ docs/ref/annotated.html | 2 +- ...ss_rest_client_1_1_connection-members.html | 15 +- .../ref/class_rest_client_1_1_connection.html | 21 ++- docs/ref/classes.html | 2 +- docs/ref/connection_8h.html | 2 +- docs/ref/connection_8h_source.html | 176 ++++++++++-------- .../dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html | 2 +- .../dir_d44c64559bbebec7f509842c48db8b23.html | 2 +- .../dir_d7863d21b35bfd92001c24d3be435c80.html | 4 +- docs/ref/files.html | 5 +- docs/ref/functions.html | 4 +- docs/ref/functions_func.html | 4 +- docs/ref/functions_vars.html | 2 +- docs/ref/helpers_8h.html | 2 +- docs/ref/helpers_8h_source.html | 2 +- docs/ref/index.html | 8 +- docs/ref/md__c_h_a_n_g_e_l_o_g.html | 2 +- docs/ref/namespace_rest_client.html | 2 +- .../namespace_rest_client_1_1_helpers.html | 2 +- docs/ref/namespacemembers.html | 2 +- docs/ref/namespacemembers_func.html | 2 +- docs/ref/namespacemembers_type.html | 2 +- docs/ref/namespaces.html | 2 +- docs/ref/pages.html | 3 +- docs/ref/restclient_8h.html | 2 +- docs/ref/restclient_8h_source.html | 2 +- docs/ref/search/all_2.js | 5 +- docs/ref/search/all_4.js | 2 +- docs/ref/search/functions_1.js | 2 +- docs/ref/search/pages_0.js | 3 +- ...lient_1_1_connection_1_1_info-members.html | 13 +- ...t_rest_client_1_1_connection_1_1_info.html | 11 +- ...1_connection_1_1_request_info-members.html | 2 +- ...lient_1_1_connection_1_1_request_info.html | 2 +- ...1_1_helpers_1_1_upload_object-members.html | 2 +- ..._client_1_1_helpers_1_1_upload_object.html | 2 +- ...ruct_rest_client_1_1_response-members.html | 2 +- docs/ref/struct_rest_client_1_1_response.html | 2 +- 39 files changed, 199 insertions(+), 142 deletions(-) diff --git a/docs/index.md b/docs/index.md index 32c91f3b..842c7633 100644 --- a/docs/index.md +++ b/docs/index.md @@ -117,6 +117,10 @@ typedef struct { std::string username; std::string password; } basicAuth; + + std::string certPath; + std::string certType; + std::string keyPath; std::string customUserAgent; struct { // total time of the last request in seconds Total time of previous @@ -168,6 +172,21 @@ In order to provide an easy to use API, the simple usage via the static methods implicitly calls the curl global functions and is therefore also **not thread-safe**. +## HTTPS User Certificate + +Simple wrapper functions are provided to allow clients to authenticate using certificates. +Under the hood these wrappers set cURL options, e.g. `CURLOPT_SSLCERT`, using `curl_easy_setopt`. +Note: currently `libcurl` compiled with `gnutls` (e.g. `libcurl4-gnutls-dev` on +ubuntu) is buggy in that it returns a wrong error code when these options are set to invalid values. + +```cpp +// set CURLOPT_SSLCERT +conn->SetCertPath(certPath); +// set CURLOPT_SSLCERTTYPE +conn->SetCertType(type); +// set CURLOPT_SSLKEY +conn->SetKeyPath(keyPath); +``` ## Dependencies - [libcurl][] diff --git a/docs/ref/annotated.html b/docs/ref/annotated.html index 07f3466f..eb3c5ccf 100644 --- a/docs/ref/annotated.html +++ b/docs/ref/annotated.html @@ -102,7 +102,7 @@ diff --git a/docs/ref/class_rest_client_1_1_connection-members.html b/docs/ref/class_rest_client_1_1_connection-members.html index 7cdc1743..e4fcaf31 100644 --- a/docs/ref/class_rest_client_1_1_connection-members.html +++ b/docs/ref/class_rest_client_1_1_connection-members.html @@ -96,7 +96,7 @@

This is the complete list of members for RestClient::Connection, including all inherited members.

- + @@ -109,15 +109,18 @@ + + - - - - + + + + +
AppendHeader(const std::string &key, const std::string &value)RestClient::Connection
Connection(const std::string baseUrl)RestClient::Connectionexplicit
Connection(const std::string &baseUrl)RestClient::Connectionexplicit
del(const std::string &uri)RestClient::Connection
FollowRedirects(bool follow)RestClient::Connection
get(const std::string &uri)RestClient::Connection
put(const std::string &uri, const std::string &data)RestClient::Connection
SetBasicAuth(const std::string &username, const std::string &password)RestClient::Connection
SetCAInfoFilePath(const std::string &caInfoFilePath)RestClient::Connection
SetCertPath(const std::string &cert) (defined in RestClient::Connection)RestClient::Connection
SetCertType(const std::string &type) (defined in RestClient::Connection)RestClient::Connection
SetHeaders(RestClient::HeaderFields headers)RestClient::Connection
SetTimeout(int seconds)RestClient::Connection
SetUserAgent(const std::string &userAgent)RestClient::Connection
username (defined in RestClient::Connection)RestClient::Connection
~Connection() (defined in RestClient::Connection)RestClient::Connection
SetKeyPath(const std::string &keyPath) (defined in RestClient::Connection)RestClient::Connection
SetTimeout(int seconds)RestClient::Connection
SetUserAgent(const std::string &userAgent)RestClient::Connection
username (defined in RestClient::Connection)RestClient::Connection
~Connection() (defined in RestClient::Connection)RestClient::Connection
diff --git a/docs/ref/class_rest_client_1_1_connection.html b/docs/ref/class_rest_client_1_1_connection.html index a85f9cde..6e5b7044 100644 --- a/docs/ref/class_rest_client_1_1_connection.html +++ b/docs/ref/class_rest_client_1_1_connection.html @@ -113,9 +113,9 @@ - - - + + + @@ -131,6 +131,15 @@ + + + + + + @@ -165,7 +174,7 @@

Detailed Description

Connection object for advanced usage.

Constructor & Destructor Documentation

- +

Public Member Functions

 Connection (const std::string baseUrl)
 constructor for the Connection object More...
 
 Connection (const std::string &baseUrl)
 constructor for the Connection object More...
 
void SetBasicAuth (const std::string &username, const std::string &password)
 set username and password for basic auth More...
 
void SetCAInfoFilePath (const std::string &caInfoFilePath)
 set custom Certificate Authority (CA) path More...
 
+void SetCertPath (const std::string &cert)
 
+void SetCertType (const std::string &type)
 
+void SetKeyPath (const std::string &keyPath)
 
std::string GetUserAgent ()
 get the user agent to add to the request More...
 
@@ -175,7 +184,7 @@ - + @@ -607,7 +616,7 @@

Member Function Documentation

diff --git a/docs/ref/classes.html b/docs/ref/classes.html index 0c4b21de..8c1e0c40 100644 --- a/docs/ref/classes.html +++ b/docs/ref/classes.html @@ -104,7 +104,7 @@ diff --git a/docs/ref/connection_8h.html b/docs/ref/connection_8h.html index 682a77ea..587f6e7e 100644 --- a/docs/ref/connection_8h.html +++ b/docs/ref/connection_8h.html @@ -131,7 +131,7 @@ diff --git a/docs/ref/connection_8h_source.html b/docs/ref/connection_8h_source.html index 2d745a89..fb9ca6fe 100644 --- a/docs/ref/connection_8h_source.html +++ b/docs/ref/connection_8h_source.html @@ -125,115 +125,131 @@
99  std::string username;
100  std::string password;
101  } basicAuth;
-
102  std::string customUserAgent;
- -
104  } Info;
-
105 
-
106 
-
107  explicit Connection(const std::string baseUrl);
-
108  ~Connection();
+
102 
+
103  std::string certPath;
+
104  std::string certType;
+
105  std::string keyPath;
+
106  std::string customUserAgent;
+ +
108  } Info;
109 
-
110  // Instance configuration methods
-
111  // configure basic auth
-
112  void SetBasicAuth(const std::string& username,
-
113  const std::string& password);
-
114 
-
115  // set connection timeout to seconds
-
116  void SetTimeout(int seconds);
-
117 
-
118  // set whether to follow redirects
-
119  void FollowRedirects(bool follow);
-
120 
-
121  // set custom user agent
-
122  // (this will result in the UA "foo/cool restclient-cpp/VERSION")
-
123  void SetUserAgent(const std::string& userAgent);
+
110 
+
111  explicit Connection(const std::string& baseUrl);
+
112  ~Connection();
+
113 
+
114  // Instance configuration methods
+
115  // configure basic auth
+
116  void SetBasicAuth(const std::string& username,
+
117  const std::string& password);
+
118 
+
119  // set connection timeout to seconds
+
120  void SetTimeout(int seconds);
+
121 
+
122  // set whether to follow redirects
+
123  void FollowRedirects(bool follow);
124 
-
125  // set the Certificate Authority (CA) Info which is the path to file holding
-
126  // certificates to be used to verify peers. See CURLOPT_CAINFO
-
127  void SetCAInfoFilePath(const std::string& caInfoFilePath);
+
125  // set custom user agent
+
126  // (this will result in the UA "foo/cool restclient-cpp/VERSION")
+
127  void SetUserAgent(const std::string& userAgent);
128 
-
129  std::string GetUserAgent();
-
130 
- +
129  // set the Certificate Authority (CA) Info which is the path to file holding
+
130  // certificates to be used to verify peers. See CURLOPT_CAINFO
+
131  void SetCAInfoFilePath(const std::string& caInfoFilePath);
132 
-
133  // set headers
-
134  void SetHeaders(RestClient::HeaderFields headers);
+
133  // set CURLOPT_SSLCERT
+
134  void SetCertPath(const std::string& cert);
135 
-
136  // get headers
- +
136  // set CURLOPT_SSLCERTTYPE
+
137  void SetCertType(const std::string& type);
138 
-
139  // append additional headers
-
140  void AppendHeader(const std::string& key,
-
141  const std::string& value);
-
142 
+
139  // set CURLOPT_SSLKEY. Default format is PEM
+
140  void SetKeyPath(const std::string& keyPath);
+
141 
+
142  std::string GetUserAgent();
143 
-
144  // Basic HTTP verb methods
-
145  RestClient::Response get(const std::string& uri);
-
146  RestClient::Response post(const std::string& uri,
-
147  const std::string& data);
-
148  RestClient::Response put(const std::string& uri,
-
149  const std::string& data);
-
150  RestClient::Response del(const std::string& uri);
-
151  RestClient::Response head(const std::string& uri);
-
152 
-
153  private:
-
154  CURL* curlHandle;
-
155  std::string baseUrl;
-
156  RestClient::HeaderFields headerFields;
-
157  int timeout;
-
158  bool followRedirects;
-
159  struct {
-
160  std::string username;
-
161  std::string password;
-
162  } basicAuth;
-
163  std::string customUserAgent;
-
164  std::string caInfoFilePath;
-
165  RequestInfo lastRequest;
-
166  RestClient::Response performCurlRequest(const std::string& uri);
-
167 };
-
168 }; // namespace RestClient
-
169 
-
170 #endif // INCLUDE_RESTCLIENT_CPP_CONNECTION_H_
+ +
145 
+
146  // set headers
+
147  void SetHeaders(RestClient::HeaderFields headers);
+
148 
+
149  // get headers
+ +
151 
+
152  // append additional headers
+
153  void AppendHeader(const std::string& key,
+
154  const std::string& value);
+
155 
+
156 
+
157  // Basic HTTP verb methods
+
158  RestClient::Response get(const std::string& uri);
+
159  RestClient::Response post(const std::string& uri,
+
160  const std::string& data);
+
161  RestClient::Response put(const std::string& uri,
+
162  const std::string& data);
+
163  RestClient::Response del(const std::string& uri);
+
164  RestClient::Response head(const std::string& uri);
+
165 
+
166  private:
+
167  CURL* curlHandle;
+
168  std::string baseUrl;
+
169  RestClient::HeaderFields headerFields;
+
170  int timeout;
+
171  bool followRedirects;
+
172  struct {
+
173  std::string username;
+
174  std::string password;
+
175  } basicAuth;
+
176  std::string customUserAgent;
+
177  std::string caInfoFilePath;
+
178  RequestInfo lastRequest;
+
179  std::string certPath;
+
180  std::string certType;
+
181  std::string keyPath;
+
182  RestClient::Response performCurlRequest(const std::string& uri);
+
183 };
+
184 }; // namespace RestClient
+
185 
+
186 #endif // INCLUDE_RESTCLIENT_CPP_CONNECTION_H_
This structure represents the HTTP response data.
Definition: restclient.h:38
-
RestClient::HeaderFields GetHeaders()
get all custom headers set on the connection
Definition: connection.cc:96
+
RestClient::HeaderFields GetHeaders()
get all custom headers set on the connection
Definition: connection.cc:105
double totalTime
Definition: connection.h:61
double preTransferTime
Definition: connection.h:65
double redirectTime
Definition: connection.h:67
-
RestClient::Connection::Info GetInfo()
get diagnostic information about the connection object
Definition: connection.cc:52
+
RestClient::Connection::Info GetInfo()
get diagnostic information about the connection object
Definition: connection.cc:53
libcurl wrapper for REST calls
-
void FollowRedirects(bool follow)
configure whether to follow redirects on this connection
Definition: connection.cc:106
+
void FollowRedirects(bool follow)
configure whether to follow redirects on this connection
Definition: connection.cc:115
+
Connection(const std::string &baseUrl)
constructor for the Connection object
Definition: connection.cc:28
holds some diagnostics information about a request
Definition: connection.h:60
int redirectCount
Definition: connection.h:68
holds some diagnostics information about the connection object it came from
Definition: connection.h:93
RestClient::HeaderFields headers
Definition: connection.h:95
-
void SetUserAgent(const std::string &userAgent)
set custom user agent for connection. This gets prepended to the default restclient-cpp/RESTCLIENT_VE...
Definition: connection.cc:118
-
std::string GetUserAgent()
get the user agent to add to the request
Definition: connection.cc:140
-
void SetHeaders(RestClient::HeaderFields headers)
set the custom headers map. This will replace the currently configured headers with the provided ones...
Definition: connection.cc:86
-
void SetCAInfoFilePath(const std::string &caInfoFilePath)
set custom Certificate Authority (CA) path
Definition: connection.cc:130
+
void SetUserAgent(const std::string &userAgent)
set custom user agent for connection. This gets prepended to the default restclient-cpp/RESTCLIENT_VE...
Definition: connection.cc:127
+
std::string GetUserAgent()
get the user agent to add to the request
Definition: connection.cc:149
+
void SetHeaders(RestClient::HeaderFields headers)
set the custom headers map. This will replace the currently configured headers with the provided ones...
Definition: connection.cc:91
+
void SetCAInfoFilePath(const std::string &caInfoFilePath)
set custom Certificate Authority (CA) path
Definition: connection.cc:139
std::map< std::string, std::string > HeaderFields
Definition: restclient.h:27
-
RestClient::Response post(const std::string &uri, const std::string &data)
HTTP POST method.
Definition: connection.cc:303
-
void SetTimeout(int seconds)
set timeout for connection
Definition: connection.cc:155
-
void AppendHeader(const std::string &key, const std::string &value)
append a header to the internal map
Definition: connection.cc:73
-
RestClient::Response del(const std::string &uri)
HTTP DELETE method.
Definition: connection.cc:351
-
RestClient::Response put(const std::string &uri, const std::string &data)
HTTP PUT method.
Definition: connection.cc:322
-
RestClient::Response head(const std::string &uri)
HTTP HEAD method.
Definition: connection.cc:369
+
RestClient::Response post(const std::string &uri, const std::string &data)
HTTP POST method.
Definition: connection.cc:351
+
void SetTimeout(int seconds)
set timeout for connection
Definition: connection.cc:164
+
void AppendHeader(const std::string &key, const std::string &value)
append a header to the internal map
Definition: connection.cc:78
+
RestClient::Response del(const std::string &uri)
HTTP DELETE method.
Definition: connection.cc:399
+
RestClient::Response put(const std::string &uri, const std::string &data)
HTTP PUT method.
Definition: connection.cc:370
+
RestClient::Response head(const std::string &uri)
HTTP HEAD method.
Definition: connection.cc:417
double startTransferTime
Definition: connection.h:66
-
Connection(const std::string baseUrl)
constructor for the Connection object
Definition: connection.cc:27
Connection object for advanced usage.
Definition: connection.h:28
bool followRedirects
Definition: connection.h:97
-
std::string customUserAgent
Definition: connection.h:102
+
std::string customUserAgent
Definition: connection.h:106
std::string baseUrl
Definition: connection.h:94
double appConnectTime
Definition: connection.h:64
double connectTime
Definition: connection.h:63
double nameLookupTime
Definition: connection.h:62
-
RequestInfo lastRequest
Definition: connection.h:103
-
void SetBasicAuth(const std::string &username, const std::string &password)
set username and password for basic auth
Definition: connection.cc:167
+
RequestInfo lastRequest
Definition: connection.h:107
+
void SetBasicAuth(const std::string &username, const std::string &password)
set username and password for basic auth
Definition: connection.cc:176
int timeout
Definition: connection.h:96
namespace for all RestClient definitions
Definition: connection.h:23
diff --git a/docs/ref/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html b/docs/ref/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html index 97aebb98..5f822a3a 100644 --- a/docs/ref/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html +++ b/docs/ref/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html @@ -98,7 +98,7 @@ diff --git a/docs/ref/dir_d44c64559bbebec7f509842c48db8b23.html b/docs/ref/dir_d44c64559bbebec7f509842c48db8b23.html index e39027e7..7bb9660c 100644 --- a/docs/ref/dir_d44c64559bbebec7f509842c48db8b23.html +++ b/docs/ref/dir_d44c64559bbebec7f509842c48db8b23.html @@ -94,7 +94,7 @@ diff --git a/docs/ref/dir_d7863d21b35bfd92001c24d3be435c80.html b/docs/ref/dir_d7863d21b35bfd92001c24d3be435c80.html index 79d10114..840049f3 100644 --- a/docs/ref/dir_d7863d21b35bfd92001c24d3be435c80.html +++ b/docs/ref/dir_d7863d21b35bfd92001c24d3be435c80.html @@ -97,13 +97,11 @@ - -
RestClient::Connection::Connection (const std::string const std::string &  baseUrl)
file  restclient.h [code]
 libcurl wrapper for REST calls
 
file  version.h [code]
 
diff --git a/docs/ref/files.html b/docs/ref/files.html index df59e921..2382fcb2 100644 --- a/docs/ref/files.html +++ b/docs/ref/files.html @@ -93,14 +93,13 @@  connection.hHeader definitions for restclient-cpp connection class  helpers.hHeader file for restclient-cpp helpers  restclient.hLibcurl wrapper for REST calls - version.h - config.h + config.h diff --git a/docs/ref/functions.html b/docs/ref/functions.html index d387b819..644d7a87 100644 --- a/docs/ref/functions.html +++ b/docs/ref/functions.html @@ -138,7 +138,7 @@

- c -

    : RestClient::Response
  • Connection() -: RestClient::Connection +: RestClient::Connection
  • connectTime : RestClient::Connection::RequestInfo @@ -269,7 +269,7 @@

    - t -

      diff --git a/docs/ref/functions_func.html b/docs/ref/functions_func.html index 5d602dd8..eaef5f5b 100644 --- a/docs/ref/functions_func.html +++ b/docs/ref/functions_func.html @@ -96,7 +96,7 @@ : RestClient::Connection
    • Connection() -: RestClient::Connection +: RestClient::Connection
    • del() : RestClient::Connection @@ -144,7 +144,7 @@ diff --git a/docs/ref/functions_vars.html b/docs/ref/functions_vars.html index be506ecd..d6240582 100644 --- a/docs/ref/functions_vars.html +++ b/docs/ref/functions_vars.html @@ -154,7 +154,7 @@ diff --git a/docs/ref/helpers_8h.html b/docs/ref/helpers_8h.html index 92d0bf55..028550dd 100644 --- a/docs/ref/helpers_8h.html +++ b/docs/ref/helpers_8h.html @@ -139,7 +139,7 @@ diff --git a/docs/ref/helpers_8h_source.html b/docs/ref/helpers_8h_source.html index 6b3c9bc6..e0209fda 100644 --- a/docs/ref/helpers_8h_source.html +++ b/docs/ref/helpers_8h_source.html @@ -153,7 +153,7 @@ diff --git a/docs/ref/index.html b/docs/ref/index.html index bea8a01e..9771908a 100644 --- a/docs/ref/index.html +++ b/docs/ref/index.html @@ -114,12 +114,16 @@

      Advanced Usage

      The responses are again of type RestClient::Response and have three attributes:

      ```cpp RestClient::Response.code // HTTP response code RestClient::Response.body // HTTP response body RestClient::Response.headers // HTTP response headers ```

      The connection object also provides a simple way to get some diagnostics and metrics information via conn->GetInfo(). The result is a RestClient::Connection::Info struct and looks like this:

      -

      ```cpp typedef struct { std::string base_url; RestClients::HeaderFields headers; int timeout; struct { std::string username; std::string password; } basicAuth; std::string customUserAgent; struct { // total time of the last request in seconds Total time of previous // transfer. See CURLINFO_TOTAL_TIME int totalTime; // time spent in DNS lookup in seconds Time from start until name // resolving completed. See CURLINFO_NAMELOOKUP_TIME int nameLookupTime; // time it took until Time from start until remote host or proxy // completed. See CURLINFO_CONNECT_TIME int connectTime; // Time from start until SSL/SSH handshake completed. See // CURLINFO_APPCONNECT_TIME int appConnectTime; // Time from start until just before the transfer begins. See // CURLINFO_PRETRANSFER_TIME int preTransferTime; // Time from start until just when the first byte is received. See // CURLINFO_STARTTRANSFER_TIME int startTransferTime; // Time taken for all redirect steps before the final transfer. See // CURLINFO_REDIRECT_TIME int redirectTime; // number of redirects followed. See CURLINFO_REDIRECT_COUNT int redirectCount; } lastRequest; } Info; ```

      +

      ```cpp typedef struct { std::string base_url; RestClients::HeaderFields headers; int timeout; struct { std::string username; std::string password; } basicAuth;

      +

      std::string certPath; std::string certType; std::string keyPath; std::string customUserAgent; struct { // total time of the last request in seconds Total time of previous // transfer. See CURLINFO_TOTAL_TIME int totalTime; // time spent in DNS lookup in seconds Time from start until name // resolving completed. See CURLINFO_NAMELOOKUP_TIME int nameLookupTime; // time it took until Time from start until remote host or proxy // completed. See CURLINFO_CONNECT_TIME int connectTime; // Time from start until SSL/SSH handshake completed. See // CURLINFO_APPCONNECT_TIME int appConnectTime; // Time from start until just before the transfer begins. See // CURLINFO_PRETRANSFER_TIME int preTransferTime; // Time from start until just when the first byte is received. See // CURLINFO_STARTTRANSFER_TIME int startTransferTime; // Time taken for all redirect steps before the final transfer. See // CURLINFO_REDIRECT_TIME int redirectTime; // number of redirects followed. See CURLINFO_REDIRECT_COUNT int redirectCount; } lastRequest; } Info; ```

      Persistent connections/Keep-Alive

      The connection object stores the curl easy handle in an instance variable and uses that for the lifetime of the object. This means curl will automatically reuse connections made with that handle.

      Thread Safety

      restclient-cpp leans heavily on libcurl as it aims to provide a thin wrapper around it. This means it adheres to the basic level of thread safety provided by libcurl. The RestClient::init() and RestClient::disable() methods basically correspond to curl_global_init and curl_global_cleanup and thus need to be called right at the beginning of your program and before shutdown respectively. These set up the environment and are not thread-safe. After that you can create connection objects in your threads. Do not share connection objects across threads as this would mean accessing curl handles from multiple threads at the same time which is not allowed.

      In order to provide an easy to use API, the simple usage via the static methods implicitly calls the curl global functions and is therefore also not thread-safe.

      +

      HTTPS User Certificate

      +

      Simple wrapper functions are provided to allow clients to authenticate using certificates. Under the hood these wrappers set cURL options, e.g. CURLOPT_SSLCERT, using curl_easy_setopt. Note: currently libcurl compiled with gnutls (e.g. libcurl4-gnutls-dev on ubuntu) is buggy in that it returns a wrong error code when these options are set to invalid values.

      +

      ```cpp // set CURLOPT_SSLCERT conn->SetCertPath(certPath); // set CURLOPT_SSLCERTTYPE conn->SetCertType(type); // set CURLOPT_SSLKEY conn->SetKeyPath(keyPath); ```

      Dependencies

      • libcurl
      • @@ -134,7 +138,7 @@

        Contribute

        diff --git a/docs/ref/md__c_h_a_n_g_e_l_o_g.html b/docs/ref/md__c_h_a_n_g_e_l_o_g.html index 2f44d935..f9e0bfa2 100644 --- a/docs/ref/md__c_h_a_n_g_e_l_o_g.html +++ b/docs/ref/md__c_h_a_n_g_e_l_o_g.html @@ -176,7 +176,7 @@

        v0.1.0 (15th October 2010)

        diff --git a/docs/ref/namespace_rest_client.html b/docs/ref/namespace_rest_client.html index 548a6d78..953bb3b1 100644 --- a/docs/ref/namespace_rest_client.html +++ b/docs/ref/namespace_rest_client.html @@ -324,7 +324,7 @@

        Function Documentation

        diff --git a/docs/ref/namespace_rest_client_1_1_helpers.html b/docs/ref/namespace_rest_client_1_1_helpers.html index 55082211..1bbe321a 100644 --- a/docs/ref/namespace_rest_client_1_1_helpers.html +++ b/docs/ref/namespace_rest_client_1_1_helpers.html @@ -277,7 +277,7 @@ diff --git a/docs/ref/namespacemembers.html b/docs/ref/namespacemembers.html index 9f04d6a4..34e466d0 100644 --- a/docs/ref/namespacemembers.html +++ b/docs/ref/namespacemembers.html @@ -128,7 +128,7 @@ diff --git a/docs/ref/namespacemembers_func.html b/docs/ref/namespacemembers_func.html index e5dd393d..2c2a7b29 100644 --- a/docs/ref/namespacemembers_func.html +++ b/docs/ref/namespacemembers_func.html @@ -125,7 +125,7 @@ diff --git a/docs/ref/namespacemembers_type.html b/docs/ref/namespacemembers_type.html index 8b06b1e6..601147a2 100644 --- a/docs/ref/namespacemembers_type.html +++ b/docs/ref/namespacemembers_type.html @@ -98,7 +98,7 @@ diff --git a/docs/ref/namespaces.html b/docs/ref/namespaces.html index c4f6792d..7559672f 100644 --- a/docs/ref/namespaces.html +++ b/docs/ref/namespaces.html @@ -96,7 +96,7 @@ diff --git a/docs/ref/pages.html b/docs/ref/pages.html index 40610948..0d489b85 100644 --- a/docs/ref/pages.html +++ b/docs/ref/pages.html @@ -84,13 +84,12 @@
        Here is a list of all related documentation pages:
        diff --git a/docs/ref/restclient_8h.html b/docs/ref/restclient_8h.html index 015cac9b..5a633c69 100644 --- a/docs/ref/restclient_8h.html +++ b/docs/ref/restclient_8h.html @@ -157,7 +157,7 @@ diff --git a/docs/ref/restclient_8h_source.html b/docs/ref/restclient_8h_source.html index ede253f3..ebbbf49e 100644 --- a/docs/ref/restclient_8h_source.html +++ b/docs/ref/restclient_8h_source.html @@ -143,7 +143,7 @@ diff --git a/docs/ref/search/all_2.js b/docs/ref/search/all_2.js index 228e6700..522517e9 100644 --- a/docs/ref/search/all_2.js +++ b/docs/ref/search/all_2.js @@ -1,11 +1,10 @@ var searchData= [ ['code',['code',['../struct_rest_client_1_1_response.html#a3b3b63aeae7ca761d54a009ee329ea28',1,'RestClient::Response']]], - ['connection',['Connection',['../class_rest_client_1_1_connection.html#a42f991cc28f62deb120b96a50534884e',1,'RestClient::Connection']]], + ['connection',['Connection',['../class_rest_client_1_1_connection.html#a658af2c6d1300c8a02e7f6436b43b4c9',1,'RestClient::Connection']]], ['connection',['Connection',['../class_rest_client_1_1_connection.html',1,'RestClient']]], ['connection_2eh',['connection.h',['../connection_8h.html',1,'']]], ['connecttime',['connectTime',['../struct_rest_client_1_1_connection_1_1_request_info.html#a7c8347cc41e35a944663d333baea88a9',1,'RestClient::Connection::RequestInfo']]], ['customuseragent',['customUserAgent',['../struct_rest_client_1_1_connection_1_1_info.html#a8cec6f505e26773638ea7c2df895b5e8',1,'RestClient::Connection::Info']]], - ['changelog',['Changelog',['../md__c_h_a_n_g_e_l_o_g.html',1,'']]], - ['contribute',['Contribute',['../md__c_o_n_t_r_i_b_u_t_i_n_g.html',1,'']]] + ['changelog',['Changelog',['../md__c_h_a_n_g_e_l_o_g.html',1,'']]] ]; diff --git a/docs/ref/search/all_4.js b/docs/ref/search/all_4.js index 1945e234..43390dbe 100644 --- a/docs/ref/search/all_4.js +++ b/docs/ref/search/all_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['followredirects',['followRedirects',['../struct_rest_client_1_1_connection_1_1_info.html#a4b194ea487bf48f55e597b3146bc0c9b',1,'RestClient::Connection::Info::followRedirects()'],['../class_rest_client_1_1_connection.html#a77c9d405950492f9bcec21ce79edd2b3',1,'RestClient::Connection::FollowRedirects()']]] + ['followredirects',['FollowRedirects',['../class_rest_client_1_1_connection.html#a77c9d405950492f9bcec21ce79edd2b3',1,'RestClient::Connection::FollowRedirects()'],['../struct_rest_client_1_1_connection_1_1_info.html#a4b194ea487bf48f55e597b3146bc0c9b',1,'RestClient::Connection::Info::followRedirects()']]] ]; diff --git a/docs/ref/search/functions_1.js b/docs/ref/search/functions_1.js index f6dde7a9..50199c4a 100644 --- a/docs/ref/search/functions_1.js +++ b/docs/ref/search/functions_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['connection',['Connection',['../class_rest_client_1_1_connection.html#a42f991cc28f62deb120b96a50534884e',1,'RestClient::Connection']]] + ['connection',['Connection',['../class_rest_client_1_1_connection.html#a658af2c6d1300c8a02e7f6436b43b4c9',1,'RestClient::Connection']]] ]; diff --git a/docs/ref/search/pages_0.js b/docs/ref/search/pages_0.js index b64fc338..c698a484 100644 --- a/docs/ref/search/pages_0.js +++ b/docs/ref/search/pages_0.js @@ -1,5 +1,4 @@ var searchData= [ - ['changelog',['Changelog',['../md__c_h_a_n_g_e_l_o_g.html',1,'']]], - ['contribute',['Contribute',['../md__c_o_n_t_r_i_b_u_t_i_n_g.html',1,'']]] + ['changelog',['Changelog',['../md__c_h_a_n_g_e_l_o_g.html',1,'']]] ]; diff --git a/docs/ref/struct_rest_client_1_1_connection_1_1_info-members.html b/docs/ref/struct_rest_client_1_1_connection_1_1_info-members.html index cf2c7d37..7e1f66ff 100644 --- a/docs/ref/struct_rest_client_1_1_connection_1_1_info-members.html +++ b/docs/ref/struct_rest_client_1_1_connection_1_1_info-members.html @@ -97,17 +97,20 @@ + + - - - - + + + + +
        baseUrlRestClient::Connection::Info
        basicAuthRestClient::Connection::Info
        certPath (defined in RestClient::Connection::Info)RestClient::Connection::Info
        certType (defined in RestClient::Connection::Info)RestClient::Connection::Info
        customUserAgentRestClient::Connection::Info
        followRedirectsRestClient::Connection::Info
        headersRestClient::Connection::Info
        lastRequestRestClient::Connection::Info
        password (defined in RestClient::Connection::Info)RestClient::Connection::Info
        timeoutRestClient::Connection::Info
        username (defined in RestClient::Connection::Info)RestClient::Connection::Info
        keyPath (defined in RestClient::Connection::Info)RestClient::Connection::Info
        lastRequestRestClient::Connection::Info
        password (defined in RestClient::Connection::Info)RestClient::Connection::Info
        timeoutRestClient::Connection::Info
        username (defined in RestClient::Connection::Info)RestClient::Connection::Info
        diff --git a/docs/ref/struct_rest_client_1_1_connection_1_1_info.html b/docs/ref/struct_rest_client_1_1_connection_1_1_info.html index ca99d322..29a92a12 100644 --- a/docs/ref/struct_rest_client_1_1_connection_1_1_info.html +++ b/docs/ref/struct_rest_client_1_1_connection_1_1_info.html @@ -120,6 +120,15 @@   } basicAuth   + +std::string certPath +  + +std::string certType +  + +std::string keyPath +  std::string customUserAgent   RequestInfo lastRequest @@ -225,7 +234,7 @@ diff --git a/docs/ref/struct_rest_client_1_1_connection_1_1_request_info-members.html b/docs/ref/struct_rest_client_1_1_connection_1_1_request_info-members.html index a5b1132c..88fde378 100644 --- a/docs/ref/struct_rest_client_1_1_connection_1_1_request_info-members.html +++ b/docs/ref/struct_rest_client_1_1_connection_1_1_request_info-members.html @@ -106,7 +106,7 @@ diff --git a/docs/ref/struct_rest_client_1_1_connection_1_1_request_info.html b/docs/ref/struct_rest_client_1_1_connection_1_1_request_info.html index 7766c397..a63358d0 100644 --- a/docs/ref/struct_rest_client_1_1_connection_1_1_request_info.html +++ b/docs/ref/struct_rest_client_1_1_connection_1_1_request_info.html @@ -233,7 +233,7 @@ diff --git a/docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object-members.html b/docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object-members.html index c0e9d34c..d57d89bd 100644 --- a/docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object-members.html +++ b/docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object-members.html @@ -100,7 +100,7 @@ diff --git a/docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object.html b/docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object.html index f61c709c..a58b8bf4 100644 --- a/docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object.html +++ b/docs/ref/struct_rest_client_1_1_helpers_1_1_upload_object.html @@ -143,7 +143,7 @@ diff --git a/docs/ref/struct_rest_client_1_1_response-members.html b/docs/ref/struct_rest_client_1_1_response-members.html index e8027897..f6e4df5b 100644 --- a/docs/ref/struct_rest_client_1_1_response-members.html +++ b/docs/ref/struct_rest_client_1_1_response-members.html @@ -101,7 +101,7 @@ diff --git a/docs/ref/struct_rest_client_1_1_response.html b/docs/ref/struct_rest_client_1_1_response.html index f064312f..2e2b4afe 100644 --- a/docs/ref/struct_rest_client_1_1_response.html +++ b/docs/ref/struct_rest_client_1_1_response.html @@ -158,7 +158,7 @@ From b0e0c0a91b8666ea9c64d6c204fa1a7f41b57ea0 Mon Sep 17 00:00:00 2001 From: Chris Kruger Date: Fri, 2 Dec 2016 13:33:15 +0800 Subject: [PATCH 131/212] no-signal capability this adds a method to the connection object to be able to turn off libcurl signals for use in multi-threaded context. closes #67 --- README.md | 2 ++ include/restclient-cpp/connection.h | 5 +++++ source/connection.cc | 21 +++++++++++++++++++++ test/test_connection.cc | 7 +++++++ 4 files changed, 35 insertions(+) diff --git a/README.md b/README.md index 4ce22065..802c9d34 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,8 @@ your threads. Do not share connection objects across threads as this would mean accessing curl handles from multiple threads at the same time which is not allowed. +The connection level method SetNoSignal can be set to skip all signal handling. This is important in multi-threaded applications as DNS resolution timeouts use signals. The signal handlers quite readily get executed on other threads. Note that with this option DNS resolution timeouts do not work. If you have crashes in your multi-threaded executable that appear to be in DNS resolution, this is probably why. + In order to provide an easy to use API, the simple usage via the static methods implicitly calls the curl global functions and is therefore also **not thread-safe**. diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index a9dc9116..158f1cde 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -95,6 +95,7 @@ class Connection { RestClient::HeaderFields headers; int timeout; bool followRedirects; + bool noSignal; struct { std::string username; std::string password; @@ -119,6 +120,9 @@ class Connection { // set connection timeout to seconds void SetTimeout(int seconds); + // set to not use signals + void SetNoSignal(bool no); + // set whether to follow redirects void FollowRedirects(bool follow); @@ -169,6 +173,7 @@ class Connection { RestClient::HeaderFields headerFields; int timeout; bool followRedirects; + bool noSignal; struct { std::string username; std::string password; diff --git a/source/connection.cc b/source/connection.cc index b775e7c2..5599dc25 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -34,6 +34,7 @@ RestClient::Connection::Connection(const std::string& baseUrl) this->baseUrl = baseUrl; this->timeout = 0; this->followRedirects = false; + this->noSignal = false; } RestClient::Connection::~Connection() { @@ -55,6 +56,8 @@ RestClient::Connection::GetInfo() { ret.baseUrl = this->baseUrl; ret.headers = this->GetHeaders(); ret.timeout = this->timeout; + ret.followRedirects = this->followRedirects; + ret.noSignal = this->noSignal; ret.basicAuth.username = this->basicAuth.username; ret.basicAuth.password = this->basicAuth.password; ret.customUserAgent = this->customUserAgent; @@ -165,6 +168,18 @@ RestClient::Connection::SetTimeout(int seconds) { this->timeout = seconds; } +/** + * @brief switch off curl signals for connection (see CURLOPT_NONSIGNAL). By + * default signals are used, except when timeout is given. + * + * @param no - set to true switches signals off + * + */ +void +RestClient::Connection::SetNoSignal(bool no) { + this->noSignal = no; +} + /** * @brief set username and password for basic auth * @@ -261,6 +276,12 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { if (this->followRedirects == true) { curl_easy_setopt(this->curlHandle, CURLOPT_FOLLOWLOCATION, 1L); } + + if (this->noSignal) { + // multi-threaded and prevent entering foreign signal handler (e.g. JNI) + curl_easy_setopt(this->curlHandle, CURLOPT_NOSIGNAL, 1); + } + // if provided, supply CA path if (!this->caInfoFilePath.empty()) { curl_easy_setopt(this->curlHandle, CURLOPT_CAINFO, diff --git a/test/test_connection.cc b/test/test_connection.cc index 2e790e25..a785fd6d 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -207,3 +207,10 @@ TEST_F(ConnectionTest, TestHeadHeaders) EXPECT_EQ("bar", headers_returned["Foo"]); EXPECT_EQ("lol", headers_returned["Bla"]); } + +TEST_F(ConnectionTest, TestNoSignal) +{ + conn->SetNoSignal(true); + RestClient::Response res = conn->get("/get"); + EXPECT_EQ(200, res.code); +} From 83dc6909680c1f9cc21f5d6f82f02211408186dd Mon Sep 17 00:00:00 2001 From: amzoughi Date: Fri, 16 Dec 2016 01:02:44 +0100 Subject: [PATCH 132/212] Added web proxy tunneling support. this adds support for using proxies corresponding to the CURLOPT_PROXY and CURLOPT_HTTPPROXYTUNNEL config options in libcurl. closes #68 --- README.md | 21 +++++++++ include/restclient-cpp/connection.h | 20 +++++++++ source/connection.cc | 69 +++++++++++++++++++++++++++++ test/test_connection.cc | 23 ++++++++++ 4 files changed, 133 insertions(+) diff --git a/README.md b/README.md index 802c9d34..f84ede91 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,9 @@ typedef struct { std::string certPath; std::string certType; std::string keyPath; + std::string keyPassword; std::string customUserAgent; + std::string uriProxy; struct { // total time of the last request in seconds Total time of previous // transfer. See CURLINFO_TOTAL_TIME @@ -184,6 +186,25 @@ conn->SetCertPath(certPath); conn->SetCertType(type); // set CURLOPT_SSLKEY conn->SetKeyPath(keyPath); +// set CURLOPT_KEYPASSWD +conn->SetKeyPassword(keyPassword); +``` + +## HTTP Proxy Tunneling Support + +An HTTP Proxy can be set to use for the upcoming request. +To specify a port number, append :[port] to the end of the host name. If not specified, `libcurl` will default to using port 1080 for proxies. The proxy string may be prefixed with `http://` or `https://`. If no HTTP(S) scheme is specified, the address provided to `libcurl` will be prefixed with `http://` to specify an HTTP proxy. A proxy host string can embedded user + password. +The operation will be tunneled through the proxy as curl option `CURLOPT_HTTPPROXYTUNNEL` is enabled by default. +A numerical IPv6 address must be written within [brackets]. + +```cpp +// set CURLOPT_PROXY +conn->SetProxy("https://37.187.100.23:3128"); +/* or you can set it without the protocol scheme and +http:// will be prefixed by default */ +conn->SetProxy("37.187.100.23:3128"); +/* the following request will be tunneled through the proxy */ +RestClient::Response res = conn->get("/get"); ``` ## Dependencies diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index 158f1cde..087b6b4f 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -85,8 +85,18 @@ class Connection { * Member 'username' contains the basic auth username * @var basicAuth::password * Member 'password' contains the basic auth password + * @var Info::certPath + * Member 'certPath' contains the certificate file path + * @var Info::certType + * Member 'certType' contains the certificate type + * @var Info::keyPath + * Member 'keyPath' contains the SSL key file path + * @var Info::keyPassword + * Member 'keyPassword' contains the SSL key password * @var Info::customUserAgent * Member 'customUserAgent' contains the custom user agent + * @var Info::uriProxy + * Member 'uriProxy' contains the HTTP proxy address * @var Info::lastRequest * Member 'lastRequest' contains metrics about the last request */ @@ -104,7 +114,9 @@ class Connection { std::string certPath; std::string certType; std::string keyPath; + std::string keyPassword; std::string customUserAgent; + std::string uriProxy; RequestInfo lastRequest; } Info; @@ -143,6 +155,12 @@ class Connection { // set CURLOPT_SSLKEY. Default format is PEM void SetKeyPath(const std::string& keyPath); + // set CURLOPT_KEYPASSWD. + void SetKeyPassword(const std::string& keyPassword); + + // set CURLOPT_PROXY + void SetProxy(const std::string& uriProxy); + std::string GetUserAgent(); RestClient::Connection::Info GetInfo(); @@ -184,6 +202,8 @@ class Connection { std::string certPath; std::string certType; std::string keyPath; + std::string keyPassword; + std::string uriProxy; RestClient::Response performCurlRequest(const std::string& uri); }; }; // namespace RestClient diff --git a/source/connection.cc b/source/connection.cc index 5599dc25..e005ed7a 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -66,6 +66,9 @@ RestClient::Connection::GetInfo() { ret.certPath = this->certPath; ret.certType = this->certType; ret.keyPath = this->keyPath; + ret.keyPassword = this->keyPassword; + + ret.uriProxy = this->uriProxy; return ret; } @@ -194,21 +197,74 @@ RestClient::Connection::SetBasicAuth(const std::string& username, this->basicAuth.password = password; } +/** + * @brief set certificate path + * + * @param path to certificate file + * + */ void RestClient::Connection::SetCertPath(const std::string& cert) { this->certPath = cert; } +/** + * @brief set certificate type + * + * @param certificate type (e.g. "PEM" or "DER") + * + */ void RestClient::Connection::SetCertType(const std::string& certType) { this->certType = certType; } +/** + * @brief set key path + * + * @param path to key file + * + */ void RestClient::Connection::SetKeyPath(const std::string& keyPath) { this->keyPath = keyPath; } +/** + * @brief set key password + * + * @param key password + * + */ +void +RestClient::Connection::SetKeyPassword(const std::string& keyPassword) { + this->keyPassword = keyPassword; +} + +/** + * @brief set HTTP proxy address and port + * + * @param proxy address with port number + * + */ +void +RestClient::Connection::SetProxy(const std::string& uriProxy) { + if (uriProxy.empty()) { + return; + } + + std::string uriProxyUpper = uriProxy; + // check if the provided address is prefixed with "http" + std::transform(uriProxyUpper.begin(), uriProxyUpper.end(), + uriProxyUpper.begin(), ::toupper); + + if (uriProxyUpper.compare(0, 4, "HTTP") != 0) { + this->uriProxy = "http://" + uriProxy; + } else { + this->uriProxy = uriProxy; + } +} + /** * @brief helper function to get called from the actual request methods to * prepare the curlHandle for transfer with generic options, perform the @@ -304,6 +360,19 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { curl_easy_setopt(this->curlHandle, CURLOPT_SSLKEY, this->keyPath.c_str()); } + // set key password + if (!this->keyPassword.empty()) { + curl_easy_setopt(this->curlHandle, CURLOPT_KEYPASSWD, + this->keyPassword.c_str()); + } + + // set web proxy address + if (!this->uriProxy.empty()) { + curl_easy_setopt(this->curlHandle, CURLOPT_PROXY, + uriProxy.c_str()); + curl_easy_setopt(this->curlHandle, CURLOPT_HTTPPROXYTUNNEL, + 1L); + } res = curl_easy_perform(this->curlHandle); if (res != CURLE_OK) { diff --git a/test/test_connection.cc b/test/test_connection.cc index a785fd6d..b25ba0ed 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -96,6 +96,7 @@ TEST_F(ConnectionTest, TestSSLCert) { conn->SetCertPath("non-existent file"); conn->SetKeyPath("non-existent key path"); + conn->SetKeyPassword("imaginary_password"); conn->SetCertType("invalid cert type"); RestClient::Response res = conn->get("/get"); @@ -214,3 +215,25 @@ TEST_F(ConnectionTest, TestNoSignal) RestClient::Response res = conn->get("/get"); EXPECT_EQ(200, res.code); } + +TEST_F(ConnectionTest, TestProxy) +{ + conn->SetProxy("37.187.100.23:3128"); + RestClient::Response res = conn->get("/get"); + EXPECT_EQ(200, res.code); +} + +TEST_F(ConnectionTest, TestProxyAddressPrefixed) +{ + conn->SetProxy("https://37.187.100.23:3128"); + RestClient::Response res = conn->get("/get"); + EXPECT_EQ(200, res.code); +} + +TEST_F(ConnectionTest, TestInvalidProxy) +{ + conn->SetProxy("127.0.0.1:666"); + RestClient::Response res = conn->get("/get"); + EXPECT_EQ("Failed to query.", res.body); + EXPECT_EQ(-1, res.code); +} From f57092f075e82901072e2c8a1850d4e17defafca Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 23 Dec 2016 22:41:31 -0500 Subject: [PATCH 133/212] default to 10s timeout in unit tests this makes the conn object in unit tests default to a 10s timeout in order to fail fast if something is up with the connection or configured hosts. --- test/test_connection.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_connection.cc b/test/test_connection.cc index b25ba0ed..ba8805c0 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -22,6 +22,7 @@ class ConnectionTest : public ::testing::Test virtual void SetUp() { conn = new RestClient::Connection("https://httpbin.org"); + conn->SetTimeout(10); } virtual void TearDown() From b6f1dbbd9ed52de1813ef393e21b8f205d11d421 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 4 Jan 2017 10:02:48 -0500 Subject: [PATCH 134/212] add proxy server as docker service this makes the tests rely on a dockerized proxy service instead of a random server on the internet fixes #71, closes #72 --- .travis.yml | 9 +++++++++ test/test_connection.cc | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a8ddd2b0..63248e7e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,12 +2,21 @@ language: cpp dist: trusty sudo: required group: beta + +services: + - docker + compiler: - gcc - clang script: - ./autogen.sh && ./configure --enable-coverage - make ci + +before_install: + - docker pull chrisdaish/squid + - docker run -d -p 3128:3128 chrisdaish/squid + - docker ps -a install: - gem install fpm - gem install package_cloud diff --git a/test/test_connection.cc b/test/test_connection.cc index ba8805c0..adddbb9e 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -219,14 +219,14 @@ TEST_F(ConnectionTest, TestNoSignal) TEST_F(ConnectionTest, TestProxy) { - conn->SetProxy("37.187.100.23:3128"); + conn->SetProxy("127.0.0.1:3128"); RestClient::Response res = conn->get("/get"); EXPECT_EQ(200, res.code); } TEST_F(ConnectionTest, TestProxyAddressPrefixed) { - conn->SetProxy("https://37.187.100.23:3128"); + conn->SetProxy("https://127.0.0.1:3128"); RestClient::Response res = conn->get("/get"); EXPECT_EQ(200, res.code); } From 743133d02e96ee04860ebc5b60161440c9bb5455 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 4 Jan 2017 10:34:10 -0500 Subject: [PATCH 135/212] update CONTRIBUTING docs with proxy server details --- .github/CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index a78f2fe8..61416231 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -11,4 +11,5 @@ 1. build vendorized gtest: `./utils/build_gtest.sh` 2. build restclient-cpp: `./autogen.sh && ./configure && make check` -3. run the unit test suite: `make test` +3. run the proxy server used in testing: `docker run -d -p 3128:3128 chrisdaish/squid` +4. run the unit test suite: `make test` From 2b0399fa8843837a86b82e57174bd104636bdee6 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 4 Jan 2017 11:39:00 -0500 Subject: [PATCH 136/212] move docker setup into Makefile this moves the docker services setup into the Makefile making it easier to run the full CI test suite with just a single `make ci` command. --- .github/CONTRIBUTING.md | 6 ++++-- .travis.yml | 4 ---- Makefile.am | 8 ++++++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 61416231..8b738748 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -9,7 +9,9 @@ ## How to run tests +Since most of the tests are actually integration tests you will need to have a +working docker setup to make the full test suite pass. + 1. build vendorized gtest: `./utils/build_gtest.sh` 2. build restclient-cpp: `./autogen.sh && ./configure && make check` -3. run the proxy server used in testing: `docker run -d -p 3128:3128 chrisdaish/squid` -4. run the unit test suite: `make test` +3. run the unit test suite: `make ci` diff --git a/.travis.yml b/.travis.yml index 63248e7e..5fa01d08 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,10 +13,6 @@ script: - ./autogen.sh && ./configure --enable-coverage - make ci -before_install: - - docker pull chrisdaish/squid - - docker run -d -p 3128:3128 chrisdaish/squid - - docker ps -a install: - gem install fpm - gem install package_cloud diff --git a/Makefile.am b/Makefile.am index 5d0a9e7a..5cba018d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -16,7 +16,7 @@ librestclient_cpp_la_LDFLAGS=-version-info 2:1:1 dist_doc_DATA = README.md -.PHONY: test check clean-coverage-files coverage-html include/restclient-cpp/version.h lint ci +.PHONY: test check clean-coverage-files coverage-html include/restclient-cpp/version.h lint ci docker-services include/restclient-cpp/version.h: m4 -I m4 -DM4_RESTCLIENT_VERSION=$(VERSION) version.h.m4 > $@ @@ -30,7 +30,11 @@ valgrind: check lint: cpplint --filter=-legal/copyright include/restclient-cpp/*.h source/*.cc -ci: lint test valgrind +docker-services: + docker inspect --format="{{ .State.Running }}" restclient-proxy &> /dev/null || docker run -d --name restclient-proxy -p 3128:3128 chrisdaish/squid + docker ps -a + +ci: lint docker-services test valgrind clean-local: find . -name "*.gcda" -print0 | xargs -0 rm From de61b7fffd7d024252a148eaca4d571a4fa63223 Mon Sep 17 00:00:00 2001 From: Adam Law Date: Sun, 8 Jan 2017 16:31:08 +0000 Subject: [PATCH 137/212] Added support for progress reporting when downloading/uploading --- include/restclient-cpp/connection.h | 10 ++++++++ source/connection.cc | 39 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index 087b6b4f..e97a8bfa 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -106,6 +106,8 @@ class Connection { int timeout; bool followRedirects; bool noSignal; + curl_progress_callback progressFn; + void* progressFnData; struct { std::string username; std::string password; @@ -132,6 +134,12 @@ class Connection { // set connection timeout to seconds void SetTimeout(int seconds); + // set file progress callback + void SetFileProgressCallback(curl_progress_callback progressFn); + + // set file progress callback data + void SetFileProgressCallbackData(void* data); + // set to not use signals void SetNoSignal(bool no); @@ -192,6 +200,8 @@ class Connection { int timeout; bool followRedirects; bool noSignal; + curl_progress_callback progressFn; + void* progressFnData; struct { std::string username; std::string password; diff --git a/source/connection.cc b/source/connection.cc index e005ed7a..83a97b65 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -35,6 +35,8 @@ RestClient::Connection::Connection(const std::string& baseUrl) this->timeout = 0; this->followRedirects = false; this->noSignal = false; + this->progressFn = nullptr; + this->progressFnData = nullptr; } RestClient::Connection::~Connection() { @@ -58,6 +60,8 @@ RestClient::Connection::GetInfo() { ret.timeout = this->timeout; ret.followRedirects = this->followRedirects; ret.noSignal = this->noSignal; + ret.progressFn = this->progressFn; + ret.progressFnData = this->progressFnData; ret.basicAuth.username = this->basicAuth.username; ret.basicAuth.password = this->basicAuth.password; ret.customUserAgent = this->customUserAgent; @@ -183,6 +187,28 @@ RestClient::Connection::SetNoSignal(bool no) { this->noSignal = no; } +/** + * @brief set file progress callback function + * + * @param callback function pointer + * + */ +void +RestClient::Connection::SetFileProgressCallback(curl_progress_callback progressFn) { + this->progressFn = progressFn; +} + +/** + * @brief set file progress callback data + * + * @param callback data pointer + * + */ +void +RestClient::Connection::SetFileProgressCallbackData(void* data) { + this->progressFnData = data; +} + /** * @brief set username and password for basic auth * @@ -338,6 +364,19 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { curl_easy_setopt(this->curlHandle, CURLOPT_NOSIGNAL, 1); } + // set file progress callback + if (this->progressFn) + { + curl_easy_setopt(this->curlHandle, CURLOPT_NOPROGRESS, 0); + curl_easy_setopt(this->curlHandle, CURLOPT_PROGRESSFUNCTION, this->progressFn); + if (this->progressFnData) { + curl_easy_setopt(this->curlHandle, CURLOPT_PROGRESSDATA, this->progressFnData); + } + else { + curl_easy_setopt(this->curlHandle, CURLOPT_PROGRESSDATA, this); + } + } + // if provided, supply CA path if (!this->caInfoFilePath.empty()) { curl_easy_setopt(this->curlHandle, CURLOPT_CAINFO, From dcef068dcb8bae5b62e206ebb9f90b689a6fbc5a Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 22 Apr 2017 20:16:33 -0400 Subject: [PATCH 138/212] add unit test for http2 connection libcurl handles http2 connections transparently. So this just puts a unit test in place to make sure it doesn't break with configuration changes or anything like that. fixes #49 --- test/test_restclient.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/test_restclient.cc b/test/test_restclient.cc index b1d89d24..fa091305 100644 --- a/test/test_restclient.cc +++ b/test/test_restclient.cc @@ -64,6 +64,11 @@ TEST_F(RestClientTest, TestRestClientGETCode) RestClient::Response res = RestClient::get("http://httpbin.org/get"); EXPECT_EQ(200, res.code); } +TEST_F(RestClientTest, TestRestClientGETHTTP2Code) +{ + RestClient::Response res = RestClient::get("https://http2.golang.org/reqinfo"); + EXPECT_EQ(200, res.code); +} TEST_F(RestClientTest, TestRestClientGETBodyCode) { RestClient::Response res = RestClient::get("http://httpbin.org/get"); From 8d6b7d5d9c2201e7bbae40db0da2b34d679128f8 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 22 Apr 2017 20:42:29 -0400 Subject: [PATCH 139/212] change prefixed address for proxy to HTTP curl doesn't support https proxies prior to version 7.52.0. It used to silently drop it but in newer versions below 7.52.0 it fails with curl: (7) Unsupported proxy scheme for 'https://xxx.xxx.xxx.xxx:80' Since this unit test just makes sure the code parsing the prefix gets executed properly, we can change it to http here and get the same effect. [1]: https://github.com/curl/curl/issues/1015 --- test/test_connection.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_connection.cc b/test/test_connection.cc index adddbb9e..1d0fc1a4 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -226,7 +226,7 @@ TEST_F(ConnectionTest, TestProxy) TEST_F(ConnectionTest, TestProxyAddressPrefixed) { - conn->SetProxy("https://127.0.0.1:3128"); + conn->SetProxy("http://127.0.0.1:3128"); RestClient::Response res = conn->get("/get"); EXPECT_EQ(200, res.code); } From ba91bffcded641c01ac45ff8b9cf90b16444feeb Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 22 Apr 2017 21:06:25 -0400 Subject: [PATCH 140/212] Make SetProxy behave like curl's CURLOPT_PROXY this changes the behaviour of SetProxy from just returning on an empty string to assigning it. This emulates the curl behaviour of disabling the proxy on an empty string. fixes #73 --- source/connection.cc | 5 +---- test/test_connection.cc | 8 ++++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/source/connection.cc b/source/connection.cc index e005ed7a..24f2540c 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -249,16 +249,13 @@ RestClient::Connection::SetKeyPassword(const std::string& keyPassword) { */ void RestClient::Connection::SetProxy(const std::string& uriProxy) { - if (uriProxy.empty()) { - return; - } std::string uriProxyUpper = uriProxy; // check if the provided address is prefixed with "http" std::transform(uriProxyUpper.begin(), uriProxyUpper.end(), uriProxyUpper.begin(), ::toupper); - if (uriProxyUpper.compare(0, 4, "HTTP") != 0) { + if ((uriProxy.length() > 0) && (uriProxyUpper.compare(0, 4, "HTTP") != 0)) { this->uriProxy = "http://" + uriProxy; } else { this->uriProxy = uriProxy; diff --git a/test/test_connection.cc b/test/test_connection.cc index 1d0fc1a4..4458ffb9 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -224,6 +224,14 @@ TEST_F(ConnectionTest, TestProxy) EXPECT_EQ(200, res.code); } +TEST_F(ConnectionTest, TestUnSetProxy) +{ + conn->SetProxy("127.0.0.1:3128"); + conn->SetProxy(""); + RestClient::Response res = conn->get("/get"); + EXPECT_EQ(200, res.code); +} + TEST_F(ConnectionTest, TestProxyAddressPrefixed) { conn->SetProxy("http://127.0.0.1:3128"); From b7a01770785da90c32b43f57181e78c428ad93b7 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 22 Apr 2017 21:18:18 -0400 Subject: [PATCH 141/212] remove unneeded curl include in restclient.h this was probably leftover from refactoring restclient to include the connection object. fixes #62 --- include/restclient-cpp/restclient.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index 75dc7c6e..992adfc4 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -9,7 +9,6 @@ #ifndef INCLUDE_RESTCLIENT_CPP_RESTCLIENT_H_ #define INCLUDE_RESTCLIENT_CPP_RESTCLIENT_H_ -#include #include #include #include From 8af5b2a5463da68edb996be03e278737a911c82d Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Sat, 22 Apr 2017 21:28:35 -0400 Subject: [PATCH 142/212] fix linter error for redundant blank line --- source/connection.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/source/connection.cc b/source/connection.cc index 24f2540c..6fe62b6e 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -249,7 +249,6 @@ RestClient::Connection::SetKeyPassword(const std::string& keyPassword) { */ void RestClient::Connection::SetProxy(const std::string& uriProxy) { - std::string uriProxyUpper = uriProxy; // check if the provided address is prefixed with "http" std::transform(uriProxyUpper.begin(), uriProxyUpper.end(), From d385de317c8d3aed30e6798e9f431d7c551b0e86 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Thu, 31 Aug 2017 12:35:36 +0200 Subject: [PATCH 143/212] add CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 74 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..b7df4e3b --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at coc@unwiredcouch.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ From 8142fc8fc1e89b79225a0d09d6a430c04b7317ca Mon Sep 17 00:00:00 2001 From: Yoann Long Date: Tue, 19 Sep 2017 16:53:51 +0200 Subject: [PATCH 144/212] fix isspace is not a member of std with Visual Studio 2017 --- include/restclient-cpp/helpers.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/restclient-cpp/helpers.h b/include/restclient-cpp/helpers.h index 8509dfdc..9078a267 100644 --- a/include/restclient-cpp/helpers.h +++ b/include/restclient-cpp/helpers.h @@ -10,6 +10,7 @@ #define INCLUDE_RESTCLIENT_CPP_HELPERS_H_ #include +#include #include #include From ed95b396f0678369410f75d672e079cefefd202d Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 10 Jan 2018 20:47:27 +0100 Subject: [PATCH 145/212] update distro repositories to push packages to this updates the list of distros the deb package gets pushed to so it's easier to use closes #82 --- Makefile.packaging.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Makefile.packaging.mk b/Makefile.packaging.mk index ae5f18e7..ffa5ec88 100644 --- a/Makefile.packaging.mk +++ b/Makefile.packaging.mk @@ -26,4 +26,9 @@ packages: local-install rpm deb deploy-packages: packages package_cloud push mrtazz/$(NAME)/el/7 *.rpm package_cloud push mrtazz/$(NAME)/debian/wheezy *.deb + package_cloud push mrtazz/$(NAME)/debian/jessie *.deb + package_cloud push mrtazz/$(NAME)/debian/stretch *.deb + package_cloud push mrtazz/$(NAME)/debian/buster *.deb package_cloud push mrtazz/$(NAME)/ubuntu/trusty *.deb + package_cloud push mrtazz/$(NAME)/ubuntu/xenial *.deb + package_cloud push mrtazz/$(NAME)/ubuntu/bionic *.deb From 3b2d507dbef4332af490b0a861477a56d0e83fcd Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 10 Jan 2018 20:50:48 +0100 Subject: [PATCH 146/212] fix link to CONTRIBUTING guidelines closes #91 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f84ede91..ac322ac7 100644 --- a/README.md +++ b/README.md @@ -237,7 +237,7 @@ merged as fast as possible. [libcurl]: http://curl.haxx.se/libcurl/ [gtest]: http://code.google.com/p/googletest/ [packagecloud]: https://packagecloud.io/mrtazz/restclient-cpp -[contributing]: https://github.com/mrtazz/restclient-cpp/blob/master/CONTRIBUTING.md +[contributing]: https://github.com/mrtazz/restclient-cpp/blob/master/.github/CONTRIBUTING.md [curl_keepalive]: http://curl.haxx.se/docs/faq.html#What_about_Keep_Alive_or_persist [curl_threadsafety]: http://curl.haxx.se/libcurl/c/threadsafe.html [restclient_response]: http://code.mrtazz.com/restclient-cpp/ref/struct_rest_client_1_1_response.html From bf8f364449828996aa7769d5ff8f565c33fdf369 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Thu, 8 Mar 2018 11:57:13 +0100 Subject: [PATCH 147/212] first attempt at adding a pkg-config setup related to #92 --- .gitignore | 2 ++ configure.ac | 2 +- restclient-cpp.pc.in | 12 ++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 restclient-cpp.pc.in diff --git a/.gitignore b/.gitignore index 967e5ba7..ae82340d 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,8 @@ vendor/jsoncpp-0.10.5/dist/.deps/jsoncpp.Po test-program .libs +restclient-cpp.pc + *autom4te.cache *aclocal.m4 *compile diff --git a/configure.ac b/configure.ac index 804daf36..ce575e16 100644 --- a/configure.ac +++ b/configure.ac @@ -21,7 +21,7 @@ AC_CHECK_LIB([curl], [main]) AC_C_INLINE AC_TYPE_SIZE_T -AC_CONFIG_FILES([Makefile]) +AC_CONFIG_FILES([Makefile restclient-cpp.pc]) # enable code coverage with ./configure --enable-coverage AC_ARG_ENABLE(coverage, diff --git a/restclient-cpp.pc.in b/restclient-cpp.pc.in new file mode 100644 index 00000000..9df86b3c --- /dev/null +++ b/restclient-cpp.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: restclient-cpp +Description: C++ client for making HTTP/REST requests +URL: http://code.mrtazz.com/restclient-cpp/ +Version: @VERSION@ +Requires: curl +Libs: -L${libdir} -lrestclient-cpp +Cflags: -I${includedir} From 731a2129dd255f2c67dd832dbbd8d97b823ee170 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Fri, 18 May 2018 19:02:50 +0200 Subject: [PATCH 148/212] Add support for limiting the number of redirects --- README.md | 2 ++ include/restclient-cpp/connection.h | 7 +++++++ source/connection.cc | 17 +++++++++++++++++ test/test_connection.cc | 15 +++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/README.md b/README.md index ac322ac7..a3ab9848 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,8 @@ conn->SetUserAgent("foo/cool"); // enable following of redirects (default is off) conn->FollowRedirects(true); +// and limit the number of redirects (default is -1, unlimited) +conn->FollowRedirects(true, 3); // set headers RestClient::HeaderFields headers; diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index 087b6b4f..a330fcf4 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -79,6 +79,8 @@ class Connection { * Member 'timeout' contains the configured timeout * @var Info::followRedirects * Member 'followRedirects' contains whether or not to follow redirects + * @var Info::maxRedirects + * Member 'maxRedirects' contains the maximum number of redirect to follow (-1 unlimited) * @var Info::basicAuth * Member 'basicAuth' contains information about basic auth * @var basicAuth::username @@ -105,6 +107,7 @@ class Connection { RestClient::HeaderFields headers; int timeout; bool followRedirects; + int maxRedirects; bool noSignal; struct { std::string username; @@ -138,6 +141,9 @@ class Connection { // set whether to follow redirects void FollowRedirects(bool follow); + // set whether to follow redirects (-1 for unlimited) + void FollowRedirects(bool follow, int maxRedirects); + // set custom user agent // (this will result in the UA "foo/cool restclient-cpp/VERSION") void SetUserAgent(const std::string& userAgent); @@ -191,6 +197,7 @@ class Connection { RestClient::HeaderFields headerFields; int timeout; bool followRedirects; + int maxRedirects; bool noSignal; struct { std::string username; diff --git a/source/connection.cc b/source/connection.cc index 6fe62b6e..2cbe31e1 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -34,6 +34,7 @@ RestClient::Connection::Connection(const std::string& baseUrl) this->baseUrl = baseUrl; this->timeout = 0; this->followRedirects = false; + this->maxRedirects = -1l; this->noSignal = false; } @@ -57,6 +58,7 @@ RestClient::Connection::GetInfo() { ret.headers = this->GetHeaders(); ret.timeout = this->timeout; ret.followRedirects = this->followRedirects; + ret.maxRedirects = this->maxRedirects; ret.noSignal = this->noSignal; ret.basicAuth.username = this->basicAuth.username; ret.basicAuth.password = this->basicAuth.password; @@ -120,6 +122,19 @@ RestClient::Connection::GetHeaders() { void RestClient::Connection::FollowRedirects(bool follow) { this->followRedirects = follow; + this->maxRedirects = -1l; +} + +/** + * @brief configure whether to follow redirects on this connection + * + * @param follow - boolean whether to follow redirects + * @param maxRedirects - int indicating the maximum number of redirect to follow (-1 unlimited) + */ +void +RestClient::Connection::FollowRedirects(bool follow, int maxRedirects) { + this->followRedirects = follow; + this->maxRedirects = maxRedirects; } /** @@ -327,6 +342,8 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { // set follow redirect if (this->followRedirects == true) { curl_easy_setopt(this->curlHandle, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(this->curlHandle, CURLOPT_MAXREDIRS, + static_cast(this->maxRedirects)); } if (this->noSignal) { diff --git a/test/test_connection.cc b/test/test_connection.cc index 4458ffb9..dfc6b67c 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -185,6 +185,21 @@ TEST_F(ConnectionTest, TestFollowRedirect) EXPECT_EQ(200, res.code); } +TEST_F(ConnectionTest, TestFollowRedirectLimited) +{ + RestClient::Response res = conn->get("/redirect/2"); + EXPECT_EQ(302, res.code); + conn->FollowRedirects(true, 1); + res = conn->get("/redirect/2"); + EXPECT_EQ(-1, res.code); + conn->FollowRedirects(true, 2); + res = conn->get("/redirect/2"); + EXPECT_EQ(200, res.code); + conn->FollowRedirects(true, -1); + res = conn->get("/redirect/2"); + EXPECT_EQ(200, res.code); +} + TEST_F(ConnectionTest, TestGetInfoFromRedirect) { conn->FollowRedirects(true); From bdf5335cae8b879a8116cb8053828aff5d9544d2 Mon Sep 17 00:00:00 2001 From: Hajder Rabiee Date: Tue, 15 May 2018 17:32:47 +0200 Subject: [PATCH 149/212] Changed content type to application/json --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a3ab9848..1c127246 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,8 @@ verbs: #include "restclient-cpp/restclient.h" RestClient::Response r = RestClient::get("http://url.com") -RestClient::Response r = RestClient::post("http://url.com/post", "text/json", "{\"foo\": \"bla\"}") -RestClient::Response r = RestClient::put("http://url.com/put", "text/json", "{\"foo\": \"bla\"}") +RestClient::Response r = RestClient::post("http://url.com/post", "application/json", "{\"foo\": \"bla\"}") +RestClient::Response r = RestClient::put("http://url.com/put", "application/json", "{\"foo\": \"bla\"}") RestClient::Response r = RestClient::del("http://url.com/delete") RestClient::Response r = RestClient::head("http://url.com") ``` @@ -84,9 +84,9 @@ RestClient::Response r = conn->head("/get") RestClient::Response r = conn->del("/delete") // set different content header for POST and PUT -conn->AppendHeader("Content-Type", "text/json") +conn->AppendHeader("Content-Type", "application/json") RestClient::Response r = conn->post("/post", "{\"foo\": \"bla\"}") -RestClient::Response r = conn->put("/put", "text/json", "{\"foo\": \"bla\"}") +RestClient::Response r = conn->put("/put", "application/json", "{\"foo\": \"bla\"}") // deinit RestClient. After calling this you have to call RestClient::init() // again before you can use it From aef524791e8ec42194fb01e4a5e2c2bbcd906a7b Mon Sep 17 00:00:00 2001 From: Adam Law Date: Tue, 24 Jul 2018 21:53:05 +0100 Subject: [PATCH 150/212] * Fixed failing CI issues. * Added unit test for progress callback. * Updated `README.md` with documentation for the new progress callback additions. --- README.md | 14 ++++++++++++++ include/restclient-cpp/connection.h | 4 ++++ source/connection.cc | 25 +++++++++++++++---------- test/test_connection.cc | 20 ++++++++++++++++++++ 4 files changed, 53 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index f84ede91..ad2a2f69 100644 --- a/README.md +++ b/README.md @@ -207,6 +207,20 @@ conn->SetProxy("37.187.100.23:3128"); RestClient::Response res = conn->get("/get"); ``` +## Progress callback + +Two simple wrapper functions are provided to setup progress callback for uploads/downloads; +Calling `conn->SetFileProgressCallback(callback)` with a callback parameter matching the prototype `int progress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)` will setup the progress callback. +Calling `conn->SetFileProgressCallbackData(data)` is optional. This will set the data pointer which is the first parameter fed back to the progress callback - `clientp`. If this isn't set then `clientp` will default to the connection object `conn`. + +```cpp +// set CURLOPT_NOPROGRESS +// set CURLOPT_PROGRESSFUNCTION +conn->SetFileProgressCallback(progressFunc); +// set CURLOPT_PROGRESSDATA +conn->SetFileProgressCallbackData(data); +``` + ## Dependencies - [libcurl][] diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index e97a8bfa..aa158721 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -79,6 +79,10 @@ class Connection { * Member 'timeout' contains the configured timeout * @var Info::followRedirects * Member 'followRedirects' contains whether or not to follow redirects + * @var Info::progressFn + * Member 'progressFn' file progress callback function + * @var Info::progressFnData + * Member 'progressFnData' file progress callback data * @var Info::basicAuth * Member 'basicAuth' contains information about basic auth * @var basicAuth::username diff --git a/source/connection.cc b/source/connection.cc index 83a97b65..77827b88 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -194,8 +194,9 @@ RestClient::Connection::SetNoSignal(bool no) { * */ void -RestClient::Connection::SetFileProgressCallback(curl_progress_callback progressFn) { - this->progressFn = progressFn; +RestClient::Connection::SetFileProgressCallback(curl_progress_callback + progressFn) { + this->progressFn = progressFn; } /** @@ -206,7 +207,7 @@ RestClient::Connection::SetFileProgressCallback(curl_progress_callback progressF */ void RestClient::Connection::SetFileProgressCallbackData(void* data) { - this->progressFnData = data; + this->progressFnData = data; } /** @@ -365,15 +366,19 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { } // set file progress callback - if (this->progressFn) - { + if (this->progressFn) { curl_easy_setopt(this->curlHandle, CURLOPT_NOPROGRESS, 0); - curl_easy_setopt(this->curlHandle, CURLOPT_PROGRESSFUNCTION, this->progressFn); + curl_easy_setopt(this->curlHandle, + CURLOPT_PROGRESSFUNCTION, + this->progressFn); if (this->progressFnData) { - curl_easy_setopt(this->curlHandle, CURLOPT_PROGRESSDATA, this->progressFnData); - } - else { - curl_easy_setopt(this->curlHandle, CURLOPT_PROGRESSDATA, this); + curl_easy_setopt(this->curlHandle, + CURLOPT_PROGRESSDATA, + this->progressFnData); + } else { + curl_easy_setopt(this->curlHandle, + CURLOPT_PROGRESSDATA, + this); } } diff --git a/test/test_connection.cc b/test/test_connection.cc index adddbb9e..7a7ad8d1 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -217,6 +217,26 @@ TEST_F(ConnectionTest, TestNoSignal) EXPECT_EQ(200, res.code); } +TEST_F(ConnectionTest, TestSetProgress) +{ + static double totalToDownload = 0; + static double totalDownloaded = 0; + + auto progressCallback = [](void* pData, double downloadTotal, double downloaded, double uploadTotal, double uploaded) -> int { + totalToDownload = downloadTotal; + totalDownloaded = downloaded; + return 0; + }; + + conn->SetFileProgressCallback(progressCallback); + conn->SetFileProgressCallbackData(nullptr); + + RestClient::Response res = conn->get("/anything/{test_data}"); + EXPECT_EQ(200, res.code); + EXPECT_EQ(totalToDownload, 267); + EXPECT_EQ(totalDownloaded, 267); +} + TEST_F(ConnectionTest, TestProxy) { conn->SetProxy("127.0.0.1:3128"); From a57162a08c54623f38e90639769001de5ef6bf75 Mon Sep 17 00:00:00 2001 From: Adam Law Date: Tue, 24 Jul 2018 22:01:17 +0100 Subject: [PATCH 151/212] * Fixed merge conflicts --- include/restclient-cpp/connection.h | 7 +++++++ source/connection.cc | 23 ++++++++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index aa158721..c1d197ca 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -83,6 +83,8 @@ class Connection { * Member 'progressFn' file progress callback function * @var Info::progressFnData * Member 'progressFnData' file progress callback data + * @var Info::maxRedirects + * Member 'maxRedirects' contains the maximum number of redirect to follow (-1 unlimited) * @var Info::basicAuth * Member 'basicAuth' contains information about basic auth * @var basicAuth::username @@ -109,6 +111,7 @@ class Connection { RestClient::HeaderFields headers; int timeout; bool followRedirects; + int maxRedirects; bool noSignal; curl_progress_callback progressFn; void* progressFnData; @@ -150,6 +153,9 @@ class Connection { // set whether to follow redirects void FollowRedirects(bool follow); + // set whether to follow redirects (-1 for unlimited) + void FollowRedirects(bool follow, int maxRedirects); + // set custom user agent // (this will result in the UA "foo/cool restclient-cpp/VERSION") void SetUserAgent(const std::string& userAgent); @@ -203,6 +209,7 @@ class Connection { RestClient::HeaderFields headerFields; int timeout; bool followRedirects; + int maxRedirects; bool noSignal; curl_progress_callback progressFn; void* progressFnData; diff --git a/source/connection.cc b/source/connection.cc index 77827b88..b144ca69 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -34,6 +34,7 @@ RestClient::Connection::Connection(const std::string& baseUrl) this->baseUrl = baseUrl; this->timeout = 0; this->followRedirects = false; + this->maxRedirects = -1l; this->noSignal = false; this->progressFn = nullptr; this->progressFnData = nullptr; @@ -59,6 +60,7 @@ RestClient::Connection::GetInfo() { ret.headers = this->GetHeaders(); ret.timeout = this->timeout; ret.followRedirects = this->followRedirects; + ret.maxRedirects = this->maxRedirects; ret.noSignal = this->noSignal; ret.progressFn = this->progressFn; ret.progressFnData = this->progressFnData; @@ -124,6 +126,19 @@ RestClient::Connection::GetHeaders() { void RestClient::Connection::FollowRedirects(bool follow) { this->followRedirects = follow; + this->maxRedirects = -1l; +} + +/** + * @brief configure whether to follow redirects on this connection + * + * @param follow - boolean whether to follow redirects + * @param maxRedirects - int indicating the maximum number of redirect to follow (-1 unlimited) + */ +void +RestClient::Connection::FollowRedirects(bool follow, int maxRedirects) { + this->followRedirects = follow; + this->maxRedirects = maxRedirects; } /** @@ -276,16 +291,12 @@ RestClient::Connection::SetKeyPassword(const std::string& keyPassword) { */ void RestClient::Connection::SetProxy(const std::string& uriProxy) { - if (uriProxy.empty()) { - return; - } - std::string uriProxyUpper = uriProxy; // check if the provided address is prefixed with "http" std::transform(uriProxyUpper.begin(), uriProxyUpper.end(), uriProxyUpper.begin(), ::toupper); - if (uriProxyUpper.compare(0, 4, "HTTP") != 0) { + if ((uriProxy.length() > 0) && (uriProxyUpper.compare(0, 4, "HTTP") != 0)) { this->uriProxy = "http://" + uriProxy; } else { this->uriProxy = uriProxy; @@ -358,6 +369,8 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { // set follow redirect if (this->followRedirects == true) { curl_easy_setopt(this->curlHandle, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(this->curlHandle, CURLOPT_MAXREDIRS, + static_cast(this->maxRedirects)); } if (this->noSignal) { From 7e3eaf08def8798afd9e6ddf1ad1f85653db2b02 Mon Sep 17 00:00:00 2001 From: Adam Law Date: Tue, 24 Jul 2018 22:12:35 +0100 Subject: [PATCH 152/212] * `nullptr` compilation errors on CI build. --- source/connection.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/connection.cc b/source/connection.cc index b144ca69..943ff154 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -36,8 +36,8 @@ RestClient::Connection::Connection(const std::string& baseUrl) this->followRedirects = false; this->maxRedirects = -1l; this->noSignal = false; - this->progressFn = nullptr; - this->progressFnData = nullptr; + this->progressFn = NULL; + this->progressFnData = NULL; } RestClient::Connection::~Connection() { From e0a4b4f9e039ee8bef2ee230ff21cfedca2cb868 Mon Sep 17 00:00:00 2001 From: Adam Law Date: Tue, 24 Jul 2018 22:17:55 +0100 Subject: [PATCH 153/212] * `nullptr` compilation error on unit test - these compile fine for me locally. --- test/test_connection.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_connection.cc b/test/test_connection.cc index a3d8cfcf..8249dbd5 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -244,7 +244,7 @@ TEST_F(ConnectionTest, TestSetProgress) }; conn->SetFileProgressCallback(progressCallback); - conn->SetFileProgressCallbackData(nullptr); + conn->SetFileProgressCallbackData(NULL); RestClient::Response res = conn->get("/anything/{test_data}"); EXPECT_EQ(200, res.code); From a3ff6d82da68cdfbc08a8facfc6b73f58a05d09c Mon Sep 17 00:00:00 2001 From: Adam Law Date: Wed, 25 Jul 2018 06:32:17 +0100 Subject: [PATCH 154/212] * Tweaked `TestSetProgress` expectations --- test/test_connection.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_connection.cc b/test/test_connection.cc index 8249dbd5..379aa35d 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -248,8 +248,8 @@ TEST_F(ConnectionTest, TestSetProgress) RestClient::Response res = conn->get("/anything/{test_data}"); EXPECT_EQ(200, res.code); - EXPECT_EQ(totalToDownload, 267); - EXPECT_EQ(totalDownloaded, 267); + EXPECT_GT(totalDownloaded, 0); + EXPECT_EQ(totalDownloaded, totalToDownload); } TEST_F(ConnectionTest, TestProxy) From 31016712bfcc353bbc1a8f3b7c4f6effb652a9bd Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Tue, 2 Oct 2018 09:29:54 +0300 Subject: [PATCH 155/212] Use std::make_unique when C++14 is available --- source/restclient.cc | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/source/restclient.cc b/source/restclient.cc index 962d4dec..2e2c5115 100644 --- a/source/restclient.cc +++ b/source/restclient.cc @@ -14,6 +14,9 @@ #include "restclient-cpp/restclient.h" #include +#if __cplusplus >= 201402L +#include +#endif #include "restclient-cpp/version.h" #include "restclient-cpp/connection.h" @@ -46,11 +49,16 @@ void RestClient::disable() { * @return response struct */ RestClient::Response RestClient::get(const std::string& url) { +#if __cplusplus >= 201402L + auto conn = std::make_unique(""); + return conn->get(url); +#else RestClient::Response ret; RestClient::Connection *conn = new RestClient::Connection(""); ret = conn->get(url); delete conn; return ret; +#endif } /** @@ -65,12 +73,18 @@ RestClient::Response RestClient::get(const std::string& url) { RestClient::Response RestClient::post(const std::string& url, const std::string& ctype, const std::string& data) { +#if __cplusplus >= 201402L + auto conn = std::make_unique(""); + conn->AppendHeader("Content-Type", ctype); + return conn->post(url, data); +#else RestClient::Response ret; RestClient::Connection *conn = new RestClient::Connection(""); conn->AppendHeader("Content-Type", ctype); ret = conn->post(url, data); delete conn; return ret; +#endif } /** @@ -85,12 +99,18 @@ RestClient::Response RestClient::post(const std::string& url, RestClient::Response RestClient::put(const std::string& url, const std::string& ctype, const std::string& data) { +#if __cplusplus >= 201402L + auto conn = std::make_unique(""); + conn->AppendHeader("Content-Type", ctype); + return conn->put(url, data); +#else RestClient::Response ret; RestClient::Connection *conn = new RestClient::Connection(""); conn->AppendHeader("Content-Type", ctype); ret = conn->put(url, data); delete conn; return ret; +#endif } /** @@ -101,11 +121,16 @@ RestClient::Response RestClient::put(const std::string& url, * @return response struct */ RestClient::Response RestClient::del(const std::string& url) { +#if __cplusplus >= 201402L + auto conn = std::make_unique(""); + return conn->del(url); +#else RestClient::Response ret; RestClient::Connection *conn = new RestClient::Connection(""); ret = conn->del(url); delete conn; return ret; +#endif } /** @@ -116,9 +141,14 @@ RestClient::Response RestClient::del(const std::string& url) { * @return response struct */ RestClient::Response RestClient::head(const std::string& url) { +#if __cplusplus >= 201402L + auto conn = std::make_unique(""); + return conn->head(url); +#else RestClient::Response ret; RestClient::Connection *conn = new RestClient::Connection(""); ret = conn->head(url); delete conn; return ret; +#endif } From 1d6f6c6d3a20534eeb3f956e8e6c1b7a65a31950 Mon Sep 17 00:00:00 2001 From: drodil Date: Wed, 31 Oct 2018 14:37:43 +0200 Subject: [PATCH 156/212] Remove duplicate FollowRedirects function (#109) Use default value for maxRedirects instead --- include/restclient-cpp/connection.h | 8 +++----- source/connection.cc | 13 +------------ 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index a330fcf4..242a80aa 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -138,11 +138,9 @@ class Connection { // set to not use signals void SetNoSignal(bool no); - // set whether to follow redirects - void FollowRedirects(bool follow); - - // set whether to follow redirects (-1 for unlimited) - void FollowRedirects(bool follow, int maxRedirects); + // set whether to follow redirects, maxRedirects indicitng the maximum + // number of redirects to follow + void FollowRedirects(bool follow, int maxRedirects = -1l); // set custom user agent // (this will result in the UA "foo/cool restclient-cpp/VERSION") diff --git a/source/connection.cc b/source/connection.cc index 2cbe31e1..7dc438c5 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -118,18 +118,7 @@ RestClient::Connection::GetHeaders() { * @brief configure whether to follow redirects on this connection * * @param follow - boolean whether to follow redirects - */ -void -RestClient::Connection::FollowRedirects(bool follow) { - this->followRedirects = follow; - this->maxRedirects = -1l; -} - -/** - * @brief configure whether to follow redirects on this connection - * - * @param follow - boolean whether to follow redirects - * @param maxRedirects - int indicating the maximum number of redirect to follow (-1 unlimited) + * @param maxRedirects - int indicating the maximum number of redirect to follow (-1 unlimited, default) */ void RestClient::Connection::FollowRedirects(bool follow, int maxRedirects) { From d97874096343605936122727b7b8c6a2ba551598 Mon Sep 17 00:00:00 2001 From: drodil Date: Wed, 31 Oct 2018 14:40:17 +0200 Subject: [PATCH 157/212] Add PATCH and OPTIONS methods (#106) * Add PATCH and OPTIONS method for the client Unfortunately httpbin does not support testing OPTIONS method so the test is disabled for now. * Update README.md for new methods --- .gitignore | 8 +-- README.md | 6 ++- include/restclient-cpp/connection.h | 3 ++ include/restclient-cpp/restclient.h | 4 ++ source/connection.cc | 52 +++++++++++++++++++ source/restclient.cc | 35 +++++++++++++ test/test_restclient.cc | 80 ++++++++++++++++++++++++++--- 7 files changed, 174 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 967e5ba7..7b9a47d3 100644 --- a/.gitignore +++ b/.gitignore @@ -8,13 +8,7 @@ config* *aclocal.m4 *Makefile *Makefile.in -vendor/gtest-1.7.0/scripts/gtest-config -vendor/gtest-1.7.0/build-aux/config.h -vendor/gtest-1.7.0/build-aux/config.h.in -vendor/gtest-1.7.0/build-aux/ltmain.sh -vendor/gtest-1.7.0/m4/ltoptions.m4 -vendor/gtest-1.7.0/m4/ltversion.m4 -vendor/jsoncpp-0.10.5/dist/.deps/jsoncpp.Po +vendor/* test-program .libs diff --git a/README.md b/README.md index 1c127246..0fee4de9 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,10 @@ verbs: RestClient::Response r = RestClient::get("http://url.com") RestClient::Response r = RestClient::post("http://url.com/post", "application/json", "{\"foo\": \"bla\"}") RestClient::Response r = RestClient::put("http://url.com/put", "application/json", "{\"foo\": \"bla\"}") +RestClient::Response r = RestClient::patch("http://url.com/patch", "application/json", "{\"foo\": \"bla\"}") RestClient::Response r = RestClient::del("http://url.com/delete") RestClient::Response r = RestClient::head("http://url.com") +RestClient::Response r = RestClient::options("http://url.com") ``` The response is of type [RestClient::Response][restclient_response] and has @@ -82,11 +84,13 @@ conn->SetCAInfoFilePath("/etc/custom-ca.crt") RestClient::Response r = conn->get("/get") RestClient::Response r = conn->head("/get") RestClient::Response r = conn->del("/delete") +RestClient::Response r = conn->options("/options") -// set different content header for POST and PUT +// set different content header for POST, PUT and PATCH conn->AppendHeader("Content-Type", "application/json") RestClient::Response r = conn->post("/post", "{\"foo\": \"bla\"}") RestClient::Response r = conn->put("/put", "application/json", "{\"foo\": \"bla\"}") +RestClient::Response r = conn->patch("/patch", "text/plain", "foobar") // deinit RestClient. After calling this you have to call RestClient::init() // again before you can use it diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index 242a80aa..b8ecbea4 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -186,8 +186,11 @@ class Connection { const std::string& data); RestClient::Response put(const std::string& uri, const std::string& data); + RestClient::Response patch(const std::string& uri, + const std::string& data); RestClient::Response del(const std::string& uri); RestClient::Response head(const std::string& uri); + RestClient::Response options(const std::string& uri); private: CURL* curlHandle; diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index 992adfc4..a5542b2d 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -56,8 +56,12 @@ Response post(const std::string& url, Response put(const std::string& url, const std::string& content_type, const std::string& data); +Response patch(const std::string& url, + const std::string& content_type, + const std::string& data); Response del(const std::string& url); Response head(const std::string& url); +Response options(const std::string& url); } // namespace RestClient diff --git a/source/connection.cc b/source/connection.cc index 7dc438c5..43430219 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -480,6 +480,39 @@ RestClient::Connection::put(const std::string& url, return this->performCurlRequest(url); } +/** + * @brief HTTP PATCH method + * + * @param url to query + * @param data HTTP PATCH body + * + * @return response struct + */ +RestClient::Response +RestClient::Connection::patch(const std::string& url, + const std::string& data) { + /** initialize upload object */ + RestClient::Helpers::UploadObject up_obj; + up_obj.data = data.c_str(); + up_obj.length = data.size(); + + /** we want HTTP PATCH */ + const char* http_patch = "PATCH"; + + /** set HTTP PATCH METHOD */ + curl_easy_setopt(this->curlHandle, CURLOPT_CUSTOMREQUEST, http_patch); + curl_easy_setopt(this->curlHandle, CURLOPT_UPLOAD, 1L); + /** set read callback function */ + curl_easy_setopt(this->curlHandle, CURLOPT_READFUNCTION, + RestClient::Helpers::read_callback); + /** set data object to pass to callback function */ + curl_easy_setopt(this->curlHandle, CURLOPT_READDATA, &up_obj); + /** set data size */ + curl_easy_setopt(this->curlHandle, CURLOPT_INFILESIZE, + static_cast(up_obj.length)); + + return this->performCurlRequest(url); +} /** * @brief HTTP DELETE method * @@ -516,3 +549,22 @@ RestClient::Connection::head(const std::string& url) { return this->performCurlRequest(url); } + +/** + * @brief HTTP OPTIONS method + * + * @param url to query + * + * @return response struct + */ +RestClient::Response +RestClient::Connection::options(const std::string& url) { + /** we want HTTP OPTIONS */ + const char* http_options = "OPTIONS"; + + /** set HTTP HEAD METHOD */ + curl_easy_setopt(this->curlHandle, CURLOPT_CUSTOMREQUEST, http_options); + curl_easy_setopt(this->curlHandle, CURLOPT_NOBODY, 1L); + + return this->performCurlRequest(url); +} diff --git a/source/restclient.cc b/source/restclient.cc index 962d4dec..1cd99a9a 100644 --- a/source/restclient.cc +++ b/source/restclient.cc @@ -93,6 +93,26 @@ RestClient::Response RestClient::put(const std::string& url, return ret; } +/** + * @brief HTTP PATCH method + * + * @param url to query + * @param ctype content type as string + * @param data HTTP PATCH body + * + * @return response struct + */ +RestClient::Response RestClient::patch(const std::string& url, + const std::string& ctype, + const std::string& data) { + RestClient::Response ret; + RestClient::Connection *conn = new RestClient::Connection(""); + conn->AppendHeader("Content-Type", ctype); + ret = conn->patch(url, data); + delete conn; + return ret; +} + /** * @brief HTTP DELETE method * @@ -122,3 +142,18 @@ RestClient::Response RestClient::head(const std::string& url) { delete conn; return ret; } + +/** + * @brief HTTP OPTIONS method + * + * @param url to query + * + * @return response struct + */ +RestClient::Response RestClient::options(const std::string& url) { + RestClient::Response ret; + RestClient::Connection *conn = new RestClient::Connection(""); + ret = conn->options(url); + delete conn; + return ret; +} diff --git a/test/test_restclient.cc b/test/test_restclient.cc index fa091305..daf336fa 100644 --- a/test/test_restclient.cc +++ b/test/test_restclient.cc @@ -29,12 +29,13 @@ class RestClientTest : public ::testing::Test // DELETE Tests // check return code -TEST_F(RestClientTest, TestRestClientDeleteCode) +TEST_F(RestClientTest, TestRestClientDELETECode) { RestClient::Response res = RestClient::del("http://httpbin.org/delete"); EXPECT_EQ(200, res.code); } -TEST_F(RestClientTest, TestRestClientDeleteBody) + +TEST_F(RestClientTest, TestRestClientDELETEBody) { RestClient::Response res = RestClient::del("http://httpbin.org/delete"); Json::Value root; @@ -46,13 +47,14 @@ TEST_F(RestClientTest, TestRestClientDeleteBody) } // check for failure -TEST_F(RestClientTest, TestRestClientDeleteFailureCode) +TEST_F(RestClientTest, TestRestClientDELETEFailureCode) { std::string u = "http://nonexistent"; RestClient::Response res = RestClient::del(u); EXPECT_EQ(-1, res.code); } -TEST_F(RestClientTest, TestRestClientDeleteHeaders) + +TEST_F(RestClientTest, TestRestClientDELETEHeaders) { RestClient::Response res = RestClient::del("http://httpbin.org/delete"); EXPECT_EQ("keep-alive", res.headers["Connection"]); @@ -64,11 +66,13 @@ TEST_F(RestClientTest, TestRestClientGETCode) RestClient::Response res = RestClient::get("http://httpbin.org/get"); EXPECT_EQ(200, res.code); } + TEST_F(RestClientTest, TestRestClientGETHTTP2Code) { RestClient::Response res = RestClient::get("https://http2.golang.org/reqinfo"); EXPECT_EQ(200, res.code); } + TEST_F(RestClientTest, TestRestClientGETBodyCode) { RestClient::Response res = RestClient::get("http://httpbin.org/get"); @@ -102,7 +106,8 @@ TEST_F(RestClientTest, TestRestClientPOSTCode) RestClient::Response res = RestClient::post("http://httpbin.org/post", "text/text", "data"); EXPECT_EQ(200, res.code); } -TEST_F(RestClientTest, TestRestClientPostBody) + +TEST_F(RestClientTest, TestRestClientPOSTBody) { RestClient::Response res = RestClient::post("http://httpbin.org/post", "text/text", "data"); Json::Value root; @@ -112,6 +117,7 @@ TEST_F(RestClientTest, TestRestClientPostBody) EXPECT_EQ("http://httpbin.org/post", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } + // check for failure TEST_F(RestClientTest, TestRestClientPOSTFailureCode) { @@ -119,6 +125,7 @@ TEST_F(RestClientTest, TestRestClientPOSTFailureCode) RestClient::Response res = RestClient::post(u, "text/text", "data"); EXPECT_EQ(-1, res.code); } + TEST_F(RestClientTest, TestRestClientPOSTHeaders) { RestClient::Response res = RestClient::post("http://httpbin.org/post", "text/text", "data"); @@ -132,7 +139,8 @@ TEST_F(RestClientTest, TestRestClientPUTCode) RestClient::Response res = RestClient::put("http://httpbin.org/put", "text/text", "data"); EXPECT_EQ(200, res.code); } -TEST_F(RestClientTest, TestRestClientPutBody) + +TEST_F(RestClientTest, TestRestClientPUTBody) { RestClient::Response res = RestClient::put("http://httpbin.org/put", "text/text", "data"); Json::Value root; @@ -142,6 +150,7 @@ TEST_F(RestClientTest, TestRestClientPutBody) EXPECT_EQ("http://httpbin.org/put", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } + // check for failure TEST_F(RestClientTest, TestRestClientPUTFailureCode) { @@ -149,11 +158,69 @@ TEST_F(RestClientTest, TestRestClientPUTFailureCode) RestClient::Response res = RestClient::put(u, "text/text", "data"); EXPECT_EQ(-1, res.code); } + TEST_F(RestClientTest, TestRestClientPUTHeaders) { RestClient::Response res = RestClient::put("http://httpbin.org/put", "text/text", "data"); EXPECT_EQ("keep-alive", res.headers["Connection"]); } + +// PATCH Tests +// check return code +TEST_F(RestClientTest, TestRestClientPATCHCode) +{ + RestClient::Response res = RestClient::patch("http://httpbin.org/patch", "text/text", "data"); + EXPECT_EQ(200, res.code); +} + +TEST_F(RestClientTest, TestRestClientPATCHBody) +{ + RestClient::Response res = RestClient::patch("http://httpbin.org/patch", "text/text", "data"); + Json::Value root; + std::istringstream str(res.body); + str >> root; + + EXPECT_EQ("http://httpbin.org/patch", root.get("url", "no url set").asString()); + EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); +} + +// check for failure +TEST_F(RestClientTest, TestRestClientPATCHFailureCode) +{ + std::string u = "http://nonexistent"; + RestClient::Response res = RestClient::patch(u, "text/text", "data"); + EXPECT_EQ(-1, res.code); +} + +TEST_F(RestClientTest, TestRestClientPATCHHeaders) +{ + RestClient::Response res = RestClient::patch("http://httpbin.org/put", "text/text", "data"); + EXPECT_EQ("keep-alive", res.headers["Connection"]); +} + +// OPTIONS Tests +// check return code +// Disabled as httpbin does not support options requests for now +TEST_F(RestClientTest, DISABLED_TestRestClientOPTIONSCode) +{ + RestClient::Response res = RestClient::options("http://httpbin.org/options"); + EXPECT_EQ(200, res.code); +} + +// check for failure +TEST_F(RestClientTest, TestRestClientOPTIONSFailureCode) +{ + std::string u = "http://nonexistent"; + RestClient::Response res = RestClient::options(u); + EXPECT_EQ(-1, res.code); +} + +TEST_F(RestClientTest, TestRestClientOPTIONSHeaders) +{ + RestClient::Response res = RestClient::options("http://httpbin.org/options"); + EXPECT_EQ("keep-alive", res.headers["Connection"]); +} + TEST_F(RestClientTest, TestRestClientAuth) { RestClient::Response res = RestClient::get("http://foo:bar@httpbin.org/basic-auth/foo/bar"); @@ -169,6 +236,7 @@ TEST_F(RestClientTest, TestRestClientAuth) res = RestClient::get("http://httpbin.org/basic-auth/foo/bar"); EXPECT_EQ(401, res.code); } + TEST_F(RestClientTest, TestRestClientHeadCode) { RestClient::Response res = RestClient::head("http://httpbin.org/get"); From 667ed3feb78c21ec08a811bf8c1027d19f8c37ec Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 31 Oct 2018 13:59:14 +0100 Subject: [PATCH 158/212] release v0.5.0 --- CHANGELOG.md | 34 ++++++++++++++++++++++++++++++++++ configure.ac | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96954f94..2e631725 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,39 @@ # Changelog +## v0.5.0 (31st October 2018 + +### Features +* Add PATCH and OPTIONS methods (#106) (drodil) +* Add support for limiting the number of redirects (Bas van Kervel) +* Added web proxy tunneling support. (amzoughi) +* add client cert & key support (Fan Zhang) +* add HEAD method (limhyungseok) +* no-signal capability (Chris Kruger) + +### Improvements and fixes +* Remove duplicate FollowRedirects function (#109) (drodil) +* Changed content type to application/json (Hajder Rabiee) +* fix link to CONTRIBUTING guidelines (Daniel Schauenberg) +* update distro repositories to push packages to (Daniel Schauenberg) +* fix isspace is not a member of std with Visual Studio 2017 (Yoann Long) +* add CODE_OF_CONDUCT.md (Daniel Schauenberg) +* fix linter error for redundant blank line (Daniel Schauenberg) +* remove unneeded curl include in restclient.h (Daniel Schauenberg) +* Make SetProxy behave like curl's CURLOPT_PROXY (Daniel Schauenberg) +* change prefixed address for proxy to HTTP (Daniel Schauenberg) +* add unit test for http2 connection (Daniel Schauenberg) +* move docker setup into Makefile (Daniel Schauenberg) +* update CONTRIBUTING docs with proxy server details (Daniel Schauenberg) +* add proxy server as docker service (Daniel Schauenberg) +* default to 10s timeout in unit tests (Daniel Schauenberg) +* update docs for HTTPS user certificate feature (Daniel Schauenberg) +* add .github folder with issue/PR templates (Daniel Schauenberg) +* move CI to run on travis trusty beta (Daniel Schauenberg) +* Small optimizations (Martin Gerhardy) +* Fix -Wpedantic warning (Daniel Perez) +* fix README examples for conn->post, conn->put (Daniel Schauenberg) +* add OSX install instructions to README (Daniel Schauenberg) + ## v0.4.4 (13th May 2016) - bump version because v0.4.3 was mistagged diff --git a/configure.ac b/configure.ac index 804daf36..6a392569 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ([2.52]) -AC_INIT([restclient-cpp], [0.4.4], [d@unwiredcouch.com]) +AC_INIT([restclient-cpp], [0.5.0], [d@unwiredcouch.com]) AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT AC_CONFIG_HEADERS([config.h]) From 4259614732abfd161aec2865d7bc9140d115994e Mon Sep 17 00:00:00 2001 From: Giuseppe Ursino Date: Wed, 2 Jan 2019 13:57:56 +0100 Subject: [PATCH 159/212] fix relative path issues --- Makefile.am | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index 5cba018d..a4d7fc08 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,5 @@ ACLOCAL_AMFLAGS=-I m4 -CPPFLAGS=-Iinclude +CPPFLAGS=-I${top_srcdir}/include check_PROGRAMS = test-program pkginclude_HEADERS = include/restclient-cpp/restclient.h include/restclient-cpp/version.h include/restclient-cpp/connection.h include/restclient-cpp/helpers.h BUILT_SOURCES = include/restclient-cpp/version.h @@ -19,7 +19,9 @@ dist_doc_DATA = README.md .PHONY: test check clean-coverage-files coverage-html include/restclient-cpp/version.h lint ci docker-services include/restclient-cpp/version.h: - m4 -I m4 -DM4_RESTCLIENT_VERSION=$(VERSION) version.h.m4 > $@ + m4 -I ${top_srcdir}/m4 -DM4_RESTCLIENT_VERSION=$(VERSION) version.h.m4 > ${top_srcdir}/$@ + + test: check ./test-program From d49bc09cda69495c754cff9688ae09f5ae467d37 Mon Sep 17 00:00:00 2001 From: Giuseppe Ursino Date: Wed, 2 Jan 2019 14:12:55 +0100 Subject: [PATCH 160/212] fix autogen to work with yocto --- autogen.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/autogen.sh b/autogen.sh index 3f026c45..7fd81e28 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,2 +1,10 @@ -#!/bin/sh -autoreconf --force --install +#! /bin/sh +[ -e config.cache ] && rm -f config.cache + +libtoolize --automake +aclocal ${OECORE_ACLOCAL_OPTS} +autoconf +autoheader +automake -a +./configure $@ +exit From 647abd54d7ded6ce9b34dc428a1945d4808db078 Mon Sep 17 00:00:00 2001 From: Giuseppe Ursino Date: Wed, 2 Jan 2019 15:05:05 +0100 Subject: [PATCH 161/212] fix git version problems during yocto build --- .gitignore | 1 + Makefile.am | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7b9a47d3..2044b410 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,4 @@ usr # generated files include/restclient-cpp/version.h +arm-poky-linux-gnueabi-libtool diff --git a/Makefile.am b/Makefile.am index a4d7fc08..0b4fc2dc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -19,7 +19,7 @@ dist_doc_DATA = README.md .PHONY: test check clean-coverage-files coverage-html include/restclient-cpp/version.h lint ci docker-services include/restclient-cpp/version.h: - m4 -I ${top_srcdir}/m4 -DM4_RESTCLIENT_VERSION=$(VERSION) version.h.m4 > ${top_srcdir}/$@ + m4 -I ${top_srcdir}/m4 -DM4_RESTCLIENT_VERSION=$(PACKAGE_VERSION) version.h.m4 > ${top_srcdir}/$@ From 1dd82a5562e766c89c084fbed4ef5f7331e4c5af Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 22 Feb 2019 12:41:54 +0100 Subject: [PATCH 162/212] use https in httpbin related tests seemingly httpbin has switched over to https URLs in their responses which breaks tests. --- test/test_restclient.cc | 48 ++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/test/test_restclient.cc b/test/test_restclient.cc index daf336fa..e25cad6e 100644 --- a/test/test_restclient.cc +++ b/test/test_restclient.cc @@ -37,12 +37,12 @@ TEST_F(RestClientTest, TestRestClientDELETECode) TEST_F(RestClientTest, TestRestClientDELETEBody) { - RestClient::Response res = RestClient::del("http://httpbin.org/delete"); + RestClient::Response res = RestClient::del("https://httpbin.org/delete"); Json::Value root; std::istringstream str(res.body); str >> root; - EXPECT_EQ("http://httpbin.org/delete", root.get("url", "no url set").asString()); + EXPECT_EQ("https://httpbin.org/delete", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } @@ -56,14 +56,14 @@ TEST_F(RestClientTest, TestRestClientDELETEFailureCode) TEST_F(RestClientTest, TestRestClientDELETEHeaders) { - RestClient::Response res = RestClient::del("http://httpbin.org/delete"); + RestClient::Response res = RestClient::del("https://httpbin.org/delete"); EXPECT_EQ("keep-alive", res.headers["Connection"]); } // GET Tests TEST_F(RestClientTest, TestRestClientGETCode) { - RestClient::Response res = RestClient::get("http://httpbin.org/get"); + RestClient::Response res = RestClient::get("https://httpbin.org/get"); EXPECT_EQ(200, res.code); } @@ -75,12 +75,12 @@ TEST_F(RestClientTest, TestRestClientGETHTTP2Code) TEST_F(RestClientTest, TestRestClientGETBodyCode) { - RestClient::Response res = RestClient::get("http://httpbin.org/get"); + RestClient::Response res = RestClient::get("https://httpbin.org/get"); Json::Value root; std::istringstream str(res.body); str >> root; - EXPECT_EQ("http://httpbin.org/get", root.get("url", "no url set").asString()); + EXPECT_EQ("https://httpbin.org/get", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } @@ -95,7 +95,7 @@ TEST_F(RestClientTest, TestRestClientGETFailureCode) TEST_F(RestClientTest, TestRestClientGETHeaders) { - RestClient::Response res = RestClient::get("http://httpbin.org/get"); + RestClient::Response res = RestClient::get("https://httpbin.org/get"); EXPECT_EQ("keep-alive", res.headers["Connection"]); } @@ -103,18 +103,18 @@ TEST_F(RestClientTest, TestRestClientGETHeaders) // check return code TEST_F(RestClientTest, TestRestClientPOSTCode) { - RestClient::Response res = RestClient::post("http://httpbin.org/post", "text/text", "data"); + RestClient::Response res = RestClient::post("https://httpbin.org/post", "text/text", "data"); EXPECT_EQ(200, res.code); } TEST_F(RestClientTest, TestRestClientPOSTBody) { - RestClient::Response res = RestClient::post("http://httpbin.org/post", "text/text", "data"); + RestClient::Response res = RestClient::post("https://httpbin.org/post", "text/text", "data"); Json::Value root; std::istringstream str(res.body); str >> root; - EXPECT_EQ("http://httpbin.org/post", root.get("url", "no url set").asString()); + EXPECT_EQ("https://httpbin.org/post", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } @@ -128,7 +128,7 @@ TEST_F(RestClientTest, TestRestClientPOSTFailureCode) TEST_F(RestClientTest, TestRestClientPOSTHeaders) { - RestClient::Response res = RestClient::post("http://httpbin.org/post", "text/text", "data"); + RestClient::Response res = RestClient::post("https://httpbin.org/post", "text/text", "data"); EXPECT_EQ("keep-alive", res.headers["Connection"]); } @@ -136,18 +136,18 @@ TEST_F(RestClientTest, TestRestClientPOSTHeaders) // check return code TEST_F(RestClientTest, TestRestClientPUTCode) { - RestClient::Response res = RestClient::put("http://httpbin.org/put", "text/text", "data"); + RestClient::Response res = RestClient::put("https://httpbin.org/put", "text/text", "data"); EXPECT_EQ(200, res.code); } TEST_F(RestClientTest, TestRestClientPUTBody) { - RestClient::Response res = RestClient::put("http://httpbin.org/put", "text/text", "data"); + RestClient::Response res = RestClient::put("https://httpbin.org/put", "text/text", "data"); Json::Value root; std::istringstream str(res.body); str >> root; - EXPECT_EQ("http://httpbin.org/put", root.get("url", "no url set").asString()); + EXPECT_EQ("https://httpbin.org/put", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } @@ -161,7 +161,7 @@ TEST_F(RestClientTest, TestRestClientPUTFailureCode) TEST_F(RestClientTest, TestRestClientPUTHeaders) { - RestClient::Response res = RestClient::put("http://httpbin.org/put", "text/text", "data"); + RestClient::Response res = RestClient::put("https://httpbin.org/put", "text/text", "data"); EXPECT_EQ("keep-alive", res.headers["Connection"]); } @@ -169,18 +169,18 @@ TEST_F(RestClientTest, TestRestClientPUTHeaders) // check return code TEST_F(RestClientTest, TestRestClientPATCHCode) { - RestClient::Response res = RestClient::patch("http://httpbin.org/patch", "text/text", "data"); + RestClient::Response res = RestClient::patch("https://httpbin.org/patch", "text/text", "data"); EXPECT_EQ(200, res.code); } TEST_F(RestClientTest, TestRestClientPATCHBody) { - RestClient::Response res = RestClient::patch("http://httpbin.org/patch", "text/text", "data"); + RestClient::Response res = RestClient::patch("https://httpbin.org/patch", "text/text", "data"); Json::Value root; std::istringstream str(res.body); str >> root; - EXPECT_EQ("http://httpbin.org/patch", root.get("url", "no url set").asString()); + EXPECT_EQ("https://httpbin.org/patch", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } @@ -194,7 +194,7 @@ TEST_F(RestClientTest, TestRestClientPATCHFailureCode) TEST_F(RestClientTest, TestRestClientPATCHHeaders) { - RestClient::Response res = RestClient::patch("http://httpbin.org/put", "text/text", "data"); + RestClient::Response res = RestClient::patch("https://httpbin.org/put", "text/text", "data"); EXPECT_EQ("keep-alive", res.headers["Connection"]); } @@ -203,7 +203,7 @@ TEST_F(RestClientTest, TestRestClientPATCHHeaders) // Disabled as httpbin does not support options requests for now TEST_F(RestClientTest, DISABLED_TestRestClientOPTIONSCode) { - RestClient::Response res = RestClient::options("http://httpbin.org/options"); + RestClient::Response res = RestClient::options("https://httpbin.org/options"); EXPECT_EQ(200, res.code); } @@ -217,13 +217,13 @@ TEST_F(RestClientTest, TestRestClientOPTIONSFailureCode) TEST_F(RestClientTest, TestRestClientOPTIONSHeaders) { - RestClient::Response res = RestClient::options("http://httpbin.org/options"); + RestClient::Response res = RestClient::options("https://httpbin.org/options"); EXPECT_EQ("keep-alive", res.headers["Connection"]); } TEST_F(RestClientTest, TestRestClientAuth) { - RestClient::Response res = RestClient::get("http://foo:bar@httpbin.org/basic-auth/foo/bar"); + RestClient::Response res = RestClient::get("https://foo:bar@httpbin.org/basic-auth/foo/bar"); EXPECT_EQ(200, res.code); Json::Value root; @@ -233,13 +233,13 @@ TEST_F(RestClientTest, TestRestClientAuth) EXPECT_EQ("foo", root.get("user", "no user").asString()); EXPECT_EQ(true, root.get("authenticated", false).asBool()); - res = RestClient::get("http://httpbin.org/basic-auth/foo/bar"); + res = RestClient::get("https://httpbin.org/basic-auth/foo/bar"); EXPECT_EQ(401, res.code); } TEST_F(RestClientTest, TestRestClientHeadCode) { - RestClient::Response res = RestClient::head("http://httpbin.org/get"); + RestClient::Response res = RestClient::head("https://httpbin.org/get"); EXPECT_EQ(200, res.code); EXPECT_EQ("", res.body); } From affecbf5d6ae64218f1fdab571c3805a1e1071cf Mon Sep 17 00:00:00 2001 From: Aron Rubin Date: Fri, 22 Feb 2019 08:05:47 -0500 Subject: [PATCH 163/212] Added initial CMakeLists.txt file to match the autotools build. (#115) --- CMakeLists.txt | 162 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..45fc8875 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,162 @@ + +cmake_minimum_required(VERSION 3.10.0) + +project(restclient-cpp + VERSION 0.5.0 + DESCRIPTION "REST client for C++" + HOMEPAGE_URL "http://code.mrtazz.com/restclient-cpp" +) +set(restclient-cpp_VENDOR "d@unwiredcouch.com") +set(PROJECT_VENDOR "${restclient-cpp_VENDOR}") + +message(STATUS "Configured for: ${CMAKE_BUILD_TYPE}") +add_custom_target(BeginMessage ALL + ${CMAKE_COMMAND} -E cmake_echo_color --white "Compiling for: $" + COMMENT "Compile Info" ) + +set(CMAKE_DEBUG_POSTFIX d) + +set(CMAKE_CXX_STANDARD 11) + +list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/modules") + + +if(POLICY CMP0074) + cmake_policy(SET CMP0074 NEW) +endif() + +include(CheckIncludeFiles) + +find_package(GTest) +if(GTEST_FOUND) +set(Gtest_FOUND TRUE) +endif() +if(GTest_FOUND) +include(GoogleTest) +endif() + +find_package(Threads REQUIRED) +find_package(CURL REQUIRED) +find_package(jsoncpp) + +add_library(restclient-cpp SHARED + source/restclient.cc + source/connection.cc + source/helpers.cc +) +set_property(TARGET restclient-cpp PROPERTY SOVERSION 2.1.1) + +target_compile_features(restclient-cpp PUBLIC cxx_std_11) + +list(APPEND restclient-cpp_PUBLIC_HEADERS + include/restclient-cpp/restclient.h + "${CMAKE_CURRENT_BINARY_DIR}/include/restclient-cpp/version.h" + include/restclient-cpp/connection.h + include/restclient-cpp/helpers.h +) +# target_sources(restclient-cpp PRIVATE ${restclient-cpp_PUBLIC_HEADERS}) +set_property(TARGET restclient-cpp PROPERTY + PUBLIC_HEADER ${restclient-cpp_PUBLIC_HEADERS}) +target_include_directories(restclient-cpp PRIVATE include) + +if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/version.h.in") +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/version.h.in" [=[ +#ifndef INCLUDE_RESTCLIENT_CPP_VERSION_H_ +#define INCLUDE_RESTCLIENT_CPP_VERSION_H_ +#define RESTCLIENT_VERSION "@restclient-cpp_VERSION@" +#endif // INCLUDE_RESTCLIENT_CPP_VERSION_H_ +]=]) +endif() +configure_file("${CMAKE_CURRENT_BINARY_DIR}/version.h.in" + "${CMAKE_CURRENT_BINARY_DIR}/include/restclient-cpp/version.h") +target_include_directories(restclient-cpp PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/include") + +target_link_libraries(restclient-cpp + PUBLIC CURL::libcurl + PUBLIC Threads::Threads +) + +set(INCLUDE_INSTALL_DIR "include/restclient-cpp" ) +set(CONFIG_INSTALL_DIR "lib/cmake/restclient-cpp" ) +set(RUNTIME_INSTALL_DIR "bin" ) +set(LIB_INSTALL_DIR "lib" ) +set(DATA_INSTALL_DIR "share/restclient-cpp" ) + +install(TARGETS restclient-cpp EXPORT restclient-cppTargets + PUBLIC_HEADER DESTINATION ${INCLUDE_INSTALL_DIR} + RUNTIME DESTINATION ${RUNTIME_INSTALL_DIR} + LIBRARY DESTINATION ${LIB_INSTALL_DIR} + ARCHIVE DESTINATION ${LIB_INSTALL_DIR} + RESOURCE DESTINATION ${DATA_INSTALL_DIR} +) + +include(CMakePackageConfigHelpers) +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake.in" + "@PACKAGE_INIT@\ninclude(\${CMAKE_CURRENT_LIST_DIR}/\@PROJECT_NAME\@Targets.cmake)\n") +configure_package_config_file( + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + INSTALL_DESTINATION + ${CMAKE_INSTALL_PREFIX}/${CONFIG_INSTALL_DIR} + PATH_VARS + INCLUDE_INSTALL_DIR + CONFIG_INSTALL_DIR + RUNTIME_INSTALL_DIR + LIB_INSTALL_DIR + DATA_INSTALL_DIR +) + +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/restclient-cppConfigVersion.cmake" + COMPATIBILITY + SameMajorVersion +) + +# export targets for find_package config mode +install(EXPORT restclient-cppTargets DESTINATION ${CONFIG_INSTALL_DIR}) + +install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/restclient-cppConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/restclient-cppConfigVersion.cmake + DESTINATION + ${CMAKE_INSTALL_PREFIX}/${CONFIG_INSTALL_DIR} +) + +if(Gtest_FOUND AND jsoncpp_FOUND) + +enable_testing() + + +add_executable(test-program + vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp + test/tests.cpp + test/test_restclient.cc + test/test_connection.cc +) +target_include_directories(test-program + PRIVATE include + PRIVATE vendor/jsoncpp-0.10.5/dist + PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/include") + +target_link_libraries(test-program + PUBLIC restclient-cpp + PUBLIC GTest::GTest +) +gtest_discover_tests(test-program + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + EXTRA_ARGS -VV +) + +endif() + + +# TODO: Setup ctest here for valgrind and CI + +# TODO: Setup cpack here for automatic packaging. +# Note most of the work is already done above due to use of properties and install commands. + +include(FeatureSummary) +feature_summary(WHAT ALL) + + From 9243fb1afc1f0bdf2c0afc617f8628d813f9d27d Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Mon, 6 May 2019 13:32:32 +0200 Subject: [PATCH 164/212] release v0.5.1 --- CHANGELOG.md | 6 +++++- configure.ac | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e631725..2b86cc49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # Changelog -## v0.5.0 (31st October 2018 +## v0.5.1 (6th May 2019) +- add initial cmake build +- switch httpbin tests over to https + +## v0.5.0 (31st October 2018) ### Features * Add PATCH and OPTIONS methods (#106) (drodil) diff --git a/configure.ac b/configure.ac index 6a392569..72f98a5a 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ([2.52]) -AC_INIT([restclient-cpp], [0.5.0], [d@unwiredcouch.com]) +AC_INIT([restclient-cpp], [0.5.1], [d@unwiredcouch.com]) AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT AC_CONFIG_HEADERS([config.h]) From 7e6357efdedaef62058f24eb5972a4b14d81bb91 Mon Sep 17 00:00:00 2001 From: Dennis Jenkins Date: Tue, 14 May 2019 11:06:20 -0700 Subject: [PATCH 165/212] Added support for Unix sockets. --- README.md | 17 +++++++++++++++++ include/restclient-cpp/connection.h | 5 +++++ source/connection.cc | 20 ++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/README.md b/README.md index 0fee4de9..ad7b1c10 100644 --- a/README.md +++ b/README.md @@ -213,6 +213,23 @@ conn->SetProxy("37.187.100.23:3128"); RestClient::Response res = conn->get("/get"); ``` +## Unix Socket Support + +- https://docs.docker.com/develop/sdk/examples/ +- $ curl --unix-socket /var/run/docker.sock http:/v1.24/containers/json + +Note that the URL used with a unix socket has only ONE leading forward slash. + +```cpp +RestClient::Connection* conn = new RestClient::Connection("http:/v1.30"); +conn->SetUnixSocketPath("/var/run/docker.sock"); +RestClient::HeaderFields headers; +headers["Accept"] = "application/json; charset=UTF-8"; +headers["Expect"] = ""; +conn->SetHeaders(headers); +auto resp = conn->get("/images/json"); +``` + ## Dependencies - [libcurl][] diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index b8ecbea4..df3423fb 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -120,6 +120,7 @@ class Connection { std::string keyPassword; std::string customUserAgent; std::string uriProxy; + std::string unixSocketPath; RequestInfo lastRequest; } Info; @@ -165,6 +166,9 @@ class Connection { // set CURLOPT_PROXY void SetProxy(const std::string& uriProxy); + // set CURLOPT_UNIX_SOCKET_PATH + void SetUnixSocketPath(const std::string& unixSocketPath); + std::string GetUserAgent(); RestClient::Connection::Info GetInfo(); @@ -212,6 +216,7 @@ class Connection { std::string keyPath; std::string keyPassword; std::string uriProxy; + std::string unixSocketPath; RestClient::Response performCurlRequest(const std::string& uri); }; }; // namespace RestClient diff --git a/source/connection.cc b/source/connection.cc index 43430219..bcdd53ca 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -71,6 +71,7 @@ RestClient::Connection::GetInfo() { ret.keyPassword = this->keyPassword; ret.uriProxy = this->uriProxy; + ret.unixSocketPath = this->unixSocketPath; return ret; } @@ -265,6 +266,19 @@ RestClient::Connection::SetProxy(const std::string& uriProxy) { } } +/** + * @brief set custom Unix socket path for connection. + * See https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html + * + * @param unixSocketPath - path to Unix socket (ex: /var/run/docker.sock) + * + */ +void +RestClient::Connection::SetUnixSocketPath(const std::string& unixSocketPath) { + this->unixSocketPath = unixSocketPath; +} + + /** * @brief helper function to get called from the actual request methods to * prepare the curlHandle for transfer with generic options, perform the @@ -376,6 +390,12 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { 1L); } + // set Unix socket path, if requested + if (!this->unixSocketPath.empty()) { + curl_easy_setopt(this->curlHandle, CURLOPT_UNIX_SOCKET_PATH, + this->unixSocketPath.c_str()); + } + res = curl_easy_perform(this->curlHandle); if (res != CURLE_OK) { switch (res) { From 4245c20162cc31087fc59525fad283fa378f0d2f Mon Sep 17 00:00:00 2001 From: Dennis Jenkins Date: Wed, 15 May 2019 04:10:45 -0700 Subject: [PATCH 166/212] Added support for Unix sockets. (#120) --- README.md | 17 +++++++++++++++++ include/restclient-cpp/connection.h | 5 +++++ source/connection.cc | 20 ++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/README.md b/README.md index 0fee4de9..ad7b1c10 100644 --- a/README.md +++ b/README.md @@ -213,6 +213,23 @@ conn->SetProxy("37.187.100.23:3128"); RestClient::Response res = conn->get("/get"); ``` +## Unix Socket Support + +- https://docs.docker.com/develop/sdk/examples/ +- $ curl --unix-socket /var/run/docker.sock http:/v1.24/containers/json + +Note that the URL used with a unix socket has only ONE leading forward slash. + +```cpp +RestClient::Connection* conn = new RestClient::Connection("http:/v1.30"); +conn->SetUnixSocketPath("/var/run/docker.sock"); +RestClient::HeaderFields headers; +headers["Accept"] = "application/json; charset=UTF-8"; +headers["Expect"] = ""; +conn->SetHeaders(headers); +auto resp = conn->get("/images/json"); +``` + ## Dependencies - [libcurl][] diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index b8ecbea4..df3423fb 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -120,6 +120,7 @@ class Connection { std::string keyPassword; std::string customUserAgent; std::string uriProxy; + std::string unixSocketPath; RequestInfo lastRequest; } Info; @@ -165,6 +166,9 @@ class Connection { // set CURLOPT_PROXY void SetProxy(const std::string& uriProxy); + // set CURLOPT_UNIX_SOCKET_PATH + void SetUnixSocketPath(const std::string& unixSocketPath); + std::string GetUserAgent(); RestClient::Connection::Info GetInfo(); @@ -212,6 +216,7 @@ class Connection { std::string keyPath; std::string keyPassword; std::string uriProxy; + std::string unixSocketPath; RestClient::Response performCurlRequest(const std::string& uri); }; }; // namespace RestClient diff --git a/source/connection.cc b/source/connection.cc index 43430219..bcdd53ca 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -71,6 +71,7 @@ RestClient::Connection::GetInfo() { ret.keyPassword = this->keyPassword; ret.uriProxy = this->uriProxy; + ret.unixSocketPath = this->unixSocketPath; return ret; } @@ -265,6 +266,19 @@ RestClient::Connection::SetProxy(const std::string& uriProxy) { } } +/** + * @brief set custom Unix socket path for connection. + * See https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html + * + * @param unixSocketPath - path to Unix socket (ex: /var/run/docker.sock) + * + */ +void +RestClient::Connection::SetUnixSocketPath(const std::string& unixSocketPath) { + this->unixSocketPath = unixSocketPath; +} + + /** * @brief helper function to get called from the actual request methods to * prepare the curlHandle for transfer with generic options, perform the @@ -376,6 +390,12 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { 1L); } + // set Unix socket path, if requested + if (!this->unixSocketPath.empty()) { + curl_easy_setopt(this->curlHandle, CURLOPT_UNIX_SOCKET_PATH, + this->unixSocketPath.c_str()); + } + res = curl_easy_perform(this->curlHandle); if (res != CURLE_OK) { switch (res) { From be4dd51ff4d2144d47828f14077d1981fb61bd43 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 15 May 2019 13:56:07 +0200 Subject: [PATCH 167/212] Revert "Added support for Unix sockets. (#120)" (#121) This reverts commit 4245c20162cc31087fc59525fad283fa378f0d2f. --- README.md | 17 ----------------- include/restclient-cpp/connection.h | 5 ----- source/connection.cc | 20 -------------------- 3 files changed, 42 deletions(-) diff --git a/README.md b/README.md index ad7b1c10..0fee4de9 100644 --- a/README.md +++ b/README.md @@ -213,23 +213,6 @@ conn->SetProxy("37.187.100.23:3128"); RestClient::Response res = conn->get("/get"); ``` -## Unix Socket Support - -- https://docs.docker.com/develop/sdk/examples/ -- $ curl --unix-socket /var/run/docker.sock http:/v1.24/containers/json - -Note that the URL used with a unix socket has only ONE leading forward slash. - -```cpp -RestClient::Connection* conn = new RestClient::Connection("http:/v1.30"); -conn->SetUnixSocketPath("/var/run/docker.sock"); -RestClient::HeaderFields headers; -headers["Accept"] = "application/json; charset=UTF-8"; -headers["Expect"] = ""; -conn->SetHeaders(headers); -auto resp = conn->get("/images/json"); -``` - ## Dependencies - [libcurl][] diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index df3423fb..b8ecbea4 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -120,7 +120,6 @@ class Connection { std::string keyPassword; std::string customUserAgent; std::string uriProxy; - std::string unixSocketPath; RequestInfo lastRequest; } Info; @@ -166,9 +165,6 @@ class Connection { // set CURLOPT_PROXY void SetProxy(const std::string& uriProxy); - // set CURLOPT_UNIX_SOCKET_PATH - void SetUnixSocketPath(const std::string& unixSocketPath); - std::string GetUserAgent(); RestClient::Connection::Info GetInfo(); @@ -216,7 +212,6 @@ class Connection { std::string keyPath; std::string keyPassword; std::string uriProxy; - std::string unixSocketPath; RestClient::Response performCurlRequest(const std::string& uri); }; }; // namespace RestClient diff --git a/source/connection.cc b/source/connection.cc index bcdd53ca..43430219 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -71,7 +71,6 @@ RestClient::Connection::GetInfo() { ret.keyPassword = this->keyPassword; ret.uriProxy = this->uriProxy; - ret.unixSocketPath = this->unixSocketPath; return ret; } @@ -266,19 +265,6 @@ RestClient::Connection::SetProxy(const std::string& uriProxy) { } } -/** - * @brief set custom Unix socket path for connection. - * See https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html - * - * @param unixSocketPath - path to Unix socket (ex: /var/run/docker.sock) - * - */ -void -RestClient::Connection::SetUnixSocketPath(const std::string& unixSocketPath) { - this->unixSocketPath = unixSocketPath; -} - - /** * @brief helper function to get called from the actual request methods to * prepare the curlHandle for transfer with generic options, perform the @@ -390,12 +376,6 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { 1L); } - // set Unix socket path, if requested - if (!this->unixSocketPath.empty()) { - curl_easy_setopt(this->curlHandle, CURLOPT_UNIX_SOCKET_PATH, - this->unixSocketPath.c_str()); - } - res = curl_easy_perform(this->curlHandle); if (res != CURLE_OK) { switch (res) { From 7089d8710e591cd4afb8c19bb3486c3f457b8fbf Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 24 May 2019 11:48:59 +0200 Subject: [PATCH 168/212] update CI dist to xenial --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5fa01d08..d120a963 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: cpp -dist: trusty +dist: xenial sudo: required group: beta From 59baca076e2f6f15f11fe207995b14467ddf0803 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 24 May 2019 12:03:34 +0200 Subject: [PATCH 169/212] add new style bug report template --- .github/ISSUE_TEMPLATE/bug_report.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..b6cd9d74 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,23 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +### Expected behaviour + +### Actual behaviour +### Environment and debugging details + +- compiler and version +- operating system +- version of restclient-cpp +- how did you install restclient-cpp? (via packages, git, tarball) +- libcurl version and compile flags +- full error output of your build as an inline codeblock or gist + +(some of these things might not apply but the more you can provide the easier +it will be to fix this bug. Thanks!) From ffbd6cdd98a03b945bc0e38d0b4f2ab5ecbd594e Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Fri, 24 May 2019 12:04:31 +0200 Subject: [PATCH 170/212] Delete ISSUE_TEMPLATE.md --- .github/ISSUE_TEMPLATE.md | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index a7a7482a..00000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,13 +0,0 @@ -### Expected behaviour - -### Actual behaviour - -### Environment and debugging details - -- compiler and version -- operating system -- libcurl version and compile flags -- full error output of your build as an inline codeblock or gist - -(some of these things might not apply but the more you can provide the easier -it will be to fix this bug. Thanks!) From 31d4b8508643e207f6ecb5648525fc200e518911 Mon Sep 17 00:00:00 2001 From: Cynthia Coan Date: Thu, 27 Jun 2019 18:45:04 -0600 Subject: [PATCH 171/212] mac os x uses glibtoolize not libtoolize for mac os x hosts "libtoolize" is not a correct command. this is because mac bundles it's own version of "libtool", which works differently, and may not even exist. instead if you use brew to install libtool: `brew install libtool` on mac, it writes to: `glibtoolize` as to leave mac happy with it's own version of libtool by default. this commit will properly use glibtoolize if detected, otherwise will fallback to just using libtoolize. --- autogen.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/autogen.sh b/autogen.sh index 7fd81e28..478db09b 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,7 +1,15 @@ #! /bin/sh [ -e config.cache ] && rm -f config.cache -libtoolize --automake +echo -n "testing for glibtoolize ... " +if glibtoolize --version >/dev/null 2>&1; then + LIBTOOLIZE=glibtoolize + echo "using glibtoolize" +else + LIBTOOLIZE=libtoolize + echo "using libtoolize" +fi +$LIBTOOLIZE --automake aclocal ${OECORE_ACLOCAL_OPTS} autoconf autoheader From 70f047f99c3fd2bf7f5523b519938bad413bb1e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E7=82=80?= Date: Wed, 10 Jul 2019 13:36:40 +0800 Subject: [PATCH 172/212] Update connection.cc fields reordered --- source/connection.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/connection.cc b/source/connection.cc index bcdd53ca..590972f5 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -26,7 +26,7 @@ * */ RestClient::Connection::Connection(const std::string& baseUrl) - : lastRequest(), headerFields() { + : headerFields(), lastRequest() { this->curlHandle = curl_easy_init(); if (!this->curlHandle) { throw std::runtime_error("Couldn't initialize curl handle"); From b5e946433f59a70b32c9673ef8fa05ce4e7138f6 Mon Sep 17 00:00:00 2001 From: Cynthia Coan Date: Sun, 7 Jul 2019 11:01:53 -0600 Subject: [PATCH 173/212] use lambda over ptr_fun ptr_fun was deprecated in C++11, and removed in C++17. lambdas have also been around since C++11. so there should be no loss in supported targets, but also adds in support for C++17 and beyond. --- CMakeLists.txt | 77 ++++++++++++++++---------------- Makefile.am | 2 +- include/restclient-cpp/helpers.h | 4 +- test/test_helpers.cc | 62 +++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 41 deletions(-) create mode 100644 test/test_helpers.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 45fc8875..45d32504 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,36 +39,36 @@ find_package(Threads REQUIRED) find_package(CURL REQUIRED) find_package(jsoncpp) -add_library(restclient-cpp SHARED - source/restclient.cc - source/connection.cc +add_library(restclient-cpp SHARED + source/restclient.cc + source/connection.cc source/helpers.cc ) -set_property(TARGET restclient-cpp PROPERTY SOVERSION 2.1.1) +set_property(TARGET restclient-cpp PROPERTY SOVERSION 2.1.1) target_compile_features(restclient-cpp PUBLIC cxx_std_11) -list(APPEND restclient-cpp_PUBLIC_HEADERS - include/restclient-cpp/restclient.h - "${CMAKE_CURRENT_BINARY_DIR}/include/restclient-cpp/version.h" - include/restclient-cpp/connection.h +list(APPEND restclient-cpp_PUBLIC_HEADERS + include/restclient-cpp/restclient.h + "${CMAKE_CURRENT_BINARY_DIR}/include/restclient-cpp/version.h" + include/restclient-cpp/connection.h include/restclient-cpp/helpers.h ) # target_sources(restclient-cpp PRIVATE ${restclient-cpp_PUBLIC_HEADERS}) -set_property(TARGET restclient-cpp PROPERTY +set_property(TARGET restclient-cpp PROPERTY PUBLIC_HEADER ${restclient-cpp_PUBLIC_HEADERS}) target_include_directories(restclient-cpp PRIVATE include) - -if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/version.h.in") -file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/version.h.in" [=[ -#ifndef INCLUDE_RESTCLIENT_CPP_VERSION_H_ -#define INCLUDE_RESTCLIENT_CPP_VERSION_H_ -#define RESTCLIENT_VERSION "@restclient-cpp_VERSION@" -#endif // INCLUDE_RESTCLIENT_CPP_VERSION_H_ -]=]) -endif() -configure_file("${CMAKE_CURRENT_BINARY_DIR}/version.h.in" - "${CMAKE_CURRENT_BINARY_DIR}/include/restclient-cpp/version.h") + +if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/version.h.in") +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/version.h.in" [=[ +#ifndef INCLUDE_RESTCLIENT_CPP_VERSION_H_ +#define INCLUDE_RESTCLIENT_CPP_VERSION_H_ +#define RESTCLIENT_VERSION "@restclient-cpp_VERSION@" +#endif // INCLUDE_RESTCLIENT_CPP_VERSION_H_ +]=]) +endif() +configure_file("${CMAKE_CURRENT_BINARY_DIR}/version.h.in" + "${CMAKE_CURRENT_BINARY_DIR}/include/restclient-cpp/version.h") target_include_directories(restclient-cpp PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/include") target_link_libraries(restclient-cpp @@ -90,8 +90,8 @@ install(TARGETS restclient-cpp EXPORT restclient-cppTargets RESOURCE DESTINATION ${DATA_INSTALL_DIR} ) -include(CMakePackageConfigHelpers) -file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake.in" +include(CMakePackageConfigHelpers) +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake.in" "@PACKAGE_INIT@\ninclude(\${CMAKE_CURRENT_LIST_DIR}/\@PROJECT_NAME\@Targets.cmake)\n") configure_package_config_file( ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake.in @@ -128,15 +128,16 @@ if(Gtest_FOUND AND jsoncpp_FOUND) enable_testing() -add_executable(test-program - vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp - test/tests.cpp - test/test_restclient.cc - test/test_connection.cc +add_executable(test-program + vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp + test/tests.cpp + test/test_restclient.cc + test/test_connection.cc + test/test_helpers.cc ) -target_include_directories(test-program - PRIVATE include - PRIVATE vendor/jsoncpp-0.10.5/dist +target_include_directories(test-program + PRIVATE include + PRIVATE vendor/jsoncpp-0.10.5/dist PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/include") target_link_libraries(test-program @@ -147,14 +148,14 @@ gtest_discover_tests(test-program WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} EXTRA_ARGS -VV ) - -endif() - - -# TODO: Setup ctest here for valgrind and CI - -# TODO: Setup cpack here for automatic packaging. -# Note most of the work is already done above due to use of properties and install commands. + +endif() + + +# TODO: Setup ctest here for valgrind and CI + +# TODO: Setup cpack here for automatic packaging. +# Note most of the work is already done above due to use of properties and install commands. include(FeatureSummary) feature_summary(WHAT ALL) diff --git a/Makefile.am b/Makefile.am index 0b4fc2dc..2981e582 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4,7 +4,7 @@ check_PROGRAMS = test-program pkginclude_HEADERS = include/restclient-cpp/restclient.h include/restclient-cpp/version.h include/restclient-cpp/connection.h include/restclient-cpp/helpers.h BUILT_SOURCES = include/restclient-cpp/version.h -test_program_SOURCES = vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp test/tests.cpp test/test_restclient.cc test/test_connection.cc +test_program_SOURCES = vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp test/tests.cpp test/test_helpers.cc test/test_restclient.cc test/test_connection.cc test_program_LDADD = .libs/librestclient-cpp.a test_program_LDFLAGS=-Lvendor/gtest-1.7.0/lib/.libs -lgtest test_program_CPPFLAGS=-Iinclude -Ivendor/gtest-1.7.0/include -Ivendor/jsoncpp-0.10.5/dist diff --git a/include/restclient-cpp/helpers.h b/include/restclient-cpp/helpers.h index 9078a267..79d161bd 100644 --- a/include/restclient-cpp/helpers.h +++ b/include/restclient-cpp/helpers.h @@ -53,14 +53,14 @@ namespace Helpers { // trim from start static inline std::string <rim(std::string &s) { // NOLINT s.erase(s.begin(), std::find_if(s.begin(), s.end(), - std::not1(std::ptr_fun(std::isspace)))); + [](int c) {return !std::isspace(c);})); return s; } // trim from end static inline std::string &rtrim(std::string &s) { // NOLINT s.erase(std::find_if(s.rbegin(), s.rend(), - std::not1(std::ptr_fun(std::isspace))).base(), s.end()); + [](int c) {return !std::isspace(c);}).base(), s.end()); return s; } diff --git a/test/test_helpers.cc b/test/test_helpers.cc new file mode 100644 index 00000000..613775b7 --- /dev/null +++ b/test/test_helpers.cc @@ -0,0 +1,62 @@ +#include "restclient-cpp/helpers.h" +#include +#include + +class HelpersTest : public ::testing::Test +{ + protected: + + HelpersTest() + { + } + + virtual ~HelpersTest() + { + } + + virtual void SetUp() + { + } + + virtual void TearDown() + { + } +}; + +TEST_F(HelpersTest, TrimLeft) { + auto can_trim_left = std::string(" a set of characters"); + auto cant_trim_left = std::string("a set of characters"); + auto right_trim_ignored = std::string("a set of characters "); + + EXPECT_EQ(RestClient::Helpers::ltrim(can_trim_left), + std::string("a set of characters")); + EXPECT_EQ(RestClient::Helpers::ltrim(cant_trim_left), + std::string("a set of characters")); + EXPECT_EQ(RestClient::Helpers::ltrim(right_trim_ignored), + std::string("a set of characters ")); +} + +TEST_F(HelpersTest, TrimRight) { + auto left_trim_ignored = std::string(" a set of characters"); + auto cant_trim_right = std::string("a set of characters"); + auto can_trim_right = std::string("a set of characters "); + + EXPECT_EQ(RestClient::Helpers::rtrim(left_trim_ignored), + std::string(" a set of characters")); + EXPECT_EQ(RestClient::Helpers::rtrim(cant_trim_right), + std::string("a set of characters")); + EXPECT_EQ(RestClient::Helpers::rtrim(can_trim_right), + std::string("a set of characters")); +} + +TEST_F(HelpersTest, TrimBoth) { + auto can_trim_both = std::string(" a set of characters "); + auto can_trim_left = std::string(" a set of characters"); + auto can_trim_right = std::string("a set of characters "); + auto cant_trim = std::string("a set of characters"); + + EXPECT_EQ(RestClient::Helpers::trim(can_trim_both), "a set of characters"); + EXPECT_EQ(RestClient::Helpers::trim(can_trim_left), "a set of characters"); + EXPECT_EQ(RestClient::Helpers::trim(can_trim_right), "a set of characters"); + EXPECT_EQ(RestClient::Helpers::trim(cant_trim), "a set of characters"); +} From 697bb5c61b925226e92c339003b7c36491b5f88b Mon Sep 17 00:00:00 2001 From: Cynthia Coan Date: Sun, 14 Jul 2019 08:42:09 -0600 Subject: [PATCH 174/212] add c++11 to compile flags --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 2981e582..8f52c75d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -11,7 +11,7 @@ test_program_CPPFLAGS=-Iinclude -Ivendor/gtest-1.7.0/include -Ivendor/jsoncpp-0. lib_LTLIBRARIES=librestclient-cpp.la librestclient_cpp_la_SOURCES=source/restclient.cc source/connection.cc source/helpers.cc -librestclient_cpp_la_CXXFLAGS=-fPIC +librestclient_cpp_la_CXXFLAGS=-fPIC -std=c++11 librestclient_cpp_la_LDFLAGS=-version-info 2:1:1 dist_doc_DATA = README.md From 659d8a4de2c78b4291e23bfd7d8d4ea36f5fa82a Mon Sep 17 00:00:00 2001 From: Cynthia Coan Date: Sun, 14 Jul 2019 09:15:23 -0600 Subject: [PATCH 175/212] add c++11 flag to test program --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 8f52c75d..4872a304 100644 --- a/Makefile.am +++ b/Makefile.am @@ -7,7 +7,7 @@ BUILT_SOURCES = include/restclient-cpp/version.h test_program_SOURCES = vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp test/tests.cpp test/test_helpers.cc test/test_restclient.cc test/test_connection.cc test_program_LDADD = .libs/librestclient-cpp.a test_program_LDFLAGS=-Lvendor/gtest-1.7.0/lib/.libs -lgtest -test_program_CPPFLAGS=-Iinclude -Ivendor/gtest-1.7.0/include -Ivendor/jsoncpp-0.10.5/dist +test_program_CPPFLAGS=-std=c++11 -Iinclude -Ivendor/gtest-1.7.0/include -Ivendor/jsoncpp-0.10.5/dist lib_LTLIBRARIES=librestclient-cpp.la librestclient_cpp_la_SOURCES=source/restclient.cc source/connection.cc source/helpers.cc From 0474a8745e050cc329c99d773298eaa84fc3c730 Mon Sep 17 00:00:00 2001 From: Jorge Marizan Date: Fri, 20 Sep 2019 14:32:01 -0400 Subject: [PATCH 176/212] Added configurable compile type to CMakeLists.txt --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 45d32504..a01687a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,7 +39,7 @@ find_package(Threads REQUIRED) find_package(CURL REQUIRED) find_package(jsoncpp) -add_library(restclient-cpp SHARED +add_library(restclient-cpp ${COMPILE_TYPE} source/restclient.cc source/connection.cc source/helpers.cc From afc0e6cb8d8ca705bbad7b111968123e7284047d Mon Sep 17 00:00:00 2001 From: Jorge Marizan Date: Fri, 20 Sep 2019 14:36:08 -0400 Subject: [PATCH 177/212] Added default compile type to CMakeLists.txt --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index a01687a1..29cac8dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,10 @@ find_package(Threads REQUIRED) find_package(CURL REQUIRED) find_package(jsoncpp) +if(NOT DEFINED COMPILE_TYPE) + set(COMPILE_TYPE SHARED) +endif(NOT DEFINED COMPILE_TYPE) + add_library(restclient-cpp ${COMPILE_TYPE} source/restclient.cc source/connection.cc From 6336cae5275c9aeddf99f13c49e8f9320f7ca4bc Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 9 Oct 2019 11:38:51 +0200 Subject: [PATCH 178/212] update version in CMakeLists closes #131 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 29cac8dd..10b8db82 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.10.0) project(restclient-cpp - VERSION 0.5.0 + VERSION 0.5.1 DESCRIPTION "REST client for C++" HOMEPAGE_URL "http://code.mrtazz.com/restclient-cpp" ) From b958a870e8b2e694b1779bd6c2e072fbbd91fcf5 Mon Sep 17 00:00:00 2001 From: tastytea Date: Wed, 18 Dec 2019 16:01:30 +0100 Subject: [PATCH 179/212] Set minimum CMake version to 3.12.0 HOMEPAGE_URL in project() needs 3.12. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 10b8db82..38846124 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ -cmake_minimum_required(VERSION 3.10.0) +cmake_minimum_required(VERSION 3.12.0) project(restclient-cpp VERSION 0.5.1 From 61290ece847d3dea204c8beec3cc0bc1a03d608a Mon Sep 17 00:00:00 2001 From: tastytea Date: Wed, 18 Dec 2019 16:34:53 +0100 Subject: [PATCH 180/212] Replace hardcoded installation directories with GNUInstallDirs. GNUInstallDirs are portable, many users are familiar with them and they make the life of package maintainers easier. --- CMakeLists.txt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 10b8db82..7ea8b630 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,11 +80,12 @@ target_link_libraries(restclient-cpp PUBLIC Threads::Threads ) -set(INCLUDE_INSTALL_DIR "include/restclient-cpp" ) -set(CONFIG_INSTALL_DIR "lib/cmake/restclient-cpp" ) -set(RUNTIME_INSTALL_DIR "bin" ) -set(LIB_INSTALL_DIR "lib" ) -set(DATA_INSTALL_DIR "share/restclient-cpp" ) +include(GNUInstallDirs) +set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}/restclient-cpp" ) +set(CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/restclient-cpp" ) +set(RUNTIME_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" ) +set(LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}" ) +set(DATA_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/restclient-cpp" ) install(TARGETS restclient-cpp EXPORT restclient-cppTargets PUBLIC_HEADER DESTINATION ${INCLUDE_INSTALL_DIR} From 7c0980f9a644ded669f6b499004decd4de9821c0 Mon Sep 17 00:00:00 2001 From: tastytea Date: Wed, 18 Dec 2019 17:50:17 +0100 Subject: [PATCH 181/212] Add CURL and Threads as dependency in CMake config. Use find_dependency() to depend on CURL and Threads so CMake users don't have to do it themselves. --- CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 10b8db82..e4a153da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -96,7 +96,11 @@ install(TARGETS restclient-cpp EXPORT restclient-cppTargets include(CMakePackageConfigHelpers) file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake.in" - "@PACKAGE_INIT@\ninclude(\${CMAKE_CURRENT_LIST_DIR}/\@PROJECT_NAME\@Targets.cmake)\n") + "@PACKAGE_INIT@\n" + "include(CMakeFindDependencyMacro)\n" + "find_dependency(CURL REQUIRED)\n" + "find_dependency(Threads REQUIRED)\n" + "include(\${CMAKE_CURRENT_LIST_DIR}/\@PROJECT_NAME\@Targets.cmake)\n") configure_package_config_file( ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake From 6cb901355e99816cf56d046c31add89bd2077825 Mon Sep 17 00:00:00 2001 From: tastytea Date: Fri, 27 Dec 2019 01:04:08 +0100 Subject: [PATCH 182/212] Use the standard CMake-flag BUILD_SHARED_LIBS. COMPILE_TYPE is left in for backwards compatibility. --- CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 10b8db82..74ff9059 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,11 +39,12 @@ find_package(Threads REQUIRED) find_package(CURL REQUIRED) find_package(jsoncpp) -if(NOT DEFINED COMPILE_TYPE) - set(COMPILE_TYPE SHARED) -endif(NOT DEFINED COMPILE_TYPE) +option(BUILD_SHARED_LIBS "Build shared library." YES) +if(COMPILE_TYPE STREQUAL "SHARED") + set(BUILD_SHARED_LIBS YES) +endif() -add_library(restclient-cpp ${COMPILE_TYPE} +add_library(restclient-cpp source/restclient.cc source/connection.cc source/helpers.cc From 7583e4af10be566953e5440d22e48731c7f252ed Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 12 Feb 2020 11:00:04 +0100 Subject: [PATCH 183/212] add "help wanted" paragraph to contributing.md --- .github/CONTRIBUTING.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 8b738748..187f4ff7 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -15,3 +15,10 @@ working docker setup to make the full test suite pass. 1. build vendorized gtest: `./utils/build_gtest.sh` 2. build restclient-cpp: `./autogen.sh && ./configure && make check` 3. run the unit test suite: `make ci` + +## Help wanted +Given that I'm not in a position to maintain compatibility with all the different +platforms, contributions around these are especially appreciated. I try to label +issues accordingly. Some examples are: +- [windows support](https://github.com/mrtazz/restclient-cpp/labels/windows) +- [debian build problems](https://github.com/mrtazz/restclient-cpp/labels/debian) From 996f6bf85b3776b532b62c57be09cd3686cf3322 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 12 Feb 2020 11:15:15 +0100 Subject: [PATCH 184/212] bump version to 0.5.2 --- CHANGELOG.md | 17 +++++++++++++++++ CMakeLists.txt | 4 ++-- configure.ac | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b86cc49..0c9bfd17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## v0.5.2 (12th February 2020) +- add a pkg-config setup +- Use the standard CMake-flag BUILD_SHARED_LIBS. (tastytea) +- Add CURL and Threads as dependency in CMake config. (tastytea) +- Replace hardcoded installation directories with GNUInstallDirs. (tastytea) +- Set minimum CMake version to 3.12.0 (tastytea) +- Added default compile type to CMakeLists.txt (Jorge Marizan) +- Added configurable compile type to CMakeLists.txt (Jorge Marizan) +- use lambda over ptr_fun (Cynthia Coan) +- mac os x uses glibtoolize not libtoolize (Cynthia Coan) +- Use std::make_unique when C++14 is available (Heikki Hellgren) +- fix git version problems during yocto build (Giuseppe Ursino) +- fix autogen to work with yocto (Giuseppe Ursino) +- fix relative path issues (Giuseppe Ursino) +- Added support for Unix sockets. (Dennis Jenkins) +- update CI dist to xenial (Daniel Schauenberg) + ## v0.5.1 (6th May 2019) - add initial cmake build - switch httpbin tests over to https diff --git a/CMakeLists.txt b/CMakeLists.txt index bc6a55bf..eb5bb77d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.12.0) project(restclient-cpp - VERSION 0.5.1 + VERSION 0.5.2 DESCRIPTION "REST client for C++" HOMEPAGE_URL "http://code.mrtazz.com/restclient-cpp" ) @@ -115,7 +115,7 @@ configure_package_config_file( LIB_INSTALL_DIR DATA_INSTALL_DIR ) - + write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/restclient-cppConfigVersion.cmake" COMPATIBILITY diff --git a/configure.ac b/configure.ac index dcb0e0ac..e42c3fb4 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ([2.52]) -AC_INIT([restclient-cpp], [0.5.1], [d@unwiredcouch.com]) +AC_INIT([restclient-cpp], [0.5.2], [d@unwiredcouch.com]) AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT AC_CONFIG_HEADERS([config.h]) From 4a07e304341e2a4a1a623cc5aba570685f590a53 Mon Sep 17 00:00:00 2001 From: PhoebeHui <20694052+PhoebeHui@users.noreply.github.com> Date: Fri, 28 Feb 2020 05:40:36 -0800 Subject: [PATCH 185/212] Add vcpkg installation instructions --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index ad7b1c10..3c59d319 100644 --- a/README.md +++ b/README.md @@ -250,6 +250,19 @@ Otherwise you can do the regular autotools dance: make install ``` +Alternatively, you can build and install restclient-cpp using [vcpkg](https://github.com/microsoft/vcpkg/) dependency manager: + +```bash +git clone https://github.com/Microsoft/vcpkg.git +cd vcpkg +./bootstrap-vcpkg.sh +./vcpkg integrate install +./vcpkg install restclient-cpp +``` + +The restclient-cpp port in vcpkg is kept up to date by Microsoft team members and community contributors. +If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. + ## Contribute All contributions are highly appreciated. This includes filing issues, updating documentation and writing code. Please take a look at the From d69bbce52caab3477ff3d7854255d7365cdebfda Mon Sep 17 00:00:00 2001 From: Spencer Hawkins Date: Thu, 16 Apr 2020 12:55:33 -0700 Subject: [PATCH 186/212] Save curlCode and curlError to lastRequest redirectCount is supposed to be a long--this was probably causing memory corruption --- include/restclient-cpp/connection.h | 11 ++++++++++- source/connection.cc | 7 +++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index 608fcef6..a71adc12 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -56,6 +56,12 @@ class Connection { * @var RequestInfo::redirectCount * Member 'redirectCount' contains the number of redirects followed. See * CURLINFO_REDIRECT_COUNT + * @var RequestInfo::curlCode + * Member 'curlCode' contains the cURL code (cast to int). See + * libcurl-errors + * @var RequestInfo::curlError + * Member 'curlError' contains the cURL error as a string, if any. See + * CURLOPT_ERRORBUFFER */ typedef struct { double totalTime; @@ -65,7 +71,9 @@ class Connection { double preTransferTime; double startTransferTime; double redirectTime; - int redirectCount; + long redirectCount; + int curlCode; + std::string curlError; } RequestInfo; /** * @struct Info @@ -231,6 +239,7 @@ class Connection { std::string keyPassword; std::string uriProxy; std::string unixSocketPath; + char curlErrorBuf[CURL_ERROR_SIZE]; RestClient::Response performCurlRequest(const std::string& uri); }; }; // namespace RestClient diff --git a/source/connection.cc b/source/connection.cc index 224d4a8e..fcde3960 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -359,6 +359,10 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { curl_easy_setopt(this->curlHandle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_easy_setopt(this->curlHandle, CURLOPT_USERPWD, authString.c_str()); } + /** set error buffer */ + curl_easy_setopt(this->curlHandle, CURLOPT_ERRORBUFFER, + this->curlErrorBuf); + /** set user agent */ curl_easy_setopt(this->curlHandle, CURLOPT_USERAGENT, this->GetUserAgent().c_str()); @@ -441,6 +445,7 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { } res = curl_easy_perform(this->curlHandle); + this->lastRequest.curlCode = res; if (res != CURLE_OK) { switch (res) { case CURLE_OPERATION_TIMEDOUT: @@ -461,6 +466,8 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { ret.code = static_cast(http_code); } + this->lastRequest.curlError = std::string(this->curlErrorBuf); + curl_easy_getinfo(this->curlHandle, CURLINFO_TOTAL_TIME, &this->lastRequest.totalTime); curl_easy_getinfo(this->curlHandle, CURLINFO_NAMELOOKUP_TIME, From b9d4759ebf546536cad033b1f48c2ad32d196eeb Mon Sep 17 00:00:00 2001 From: Spencer Hawkins Date: Thu, 16 Apr 2020 14:21:41 -0700 Subject: [PATCH 187/212] Don't half-handle cURL error codes (closes #153) If cURL returns some error code, just return that to the caller as ret.code. This works because CURLE codes currently stop at 92 (i.e. they do not overlap with HTTP 1xx codes). If a caller notices a code 92 or below, they can inspect ret.body for some rough analysis of the error. If that is not good enough, they can also inspect GetInfo().lastRequest.curlError to see the output that curl put in the curl error buffer (which is for some reason different than curl_easy_strerror output). --- .github/CONTRIBUTING.md | 7 ++++--- README.md | 11 ++++++++++- include/restclient-cpp/connection.h | 6 +++++- include/restclient-cpp/restclient.h | 4 ++-- source/connection.cc | 19 ++++++------------- test/test_connection.cc | 28 +++++++++++++++++++++++----- test/test_restclient.cc | 20 +++++++++++++------- 7 files changed, 63 insertions(+), 32 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 187f4ff7..7c264a5e 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -10,11 +10,12 @@ ## How to run tests Since most of the tests are actually integration tests you will need to have a -working docker setup to make the full test suite pass. +working docker setup to make the full test suite pass. gtest build requires python 2 :( 1. build vendorized gtest: `./utils/build_gtest.sh` -2. build restclient-cpp: `./autogen.sh && ./configure && make check` -3. run the unit test suite: `make ci` +1. build restclient-cpp: `./autogen.sh && ./configure && make check` +1. ensure you have cpplint available `pip install cpplint` +1. run the unit test suite: `make ci` ## Help wanted Given that I'm not in a position to maintain compatibility with all the different diff --git a/README.md b/README.md index 60d8af3c..06300e7f 100644 --- a/README.md +++ b/README.md @@ -159,7 +159,7 @@ The connection object stores the curl easy handle in an instance variable and uses that for the lifetime of the object. This means curl will [automatically reuse connections][curl_keepalive] made with that handle. -## Progress callback +### Progress callback Two wrapper functions are provided to setup the progress callback for uploads/downloads. @@ -175,6 +175,15 @@ conn->SetFileProgressCallback(progressFunc); conn->SetFileProgressCallbackData(data); ``` +## Error handling +When restclient-cpp encounters an error, generally the error (or "status") code is returned in the `Response` (see +[Response struct in restclient.h](https://github.com/mrtazz/restclient-cpp/blob/master/include/restclient-cpp/restclient.h)). This error code can be either +an [HTTP error code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status), or if a lower-level cURL error was encountered, it may be +a [CURLCode](https://curl.haxx.se/libcurl/c/libcurl-errors.html). Currently, libcurl only defines 92 error codes, which means +there is no overlap between cURL error codes and HTTP response codes (which start at 1xx). However, if in the future, libcurl defines more than 99 +error codes, meaning that cURL errors overlap with the HTTP 1xx class of responses, restclient-cpp will return a -1 if the CURLCode is 100 or higher. +In this case, callers can use `GetInfo().lastRequest.curlCode` to inspect the actual cURL error. + ## Thread Safety restclient-cpp leans heavily on libcurl as it aims to provide a thin wrapper around it. This means it adheres to the basic level of thread safety [provided diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index a71adc12..2e4f9276 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -71,7 +71,11 @@ class Connection { double preTransferTime; double startTransferTime; double redirectTime; - long redirectCount; + // note: libcurl specifies redirectCount is a long, but cpplint + // won't let us use long to match. So we must default to the + // largest int type available so as to not allow curl to corrupt + // the curlCode in that follows in this struct + uint64_t redirectCount; int curlCode; std::string curlError; } RequestInfo; diff --git a/include/restclient-cpp/restclient.h b/include/restclient-cpp/restclient.h index a5542b2d..601e7f2a 100644 --- a/include/restclient-cpp/restclient.h +++ b/include/restclient-cpp/restclient.h @@ -28,9 +28,9 @@ typedef std::map HeaderFields; /** @struct Response * @brief This structure represents the HTTP response data * @var Response::code - * Member 'code' contains the HTTP response code + * Member 'code' contains the HTTP response code, or cURL error code * @var Response::body - * Member 'body' contains the HTTP response body + * Member 'body' contains the HTTP response body, or curl_easy_strerror output * @var Response::headers * Member 'headers' contains the HTTP response headers */ diff --git a/source/connection.cc b/source/connection.cc index fcde3960..b7a993b6 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -362,7 +362,7 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { /** set error buffer */ curl_easy_setopt(this->curlHandle, CURLOPT_ERRORBUFFER, this->curlErrorBuf); - + /** set user agent */ curl_easy_setopt(this->curlHandle, CURLOPT_USERAGENT, this->GetUserAgent().c_str()); @@ -447,19 +447,12 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { res = curl_easy_perform(this->curlHandle); this->lastRequest.curlCode = res; if (res != CURLE_OK) { - switch (res) { - case CURLE_OPERATION_TIMEDOUT: - ret.code = res; - ret.body = "Operation Timeout."; - break; - case CURLE_SSL_CERTPROBLEM: - ret.code = res; - ret.body = curl_easy_strerror(res); - break; - default: - ret.body = "Failed to query."; - ret.code = -1; + int retCode = res; + if (retCode > 99) { + retCode = -1; } + ret.code = retCode; + ret.body = curl_easy_strerror(res); } else { int64_t http_code = 0; curl_easy_getinfo(this->curlHandle, CURLINFO_RESPONSE_CODE, &http_code); diff --git a/test/test_connection.cc b/test/test_connection.cc index 379aa35d..c31b16de 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -46,8 +46,8 @@ TEST_F(ConnectionTest, TestFailForInvalidCA) conn->SetCAInfoFilePath("non-existent file"); RestClient::Response res = conn->get("/get"); - EXPECT_EQ("Failed to query.", res.body); - EXPECT_EQ(-1, res.code); + EXPECT_EQ("Problem with the SSL CA cert (path? access rights?)", res.body); + EXPECT_EQ(77, res.code); } TEST_F(ConnectionTest, TestDefaultUserAgent) @@ -104,6 +104,22 @@ TEST_F(ConnectionTest, TestSSLCert) EXPECT_EQ(58, res.code); } +TEST_F(ConnectionTest, TestCurlError) +{ + auto cancelCallback = [](void* pData, double downloadTotal, double downloaded, double uploadTotal, double uploaded) -> int { + // abort connection at first progress callback + return 1; + }; + conn->SetFileProgressCallback(cancelCallback); + conn->SetFileProgressCallbackData(NULL); + + RestClient::Response res = conn->get("/get"); + int errorCode = conn->GetInfo().lastRequest.curlCode; + + EXPECT_EQ(42, res.code); + EXPECT_EQ(42, errorCode); +} + TEST_F(ConnectionTest, TestSetHeaders) { RestClient::HeaderFields headers; @@ -191,7 +207,8 @@ TEST_F(ConnectionTest, TestFollowRedirectLimited) EXPECT_EQ(302, res.code); conn->FollowRedirects(true, 1); res = conn->get("/redirect/2"); - EXPECT_EQ(-1, res.code); + // 47 = CURLE_TOO_MANY_REDIRECTS + EXPECT_EQ(47, res.code); conn->FollowRedirects(true, 2); res = conn->get("/redirect/2"); EXPECT_EQ(200, res.code); @@ -278,6 +295,7 @@ TEST_F(ConnectionTest, TestInvalidProxy) { conn->SetProxy("127.0.0.1:666"); RestClient::Response res = conn->get("/get"); - EXPECT_EQ("Failed to query.", res.body); - EXPECT_EQ(-1, res.code); + EXPECT_EQ("Couldn't connect to server", res.body); + // 7 = CURLE_COULDNT_CONNECT + EXPECT_EQ(7, res.code); } diff --git a/test/test_restclient.cc b/test/test_restclient.cc index e25cad6e..e6230c48 100644 --- a/test/test_restclient.cc +++ b/test/test_restclient.cc @@ -51,7 +51,8 @@ TEST_F(RestClientTest, TestRestClientDELETEFailureCode) { std::string u = "http://nonexistent"; RestClient::Response res = RestClient::del(u); - EXPECT_EQ(-1, res.code); + // 6 = CURLE_COULDNT_RESOLVE_HOST + EXPECT_EQ(6, res.code); } TEST_F(RestClientTest, TestRestClientDELETEHeaders) @@ -89,8 +90,9 @@ TEST_F(RestClientTest, TestRestClientGETFailureCode) { std::string u = "http://nonexistent"; RestClient::Response res = RestClient::get(u); - EXPECT_EQ("Failed to query.", res.body); - EXPECT_EQ(-1, res.code); + EXPECT_EQ("Couldn't resolve host name", res.body); + // 6 = CURLE_COULDNT_RESOLVE_HOST + EXPECT_EQ(6, res.code); } TEST_F(RestClientTest, TestRestClientGETHeaders) @@ -123,7 +125,8 @@ TEST_F(RestClientTest, TestRestClientPOSTFailureCode) { std::string u = "http://nonexistent"; RestClient::Response res = RestClient::post(u, "text/text", "data"); - EXPECT_EQ(-1, res.code); + // 6 = CURLE_COULDNT_RESOLVE_HOST + EXPECT_EQ(6, res.code); } TEST_F(RestClientTest, TestRestClientPOSTHeaders) @@ -156,7 +159,8 @@ TEST_F(RestClientTest, TestRestClientPUTFailureCode) { std::string u = "http://nonexistent"; RestClient::Response res = RestClient::put(u, "text/text", "data"); - EXPECT_EQ(-1, res.code); + // 6 = CURLE_COULDNT_RESOLVE_HOST + EXPECT_EQ(6, res.code); } TEST_F(RestClientTest, TestRestClientPUTHeaders) @@ -189,7 +193,8 @@ TEST_F(RestClientTest, TestRestClientPATCHFailureCode) { std::string u = "http://nonexistent"; RestClient::Response res = RestClient::patch(u, "text/text", "data"); - EXPECT_EQ(-1, res.code); + // 6 = CURLE_COULDNT_RESOLVE_HOST + EXPECT_EQ(6, res.code); } TEST_F(RestClientTest, TestRestClientPATCHHeaders) @@ -212,7 +217,8 @@ TEST_F(RestClientTest, TestRestClientOPTIONSFailureCode) { std::string u = "http://nonexistent"; RestClient::Response res = RestClient::options(u); - EXPECT_EQ(-1, res.code); + // 6 = CURLE_COULDNT_RESOLVE_HOST + EXPECT_EQ(6, res.code); } TEST_F(RestClientTest, TestRestClientOPTIONSHeaders) From 4da34b701ab0b7604b619ca716cbf67037334453 Mon Sep 17 00:00:00 2001 From: Lawrence O'Boyle Date: Wed, 22 Jul 2020 12:58:10 -0500 Subject: [PATCH 188/212] These two lines allow the scope of the property for the public headers to be available when making use of the add_subdirectory from a parent project. This will allow other add_subdirectory's to reference the headers during the build process of cmake. --- CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index eb5bb77d..94b3d52e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,7 +62,11 @@ list(APPEND restclient-cpp_PUBLIC_HEADERS # target_sources(restclient-cpp PRIVATE ${restclient-cpp_PUBLIC_HEADERS}) set_property(TARGET restclient-cpp PROPERTY PUBLIC_HEADER ${restclient-cpp_PUBLIC_HEADERS}) -target_include_directories(restclient-cpp PRIVATE include) +target_include_directories(restclient-cpp + PRIVATE include + PUBLIC $ + PUBLIC $ +) if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/version.h.in") file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/version.h.in" [=[ From 335f7c1eea613a126f59f03f2f66ab54e920ea8c Mon Sep 17 00:00:00 2001 From: ejacques Date: Mon, 11 May 2020 09:42:30 -0400 Subject: [PATCH 189/212] allow custom callback and response, fix CI Enables streaming get, and out-of-band termination of connection. Had to fix CI as well. Added necessary tests, and enabled a previously disabled test. --- Makefile.am | 22 +++- README.md | 41 ++++++ include/restclient-cpp/connection.h | 20 +++ source/connection.cc | 192 +++++++++++++++++++--------- test/squid.conf | 9 ++ test/test_connection.cc | 112 +++++++++++++--- test/test_restclient.cc | 68 +++++----- test/tests.cpp | 18 +++ test/tests.h | 14 ++ 9 files changed, 377 insertions(+), 119 deletions(-) create mode 100644 test/squid.conf create mode 100644 test/tests.h diff --git a/Makefile.am b/Makefile.am index 4872a304..f297443a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -16,27 +16,35 @@ librestclient_cpp_la_LDFLAGS=-version-info 2:1:1 dist_doc_DATA = README.md -.PHONY: test check clean-coverage-files coverage-html include/restclient-cpp/version.h lint ci docker-services +.PHONY: test check clean-coverage-files coverage-html include/restclient-cpp/version.h lint ci docker-services clean-docker-services include/restclient-cpp/version.h: m4 -I ${top_srcdir}/m4 -DM4_RESTCLIENT_VERSION=$(PACKAGE_VERSION) version.h.m4 > ${top_srcdir}/$@ -test: check +test: check docker-services ./test-program valgrind: check valgrind --leak-check=full --error-exitcode=1 ./test-program lint: - cpplint --filter=-legal/copyright include/restclient-cpp/*.h source/*.cc + cpplint --filter=-legal/copyright --root=$(CURDIR) include/restclient-cpp/*.h source/*.cc docker-services: - docker inspect --format="{{ .State.Running }}" restclient-proxy &> /dev/null || docker run -d --name restclient-proxy -p 3128:3128 chrisdaish/squid - docker ps -a - -ci: lint docker-services test valgrind + [ -n "$$(docker ps --quiet --filter name=restclient-cpp-httpbin)" ] || \ + docker run --detach -p 8998:80 --name restclient-cpp-httpbin kennethreitz/httpbin + [ -n "$$(docker ps --quiet --filter name=restclient-cpp-squid)" ] || \ + docker run --detach -p 3128:3128 --name restclient-cpp-squid \ + --volume "$(CURDIR)/test/squid.conf:/etc/squid/squid.conf:ro" sameersbn/squid:3.5.27-2 + docker ps --all --filter 'name=^restclient-cpp-' + +clean-docker-services: + docker rm --force restclient-cpp-httpbin 2>/dev/null || true + docker rm --force restclient-cpp-squid 2>/dev/null || true + +ci: lint test valgrind clean-local: find . -name "*.gcda" -print0 | xargs -0 rm diff --git a/README.md b/README.md index 06300e7f..3ec3cfc9 100644 --- a/README.md +++ b/README.md @@ -175,6 +175,47 @@ conn->SetFileProgressCallback(progressFunc); conn->SetFileProgressCallbackData(data); ``` +### Write callback + +A write callback function can be provided for processing data as it's received from a GET call (for instance the [Kubernetes Watch API](https://kubernetes.io/docs/reference/using-api/api-concepts/#efficient-detection-of-changes)). + +Calling `conn->SetWriteFunction(callback)` with a function parameter matching the prototype `size_t write_function(void *data, size_t size, size_t nmemb, void *userdata)int progress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)` will setup the write function. + +Here is an example of a write callback function, processing result data line by line. + +```cpp +auto writeCallback = [](void *data, size_t size, size_t nmemb, void *userdata) -> size_t +{ + size_t bytes = size * nmemb; + try + { + // Add to the buffer + auto res = reinterpret_cast(userdata); + res->body.append(static_cast(data), bytes); + // If the last character is not a new line, wait for the rest. + if ('\n' != *(res->body.end() - 1)) + { + return bytes; + } + // Process data one line at a time. + std::stringstream stream(res->body); + std::string line; + while (std::getline(stream, line)) + { + // Do something with the line here... + } + // Done processing the line + res->body.clear(); + } + catch(std::exception e) + { + // Log caught exception here + return 0; + } + return bytes; +}; +``` + ## Error handling When restclient-cpp encounters an error, generally the error (or "status") code is returned in the `Response` (see [Response struct in restclient.h](https://github.com/mrtazz/restclient-cpp/blob/master/include/restclient-cpp/restclient.h)). This error code can be either diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index 2e4f9276..c39c022a 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -22,6 +22,12 @@ */ namespace RestClient { +/** + * @brief define type used for RestClient write callback + */ +typedef size_t (*WriteCallback)(void *data, size_t size, + size_t nmemb, void *userdata); + /** * @brief Connection object for advanced usage */ @@ -146,6 +152,9 @@ class Connection { explicit Connection(const std::string& baseUrl); ~Connection(); + // Terminate open connection + void Terminate(); + // Instance configuration methods // configure basic auth void SetBasicAuth(const std::string& username, @@ -193,6 +202,9 @@ class Connection { // set CURLOPT_UNIX_SOCKET_PATH void SetUnixSocketPath(const std::string& unixSocketPath); + // set CURLOPT_WRITEFUNCTION + void SetWriteFunction(WriteCallback write_callback); + std::string GetUserAgent(); RestClient::Connection::Info GetInfo(); @@ -220,7 +232,12 @@ class Connection { RestClient::Response head(const std::string& uri); RestClient::Response options(const std::string& uri); + // GET with custom response structure + RestClient::Response* + get(const std::string& uri, RestClient::Response* response); + private: + CURL* getCurlHandle(); CURL* curlHandle; std::string baseUrl; RestClient::HeaderFields headerFields; @@ -244,6 +261,9 @@ class Connection { std::string uriProxy; std::string unixSocketPath; char curlErrorBuf[CURL_ERROR_SIZE]; + RestClient::WriteCallback writeCallback; + RestClient::Response* + performCurlRequest(const std::string& uri, RestClient::Response* resp); RestClient::Response performCurlRequest(const std::string& uri); }; }; // namespace RestClient diff --git a/source/connection.cc b/source/connection.cc index b7a993b6..54118633 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -38,12 +38,29 @@ RestClient::Connection::Connection(const std::string& baseUrl) this->noSignal = false; this->progressFn = NULL; this->progressFnData = NULL; + this->writeCallback = RestClient::Helpers::write_callback; } -RestClient::Connection::~Connection() { +/** + * @brief Getter used to ensure NULL handle is not used. + * + */ +CURL* RestClient::Connection::getCurlHandle() { + if (this->curlHandle) { + return this->curlHandle; + } + throw std::runtime_error("Connection terminated"); +} + +void RestClient::Connection::Terminate() { if (this->curlHandle) { curl_easy_cleanup(this->curlHandle); } + this->curlHandle = NULL; +} + +RestClient::Connection::~Connection() { + this->Terminate(); } // getters/setters @@ -305,6 +322,19 @@ RestClient::Connection::SetUnixSocketPath(const std::string& unixSocketPath) { this->unixSocketPath = unixSocketPath; } +/** + * @brief set callback for writing received data. Last parameter + * to callback (userdata) points to a RestClient::Response. For details, + * see https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html + * + * @param write_callback - callback to handle received data + * + */ +void +RestClient::Connection::SetWriteFunction(RestClient::WriteCallback +writeCallback) { + this->writeCallback = writeCallback; +} /** * @brief helper function to get called from the actual request methods to @@ -315,14 +345,37 @@ RestClient::Connection::SetUnixSocketPath(const std::string& unixSocketPath) { * parameters on the object for another request. * * @param uri URI to query - * @param ret Reference to the Response struct that should be filled * - * @return 0 on success and 1 on error + * @return Reference to the Response struct that should be filled */ RestClient::Response RestClient::Connection::performCurlRequest(const std::string& uri) { // init return type RestClient::Response ret = {}; + performCurlRequest(uri, &ret); + return ret; +} + +/** + * @brief helper function to get called from the actual request methods to + * prepare the curlHandle for transfer with generic options, perform the + * request and record some stats from the last request and then reset the + * handle with curl_easy_reset to its default state. This will keep things + * like connections and session ID intact but makes sure you can change + * parameters on the object for another request. + * + * @param uri URI to query + * @param ret Reference to the response struct that should be filled + * + * @return reference to response struct for chaining + */ +RestClient::Response* +RestClient::Connection::performCurlRequest(const std::string& uri, + RestClient::Response* ret) { + // init return type + ret->body.clear(); + ret->code = 0; + ret->headers.clear(); std::string url = std::string(this->baseUrl + uri); std::string headerString; @@ -330,17 +383,17 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { curl_slist* headerList = NULL; /** set query URL */ - curl_easy_setopt(this->curlHandle, CURLOPT_URL, url.c_str()); + curl_easy_setopt(getCurlHandle(), CURLOPT_URL, url.c_str()); /** set callback function */ - curl_easy_setopt(this->curlHandle, CURLOPT_WRITEFUNCTION, - Helpers::write_callback); + curl_easy_setopt(getCurlHandle(), CURLOPT_WRITEFUNCTION, + this->writeCallback); /** set data object to pass to callback function */ - curl_easy_setopt(this->curlHandle, CURLOPT_WRITEDATA, &ret); + curl_easy_setopt(getCurlHandle(), CURLOPT_WRITEDATA, ret); /** set the header callback function */ - curl_easy_setopt(this->curlHandle, CURLOPT_HEADERFUNCTION, + curl_easy_setopt(getCurlHandle(), CURLOPT_HEADERFUNCTION, Helpers::header_callback); /** callback object for headers */ - curl_easy_setopt(this->curlHandle, CURLOPT_HEADERDATA, &ret); + curl_easy_setopt(getCurlHandle(), CURLOPT_HEADERDATA, ret); /** set http headers */ for (HeaderFields::const_iterator it = this->headerFields.begin(); it != this->headerFields.end(); ++it) { @@ -349,54 +402,54 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { headerString += it->second; headerList = curl_slist_append(headerList, headerString.c_str()); } - curl_easy_setopt(this->curlHandle, CURLOPT_HTTPHEADER, + curl_easy_setopt(getCurlHandle(), CURLOPT_HTTPHEADER, headerList); // set basic auth if configured if (this->basicAuth.username.length() > 0) { std::string authString = std::string(this->basicAuth.username + ":" + this->basicAuth.password); - curl_easy_setopt(this->curlHandle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_easy_setopt(this->curlHandle, CURLOPT_USERPWD, authString.c_str()); + curl_easy_setopt(getCurlHandle(), CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + curl_easy_setopt(getCurlHandle(), CURLOPT_USERPWD, authString.c_str()); } /** set error buffer */ - curl_easy_setopt(this->curlHandle, CURLOPT_ERRORBUFFER, + curl_easy_setopt(getCurlHandle(), CURLOPT_ERRORBUFFER, this->curlErrorBuf); /** set user agent */ - curl_easy_setopt(this->curlHandle, CURLOPT_USERAGENT, + curl_easy_setopt(getCurlHandle(), CURLOPT_USERAGENT, this->GetUserAgent().c_str()); // set timeout if (this->timeout) { - curl_easy_setopt(this->curlHandle, CURLOPT_TIMEOUT, this->timeout); + curl_easy_setopt(getCurlHandle(), CURLOPT_TIMEOUT, this->timeout); // dont want to get a sig alarm on timeout - curl_easy_setopt(this->curlHandle, CURLOPT_NOSIGNAL, 1); + curl_easy_setopt(getCurlHandle(), CURLOPT_NOSIGNAL, 1); } // set follow redirect if (this->followRedirects == true) { - curl_easy_setopt(this->curlHandle, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(this->curlHandle, CURLOPT_MAXREDIRS, + curl_easy_setopt(getCurlHandle(), CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(getCurlHandle(), CURLOPT_MAXREDIRS, static_cast(this->maxRedirects)); } if (this->noSignal) { // multi-threaded and prevent entering foreign signal handler (e.g. JNI) - curl_easy_setopt(this->curlHandle, CURLOPT_NOSIGNAL, 1); + curl_easy_setopt(getCurlHandle(), CURLOPT_NOSIGNAL, 1); } // set file progress callback if (this->progressFn) { - curl_easy_setopt(this->curlHandle, CURLOPT_NOPROGRESS, 0); - curl_easy_setopt(this->curlHandle, + curl_easy_setopt(getCurlHandle(), CURLOPT_NOPROGRESS, 0); + curl_easy_setopt(getCurlHandle(), CURLOPT_PROGRESSFUNCTION, this->progressFn); if (this->progressFnData) { - curl_easy_setopt(this->curlHandle, + curl_easy_setopt(getCurlHandle(), CURLOPT_PROGRESSDATA, this->progressFnData); } else { - curl_easy_setopt(this->curlHandle, + curl_easy_setopt(getCurlHandle(), CURLOPT_PROGRESSDATA, this); } @@ -404,83 +457,83 @@ RestClient::Connection::performCurlRequest(const std::string& uri) { // if provided, supply CA path if (!this->caInfoFilePath.empty()) { - curl_easy_setopt(this->curlHandle, CURLOPT_CAINFO, + curl_easy_setopt(getCurlHandle(), CURLOPT_CAINFO, this->caInfoFilePath.c_str()); } // set cert file path if (!this->certPath.empty()) { - curl_easy_setopt(this->curlHandle, CURLOPT_SSLCERT, + curl_easy_setopt(getCurlHandle(), CURLOPT_SSLCERT, this->certPath.c_str()); } // set cert type if (!this->certType.empty()) { - curl_easy_setopt(this->curlHandle, CURLOPT_SSLCERTTYPE, + curl_easy_setopt(getCurlHandle(), CURLOPT_SSLCERTTYPE, this->certType.c_str()); } // set key file path if (!this->keyPath.empty()) { - curl_easy_setopt(this->curlHandle, CURLOPT_SSLKEY, + curl_easy_setopt(getCurlHandle(), CURLOPT_SSLKEY, this->keyPath.c_str()); } // set key password if (!this->keyPassword.empty()) { - curl_easy_setopt(this->curlHandle, CURLOPT_KEYPASSWD, + curl_easy_setopt(getCurlHandle(), CURLOPT_KEYPASSWD, this->keyPassword.c_str()); } // set web proxy address if (!this->uriProxy.empty()) { - curl_easy_setopt(this->curlHandle, CURLOPT_PROXY, + curl_easy_setopt(getCurlHandle(), CURLOPT_PROXY, uriProxy.c_str()); - curl_easy_setopt(this->curlHandle, CURLOPT_HTTPPROXYTUNNEL, + curl_easy_setopt(getCurlHandle(), CURLOPT_HTTPPROXYTUNNEL, 1L); } // set Unix socket path, if requested if (!this->unixSocketPath.empty()) { - curl_easy_setopt(this->curlHandle, CURLOPT_UNIX_SOCKET_PATH, + curl_easy_setopt(getCurlHandle(), CURLOPT_UNIX_SOCKET_PATH, this->unixSocketPath.c_str()); } - res = curl_easy_perform(this->curlHandle); + res = curl_easy_perform(getCurlHandle()); this->lastRequest.curlCode = res; if (res != CURLE_OK) { int retCode = res; if (retCode > 99) { retCode = -1; } - ret.code = retCode; - ret.body = curl_easy_strerror(res); + ret->code = retCode; + ret->body = curl_easy_strerror(res); } else { int64_t http_code = 0; - curl_easy_getinfo(this->curlHandle, CURLINFO_RESPONSE_CODE, &http_code); - ret.code = static_cast(http_code); + curl_easy_getinfo(getCurlHandle(), CURLINFO_RESPONSE_CODE, &http_code); + ret->code = static_cast(http_code); } this->lastRequest.curlError = std::string(this->curlErrorBuf); - curl_easy_getinfo(this->curlHandle, CURLINFO_TOTAL_TIME, + curl_easy_getinfo(getCurlHandle(), CURLINFO_TOTAL_TIME, &this->lastRequest.totalTime); - curl_easy_getinfo(this->curlHandle, CURLINFO_NAMELOOKUP_TIME, + curl_easy_getinfo(getCurlHandle(), CURLINFO_NAMELOOKUP_TIME, &this->lastRequest.nameLookupTime); - curl_easy_getinfo(this->curlHandle, CURLINFO_CONNECT_TIME, + curl_easy_getinfo(getCurlHandle(), CURLINFO_CONNECT_TIME, &this->lastRequest.connectTime); - curl_easy_getinfo(this->curlHandle, CURLINFO_APPCONNECT_TIME, + curl_easy_getinfo(getCurlHandle(), CURLINFO_APPCONNECT_TIME, &this->lastRequest.appConnectTime); - curl_easy_getinfo(this->curlHandle, CURLINFO_PRETRANSFER_TIME, + curl_easy_getinfo(getCurlHandle(), CURLINFO_PRETRANSFER_TIME, &this->lastRequest.preTransferTime); - curl_easy_getinfo(this->curlHandle, CURLINFO_STARTTRANSFER_TIME, + curl_easy_getinfo(getCurlHandle(), CURLINFO_STARTTRANSFER_TIME, &this->lastRequest.startTransferTime); - curl_easy_getinfo(this->curlHandle, CURLINFO_REDIRECT_TIME, + curl_easy_getinfo(getCurlHandle(), CURLINFO_REDIRECT_TIME, &this->lastRequest.redirectTime); - curl_easy_getinfo(this->curlHandle, CURLINFO_REDIRECT_COUNT, + curl_easy_getinfo(getCurlHandle(), CURLINFO_REDIRECT_COUNT, &this->lastRequest.redirectCount); // free header list curl_slist_free_all(headerList); // reset curl handle - curl_easy_reset(this->curlHandle); + curl_easy_reset(getCurlHandle()); return ret; } @@ -495,6 +548,19 @@ RestClient::Response RestClient::Connection::get(const std::string& url) { return this->performCurlRequest(url); } +/** + * @brief HTTP GET method + * + * @param url to query + * @param response struct + * + * @return response struct ref for chaining + */ +RestClient::Response* +RestClient::Connection::get(const std::string& url, + RestClient::Response* response) { + return this->performCurlRequest(url, response); +} /** * @brief HTTP POST method * @@ -507,10 +573,10 @@ RestClient::Response RestClient::Connection::post(const std::string& url, const std::string& data) { /** Now specify we want to POST data */ - curl_easy_setopt(this->curlHandle, CURLOPT_POST, 1L); + curl_easy_setopt(getCurlHandle(), CURLOPT_POST, 1L); /** set post fields */ - curl_easy_setopt(this->curlHandle, CURLOPT_POSTFIELDS, data.c_str()); - curl_easy_setopt(this->curlHandle, CURLOPT_POSTFIELDSIZE, data.size()); + curl_easy_setopt(getCurlHandle(), CURLOPT_POSTFIELDS, data.c_str()); + curl_easy_setopt(getCurlHandle(), CURLOPT_POSTFIELDSIZE, data.size()); return this->performCurlRequest(url); } @@ -531,15 +597,15 @@ RestClient::Connection::put(const std::string& url, up_obj.length = data.size(); /** Now specify we want to PUT data */ - curl_easy_setopt(this->curlHandle, CURLOPT_PUT, 1L); - curl_easy_setopt(this->curlHandle, CURLOPT_UPLOAD, 1L); + curl_easy_setopt(getCurlHandle(), CURLOPT_PUT, 1L); + curl_easy_setopt(getCurlHandle(), CURLOPT_UPLOAD, 1L); /** set read callback function */ - curl_easy_setopt(this->curlHandle, CURLOPT_READFUNCTION, + curl_easy_setopt(getCurlHandle(), CURLOPT_READFUNCTION, RestClient::Helpers::read_callback); /** set data object to pass to callback function */ - curl_easy_setopt(this->curlHandle, CURLOPT_READDATA, &up_obj); + curl_easy_setopt(getCurlHandle(), CURLOPT_READDATA, &up_obj); /** set data size */ - curl_easy_setopt(this->curlHandle, CURLOPT_INFILESIZE, + curl_easy_setopt(getCurlHandle(), CURLOPT_INFILESIZE, static_cast(up_obj.length)); return this->performCurlRequest(url); @@ -564,15 +630,15 @@ RestClient::Connection::patch(const std::string& url, const char* http_patch = "PATCH"; /** set HTTP PATCH METHOD */ - curl_easy_setopt(this->curlHandle, CURLOPT_CUSTOMREQUEST, http_patch); - curl_easy_setopt(this->curlHandle, CURLOPT_UPLOAD, 1L); + curl_easy_setopt(getCurlHandle(), CURLOPT_CUSTOMREQUEST, http_patch); + curl_easy_setopt(getCurlHandle(), CURLOPT_UPLOAD, 1L); /** set read callback function */ - curl_easy_setopt(this->curlHandle, CURLOPT_READFUNCTION, + curl_easy_setopt(getCurlHandle(), CURLOPT_READFUNCTION, RestClient::Helpers::read_callback); /** set data object to pass to callback function */ - curl_easy_setopt(this->curlHandle, CURLOPT_READDATA, &up_obj); + curl_easy_setopt(getCurlHandle(), CURLOPT_READDATA, &up_obj); /** set data size */ - curl_easy_setopt(this->curlHandle, CURLOPT_INFILESIZE, + curl_easy_setopt(getCurlHandle(), CURLOPT_INFILESIZE, static_cast(up_obj.length)); return this->performCurlRequest(url); @@ -590,7 +656,7 @@ RestClient::Connection::del(const std::string& url) { const char* http_delete = "DELETE"; /** set HTTP DELETE METHOD */ - curl_easy_setopt(this->curlHandle, CURLOPT_CUSTOMREQUEST, http_delete); + curl_easy_setopt(getCurlHandle(), CURLOPT_CUSTOMREQUEST, http_delete); return this->performCurlRequest(url); } @@ -608,8 +674,8 @@ RestClient::Connection::head(const std::string& url) { const char* http_head = "HEAD"; /** set HTTP HEAD METHOD */ - curl_easy_setopt(this->curlHandle, CURLOPT_CUSTOMREQUEST, http_head); - curl_easy_setopt(this->curlHandle, CURLOPT_NOBODY, 1L); + curl_easy_setopt(getCurlHandle(), CURLOPT_CUSTOMREQUEST, http_head); + curl_easy_setopt(getCurlHandle(), CURLOPT_NOBODY, 1L); return this->performCurlRequest(url); } @@ -627,8 +693,8 @@ RestClient::Connection::options(const std::string& url) { const char* http_options = "OPTIONS"; /** set HTTP HEAD METHOD */ - curl_easy_setopt(this->curlHandle, CURLOPT_CUSTOMREQUEST, http_options); - curl_easy_setopt(this->curlHandle, CURLOPT_NOBODY, 1L); + curl_easy_setopt(getCurlHandle(), CURLOPT_CUSTOMREQUEST, http_options); + curl_easy_setopt(getCurlHandle(), CURLOPT_NOBODY, 1L); return this->performCurlRequest(url); } diff --git a/test/squid.conf b/test/squid.conf new file mode 100644 index 00000000..fd8a25cb --- /dev/null +++ b/test/squid.conf @@ -0,0 +1,9 @@ +acl CONNECT method CONNECT +http_access allow localhost manager +http_access deny manager +acl all src 0.0.0.0/0 +http_access allow all +http_access deny all +http_port 3128 +coredump_dir /var/spool/squid +url_rewrite_children 1 startup=1 idle=1 concurrency=0 diff --git a/test/test_connection.cc b/test/test_connection.cc index c31b16de..d41bed7b 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -4,6 +4,8 @@ #include #include +#include "tests.h" + class ConnectionTest : public ::testing::Test { protected: @@ -13,6 +15,7 @@ class ConnectionTest : public ::testing::Test ConnectionTest() { conn = NULL; + testUrl = RestClient::TestUrl; } virtual ~ConnectionTest() @@ -21,7 +24,8 @@ class ConnectionTest : public ::testing::Test virtual void SetUp() { - conn = new RestClient::Connection("https://httpbin.org"); + // Port below should match what is set in Makefile.in + conn = new RestClient::Connection(testUrl); conn->SetTimeout(10); } @@ -30,17 +34,28 @@ class ConnectionTest : public ::testing::Test delete conn; } + std::string testUrl; +}; + +class ConnectionTestRemote : public ConnectionTest +{ +protected: + ConnectionTestRemote() + { + // Port below should match what is set in Makefile.in + testUrl = "https://httpbin.org"; + } }; TEST_F(ConnectionTest, TestTimeout) { std::string uri = "/delay/5"; - conn->SetTimeout(2); + conn->SetTimeout(4); RestClient::Response res = conn->get(uri); EXPECT_EQ(28, res.code); } -TEST_F(ConnectionTest, TestFailForInvalidCA) +TEST_F(ConnectionTestRemote, TestFailForInvalidCA) { // set a non-existing file for the CA file and it should fail to verify the peer conn->SetCAInfoFilePath("non-existent file"); @@ -57,7 +72,7 @@ TEST_F(ConnectionTest, TestDefaultUserAgent) std::istringstream str(res.body); str >> root; - EXPECT_EQ("https://httpbin.org/get", root.get("url", "no url set").asString()); + EXPECT_EQ(testUrl + "/get", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "nope/nope").asString()); } @@ -70,7 +85,7 @@ TEST_F(ConnectionTest, TestCustomUserAgent) std::istringstream str(res.body); str >> root; - EXPECT_EQ("https://httpbin.org/get", root.get("url", "no url set").asString()); + EXPECT_EQ(testUrl + "/get", root.get("url", "no url set").asString()); EXPECT_EQ("foobar/1.2.3 restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "nope/nope").asString()); } @@ -93,7 +108,7 @@ TEST_F(ConnectionTest, TestBasicAuth) } -TEST_F(ConnectionTest, TestSSLCert) +TEST_F(ConnectionTestRemote, TestSSLCert) { conn->SetCertPath("non-existent file"); conn->SetKeyPath("non-existent key path"); @@ -164,7 +179,7 @@ TEST_F(ConnectionTest, TestGetHeaders) } -TEST_F(ConnectionTest, TestGetInfo) +TEST_F(ConnectionTestRemote, TestGetInfo) { RestClient::HeaderFields headers; headers["Foo"] = "bar"; @@ -181,7 +196,7 @@ TEST_F(ConnectionTest, TestGetInfo) EXPECT_EQ("bar", info.basicAuth.password); EXPECT_EQ("foobar/1.2.3", info.customUserAgent); EXPECT_EQ(2, info.timeout); - EXPECT_EQ("https://httpbin.org", info.baseUrl); + EXPECT_EQ(testUrl, info.baseUrl); EXPECT_NE(0, info.lastRequest.totalTime); EXPECT_NE(0, info.lastRequest.connectTime); EXPECT_NE(0, info.lastRequest.nameLookupTime); @@ -269,24 +284,24 @@ TEST_F(ConnectionTest, TestSetProgress) EXPECT_EQ(totalDownloaded, totalToDownload); } -TEST_F(ConnectionTest, TestProxy) +TEST_F(ConnectionTestRemote, TestProxy) { - conn->SetProxy("127.0.0.1:3128"); + conn->SetProxy(RestClient::TestProxyUrl); RestClient::Response res = conn->get("/get"); EXPECT_EQ(200, res.code); } -TEST_F(ConnectionTest, TestUnSetProxy) +TEST_F(ConnectionTestRemote, TestUnSetProxy) { - conn->SetProxy("127.0.0.1:3128"); + conn->SetProxy(RestClient::TestProxyUrl); conn->SetProxy(""); RestClient::Response res = conn->get("/get"); EXPECT_EQ(200, res.code); } -TEST_F(ConnectionTest, TestProxyAddressPrefixed) +TEST_F(ConnectionTestRemote, TestProxyAddressPrefixed) { - conn->SetProxy("http://127.0.0.1:3128"); + conn->SetProxy(RestClient::TestProxyUrl); RestClient::Response res = conn->get("/get"); EXPECT_EQ(200, res.code); } @@ -296,6 +311,71 @@ TEST_F(ConnectionTest, TestInvalidProxy) conn->SetProxy("127.0.0.1:666"); RestClient::Response res = conn->get("/get"); EXPECT_EQ("Couldn't connect to server", res.body); - // 7 = CURLE_COULDNT_CONNECT - EXPECT_EQ(7, res.code); + EXPECT_EQ(CURLE_COULDNT_CONNECT, res.code); +} + +TEST_F(ConnectionTest, TestTerminate) +{ + conn->Terminate(); + EXPECT_THROW({ + try + { + RestClient::Response res = conn->get("/get"); + } + catch(const std::runtime_error& e) + { + EXPECT_STREQ("Connection terminated", e.what()); + throw; + } + }, std::runtime_error); +} + +TEST_F(ConnectionTest, TestSetWriteFunction) +{ + static std::string lineReceived; + static size_t lines = 0; + static size_t ret = 0; + + auto writeCallback = [](void *data, size_t size, size_t nmemb, void *userdata) -> size_t + { + size_t bytes = size * nmemb; + try + { + // Add to the buffer + auto res = reinterpret_cast(userdata); + res->body.append(static_cast(data), bytes); + // If the last character is not a new line, wait for the rest. + if ('\n' != *(res->body.end() - 1)) + { + return bytes; + } + // Process data one line at a time. + std::stringstream stream(res->body); + std::string line; + while (std::getline(stream, line)) + { + // Do something with the line here... + lineReceived += line; + lines++; + } + // Done processing the line + res->body.clear(); + } + catch(std::exception e) + { + // Log caught exception here + return 0; + } + ret = bytes; + return bytes; + }; + + conn->SetWriteFunction(writeCallback); + + RestClient::Response res = {}; + auto ret_res = conn->get("/get", &res); + + EXPECT_EQ(ret_res, &res); + EXPECT_EQ(200, res.code); + EXPECT_EQ(ret, lineReceived.size() + lines); } diff --git a/test/test_restclient.cc b/test/test_restclient.cc index e6230c48..cf64b6b2 100644 --- a/test/test_restclient.cc +++ b/test/test_restclient.cc @@ -3,6 +3,8 @@ #include #include +#include "tests.h" + class RestClientTest : public ::testing::Test { protected: @@ -24,32 +26,31 @@ class RestClientTest : public ::testing::Test { RestClient::disable(); } - }; // DELETE Tests // check return code TEST_F(RestClientTest, TestRestClientDELETECode) { - RestClient::Response res = RestClient::del("http://httpbin.org/delete"); + RestClient::Response res = RestClient::del(RestClient::TestUrl+"/delete"); EXPECT_EQ(200, res.code); } TEST_F(RestClientTest, TestRestClientDELETEBody) { - RestClient::Response res = RestClient::del("https://httpbin.org/delete"); + RestClient::Response res = RestClient::del(RestClient::TestUrl+"/delete"); Json::Value root; std::istringstream str(res.body); str >> root; - EXPECT_EQ("https://httpbin.org/delete", root.get("url", "no url set").asString()); + EXPECT_EQ(RestClient::TestUrl+"/delete", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } // check for failure TEST_F(RestClientTest, TestRestClientDELETEFailureCode) { - std::string u = "http://nonexistent"; + std::string u = RestClient::TestNonExistantUrl; RestClient::Response res = RestClient::del(u); // 6 = CURLE_COULDNT_RESOLVE_HOST EXPECT_EQ(6, res.code); @@ -57,14 +58,14 @@ TEST_F(RestClientTest, TestRestClientDELETEFailureCode) TEST_F(RestClientTest, TestRestClientDELETEHeaders) { - RestClient::Response res = RestClient::del("https://httpbin.org/delete"); + RestClient::Response res = RestClient::del(RestClient::TestUrl+"/delete"); EXPECT_EQ("keep-alive", res.headers["Connection"]); } // GET Tests TEST_F(RestClientTest, TestRestClientGETCode) { - RestClient::Response res = RestClient::get("https://httpbin.org/get"); + RestClient::Response res = RestClient::get(RestClient::TestUrl+"/get"); EXPECT_EQ(200, res.code); } @@ -76,19 +77,19 @@ TEST_F(RestClientTest, TestRestClientGETHTTP2Code) TEST_F(RestClientTest, TestRestClientGETBodyCode) { - RestClient::Response res = RestClient::get("https://httpbin.org/get"); + RestClient::Response res = RestClient::get(RestClient::TestUrl+"/get"); Json::Value root; std::istringstream str(res.body); str >> root; - EXPECT_EQ("https://httpbin.org/get", root.get("url", "no url set").asString()); + EXPECT_EQ(RestClient::TestUrl+"/get", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } // check for failure TEST_F(RestClientTest, TestRestClientGETFailureCode) { - std::string u = "http://nonexistent"; + std::string u = RestClient::TestNonExistantUrl; RestClient::Response res = RestClient::get(u); EXPECT_EQ("Couldn't resolve host name", res.body); // 6 = CURLE_COULDNT_RESOLVE_HOST @@ -97,7 +98,7 @@ TEST_F(RestClientTest, TestRestClientGETFailureCode) TEST_F(RestClientTest, TestRestClientGETHeaders) { - RestClient::Response res = RestClient::get("https://httpbin.org/get"); + RestClient::Response res = RestClient::get(RestClient::TestUrl+"/get"); EXPECT_EQ("keep-alive", res.headers["Connection"]); } @@ -105,25 +106,25 @@ TEST_F(RestClientTest, TestRestClientGETHeaders) // check return code TEST_F(RestClientTest, TestRestClientPOSTCode) { - RestClient::Response res = RestClient::post("https://httpbin.org/post", "text/text", "data"); + RestClient::Response res = RestClient::post(RestClient::TestUrl+"/post", "text/text", "data"); EXPECT_EQ(200, res.code); } TEST_F(RestClientTest, TestRestClientPOSTBody) { - RestClient::Response res = RestClient::post("https://httpbin.org/post", "text/text", "data"); + RestClient::Response res = RestClient::post(RestClient::TestUrl+"/post", "text/text", "data"); Json::Value root; std::istringstream str(res.body); str >> root; - EXPECT_EQ("https://httpbin.org/post", root.get("url", "no url set").asString()); + EXPECT_EQ(RestClient::TestUrl+"/post", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } // check for failure TEST_F(RestClientTest, TestRestClientPOSTFailureCode) { - std::string u = "http://nonexistent"; + std::string u = RestClient::TestNonExistantUrl; RestClient::Response res = RestClient::post(u, "text/text", "data"); // 6 = CURLE_COULDNT_RESOLVE_HOST EXPECT_EQ(6, res.code); @@ -131,7 +132,7 @@ TEST_F(RestClientTest, TestRestClientPOSTFailureCode) TEST_F(RestClientTest, TestRestClientPOSTHeaders) { - RestClient::Response res = RestClient::post("https://httpbin.org/post", "text/text", "data"); + RestClient::Response res = RestClient::post(RestClient::TestUrl+"/post", "text/text", "data"); EXPECT_EQ("keep-alive", res.headers["Connection"]); } @@ -139,25 +140,25 @@ TEST_F(RestClientTest, TestRestClientPOSTHeaders) // check return code TEST_F(RestClientTest, TestRestClientPUTCode) { - RestClient::Response res = RestClient::put("https://httpbin.org/put", "text/text", "data"); + RestClient::Response res = RestClient::put(RestClient::TestUrl+"/put", "text/text", "data"); EXPECT_EQ(200, res.code); } TEST_F(RestClientTest, TestRestClientPUTBody) { - RestClient::Response res = RestClient::put("https://httpbin.org/put", "text/text", "data"); + RestClient::Response res = RestClient::put(RestClient::TestUrl+"/put", "text/text", "data"); Json::Value root; std::istringstream str(res.body); str >> root; - EXPECT_EQ("https://httpbin.org/put", root.get("url", "no url set").asString()); + EXPECT_EQ(RestClient::TestUrl+"/put", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } // check for failure TEST_F(RestClientTest, TestRestClientPUTFailureCode) { - std::string u = "http://nonexistent"; + std::string u = RestClient::TestNonExistantUrl; RestClient::Response res = RestClient::put(u, "text/text", "data"); // 6 = CURLE_COULDNT_RESOLVE_HOST EXPECT_EQ(6, res.code); @@ -165,7 +166,7 @@ TEST_F(RestClientTest, TestRestClientPUTFailureCode) TEST_F(RestClientTest, TestRestClientPUTHeaders) { - RestClient::Response res = RestClient::put("https://httpbin.org/put", "text/text", "data"); + RestClient::Response res = RestClient::put(RestClient::TestUrl+"/put", "text/text", "data"); EXPECT_EQ("keep-alive", res.headers["Connection"]); } @@ -173,25 +174,25 @@ TEST_F(RestClientTest, TestRestClientPUTHeaders) // check return code TEST_F(RestClientTest, TestRestClientPATCHCode) { - RestClient::Response res = RestClient::patch("https://httpbin.org/patch", "text/text", "data"); + RestClient::Response res = RestClient::patch(RestClient::TestUrl+"/patch", "text/text", "data"); EXPECT_EQ(200, res.code); } TEST_F(RestClientTest, TestRestClientPATCHBody) { - RestClient::Response res = RestClient::patch("https://httpbin.org/patch", "text/text", "data"); + RestClient::Response res = RestClient::patch(RestClient::TestUrl+"/patch", "text/text", "data"); Json::Value root; std::istringstream str(res.body); str >> root; - EXPECT_EQ("https://httpbin.org/patch", root.get("url", "no url set").asString()); + EXPECT_EQ(RestClient::TestUrl+"/patch", root.get("url", "no url set").asString()); EXPECT_EQ("restclient-cpp/" RESTCLIENT_VERSION, root["headers"].get("User-Agent", "no url set").asString()); } // check for failure TEST_F(RestClientTest, TestRestClientPATCHFailureCode) { - std::string u = "http://nonexistent"; + std::string u = RestClient::TestNonExistantUrl; RestClient::Response res = RestClient::patch(u, "text/text", "data"); // 6 = CURLE_COULDNT_RESOLVE_HOST EXPECT_EQ(6, res.code); @@ -199,23 +200,23 @@ TEST_F(RestClientTest, TestRestClientPATCHFailureCode) TEST_F(RestClientTest, TestRestClientPATCHHeaders) { - RestClient::Response res = RestClient::patch("https://httpbin.org/put", "text/text", "data"); + RestClient::Response res = RestClient::patch(RestClient::TestUrl+"/put", "text/text", "data"); EXPECT_EQ("keep-alive", res.headers["Connection"]); } // OPTIONS Tests // check return code // Disabled as httpbin does not support options requests for now -TEST_F(RestClientTest, DISABLED_TestRestClientOPTIONSCode) +TEST_F(RestClientTest, TestRestClientOPTIONSCode) { - RestClient::Response res = RestClient::options("https://httpbin.org/options"); + RestClient::Response res = RestClient::options("https://api.reqbin.com/api/v1/requests"); EXPECT_EQ(200, res.code); } // check for failure TEST_F(RestClientTest, TestRestClientOPTIONSFailureCode) { - std::string u = "http://nonexistent"; + std::string u = RestClient::TestNonExistantUrl; RestClient::Response res = RestClient::options(u); // 6 = CURLE_COULDNT_RESOLVE_HOST EXPECT_EQ(6, res.code); @@ -223,13 +224,14 @@ TEST_F(RestClientTest, TestRestClientOPTIONSFailureCode) TEST_F(RestClientTest, TestRestClientOPTIONSHeaders) { - RestClient::Response res = RestClient::options("https://httpbin.org/options"); + RestClient::Response res = RestClient::options( + RestClient::TestUrl+"/options"); EXPECT_EQ("keep-alive", res.headers["Connection"]); } TEST_F(RestClientTest, TestRestClientAuth) { - RestClient::Response res = RestClient::get("https://foo:bar@httpbin.org/basic-auth/foo/bar"); + RestClient::Response res = RestClient::get("http://foo:bar@" + RestClient::TestServer + "/basic-auth/foo/bar"); EXPECT_EQ(200, res.code); Json::Value root; @@ -239,13 +241,13 @@ TEST_F(RestClientTest, TestRestClientAuth) EXPECT_EQ("foo", root.get("user", "no user").asString()); EXPECT_EQ(true, root.get("authenticated", false).asBool()); - res = RestClient::get("https://httpbin.org/basic-auth/foo/bar"); + res = RestClient::get("http://" + RestClient::TestServer + "/basic-auth/foo/bar"); EXPECT_EQ(401, res.code); } TEST_F(RestClientTest, TestRestClientHeadCode) { - RestClient::Response res = RestClient::head("https://httpbin.org/get"); + RestClient::Response res = RestClient::head(RestClient::TestUrl+"/get"); EXPECT_EQ(200, res.code); EXPECT_EQ("", res.body); } diff --git a/test/tests.cpp b/test/tests.cpp index 6d57ba27..e94ecccb 100644 --- a/test/tests.cpp +++ b/test/tests.cpp @@ -1,8 +1,26 @@ #include #include +#include "tests.h" + +// Define shared constants +namespace RestClient +{ + std::string TestNonExistantUrl; + std::string TestServer; + std::string TestUrl; + std::string TestProxyUrl; +}; + int main(int argc, char **argv) { + // Initialize shared constants + // Ports below should match what is set in Makefile.in + RestClient::TestNonExistantUrl = "http://nonexistent"; + RestClient::TestServer = "127.0.0.1:8998"; + RestClient::TestUrl = "http://" + RestClient::TestServer; + RestClient::TestProxyUrl = "http://127.0.0.1:3128"; + ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } diff --git a/test/tests.h b/test/tests.h new file mode 100644 index 00000000..484cdf61 --- /dev/null +++ b/test/tests.h @@ -0,0 +1,14 @@ +#ifndef TEST_TESTS_H_ +#define TEST_TESTS_H_ + +#include + +namespace RestClient +{ + extern std::string TestNonExistantUrl; + extern std::string TestServer; + extern std::string TestUrl; + extern std::string TestProxyUrl; +}; + +#endif // TEST_TESTS_H_ From 8b0b156a73721ceb44b7454ee887e0cfd3ed4756 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 26 Feb 2020 21:32:47 +0100 Subject: [PATCH 190/212] update dist to bionic and also build packages everytime --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d120a963..66579190 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: cpp -dist: xenial +dist: bionic sudo: required group: beta @@ -12,6 +12,7 @@ compiler: script: - ./autogen.sh && ./configure --enable-coverage - make ci + - make packages install: - gem install fpm From 2cc87763098edbcfe07fafebdc8351411e159da5 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Wed, 26 Feb 2020 21:33:27 +0100 Subject: [PATCH 191/212] remove old distros from package builds --- Makefile.packaging.mk | 3 --- 1 file changed, 3 deletions(-) diff --git a/Makefile.packaging.mk b/Makefile.packaging.mk index ffa5ec88..c92ca573 100644 --- a/Makefile.packaging.mk +++ b/Makefile.packaging.mk @@ -25,10 +25,7 @@ packages: local-install rpm deb deploy-packages: packages package_cloud push mrtazz/$(NAME)/el/7 *.rpm - package_cloud push mrtazz/$(NAME)/debian/wheezy *.deb - package_cloud push mrtazz/$(NAME)/debian/jessie *.deb package_cloud push mrtazz/$(NAME)/debian/stretch *.deb package_cloud push mrtazz/$(NAME)/debian/buster *.deb - package_cloud push mrtazz/$(NAME)/ubuntu/trusty *.deb package_cloud push mrtazz/$(NAME)/ubuntu/xenial *.deb package_cloud push mrtazz/$(NAME)/ubuntu/bionic *.deb From e55542a6ecb4500f8dbee7cdf11df6c4670811a5 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 3 Mar 2020 14:25:42 +0100 Subject: [PATCH 192/212] add DESTDIR to local install in packaging Makefile --- Makefile.packaging.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.packaging.mk b/Makefile.packaging.mk index c92ca573..d7ac6f26 100644 --- a/Makefile.packaging.mk +++ b/Makefile.packaging.mk @@ -2,7 +2,7 @@ .PHONY: rpm deb packages deploy-packages local-install: - $(MAKE) install PREFIX=usr + $(MAKE) install PREFIX=usr DESTDIR="$(CURDIR)" NAME=restclient-cpp VERSION = $(shell git describe --tags --always --dirty) From 34aa0d72e7fe323aaaff0951f1c4a2e1792ff390 Mon Sep 17 00:00:00 2001 From: ejacques Date: Mon, 22 Feb 2021 20:32:02 -0800 Subject: [PATCH 193/212] Allow SSL peer verification to be disabled. --- include/restclient-cpp/connection.h | 4 ++++ source/connection.cc | 18 +++++++++++++++++ test/test_connection.cc | 31 +++++++++++++++++++---------- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index c39c022a..5f82c7c6 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -193,6 +193,9 @@ class Connection { // set CURLOPT_SSLKEY. Default format is PEM void SetKeyPath(const std::string& keyPath); + // set CURLOPT_SSL_VERIFYPEER. Default is true. + void SetVerifyPeer(bool verifyPeer); + // set CURLOPT_KEYPASSWD. void SetKeyPassword(const std::string& keyPassword); @@ -258,6 +261,7 @@ class Connection { std::string certType; std::string keyPath; std::string keyPassword; + bool verifyPeer; std::string uriProxy; std::string unixSocketPath; char curlErrorBuf[CURL_ERROR_SIZE]; diff --git a/source/connection.cc b/source/connection.cc index 54118633..e0dcbb7a 100644 --- a/source/connection.cc +++ b/source/connection.cc @@ -39,6 +39,7 @@ RestClient::Connection::Connection(const std::string& baseUrl) this->progressFn = NULL; this->progressFnData = NULL; this->writeCallback = RestClient::Helpers::write_callback; + this->verifyPeer = true; } /** @@ -290,6 +291,17 @@ RestClient::Connection::SetKeyPassword(const std::string& keyPassword) { this->keyPassword = keyPassword; } +/** + * @brief set SSL peer verification flag + * + * @param boolean (default is true) + * + */ +void +RestClient::Connection::SetVerifyPeer(bool verifyPeer) { + this->verifyPeer = verifyPeer; +} + /** * @brief set HTTP proxy address and port * @@ -483,6 +495,12 @@ RestClient::Connection::performCurlRequest(const std::string& uri, this->keyPassword.c_str()); } + // set peer verification + if (!this->verifyPeer) { + curl_easy_setopt(getCurlHandle(), CURLOPT_SSL_VERIFYPEER, + this->verifyPeer); + } + // set web proxy address if (!this->uriProxy.empty()) { curl_easy_setopt(getCurlHandle(), CURLOPT_PROXY, diff --git a/test/test_connection.cc b/test/test_connection.cc index d41bed7b..6f62ab53 100644 --- a/test/test_connection.cc +++ b/test/test_connection.cc @@ -65,6 +65,16 @@ TEST_F(ConnectionTestRemote, TestFailForInvalidCA) EXPECT_EQ(77, res.code); } +TEST_F(ConnectionTestRemote, TestAllowInsecure) +{ + // set a non-existing file for the CA file, should allow access anyway + conn->SetCAInfoFilePath("non-existent file"); + conn->SetVerifyPeer(false); + RestClient::Response res = conn->get("/get"); + + EXPECT_EQ(200, res.code); +} + TEST_F(ConnectionTest, TestDefaultUserAgent) { RestClient::Response res = conn->get("/get"); @@ -108,16 +118,17 @@ TEST_F(ConnectionTest, TestBasicAuth) } -TEST_F(ConnectionTestRemote, TestSSLCert) -{ - conn->SetCertPath("non-existent file"); - conn->SetKeyPath("non-existent key path"); - conn->SetKeyPassword("imaginary_password"); - conn->SetCertType("invalid cert type"); - RestClient::Response res = conn->get("/get"); - - EXPECT_EQ(58, res.code); -} +// test below can succeed. should run https server locally to control expected behavior. +// TEST_F(ConnectionTestRemote, TestSSLCert) +// { +// conn->SetCertPath("non-existent file"); +// conn->SetKeyPath("non-existent key path"); +// conn->SetKeyPassword("imaginary_password"); +// conn->SetCertType("invalid cert type"); +// RestClient::Response res = conn->get("/get"); +// +// EXPECT_EQ(58, res.code); +// } TEST_F(ConnectionTest, TestCurlError) { From a5b33ac76e81681864ab74e2c62e4e66734db647 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Kn=C3=B6rig?= Date: Tue, 9 Nov 2021 20:21:37 +0100 Subject: [PATCH 194/212] [docs] use correct json mime type If it's not `application/json`, some servers will not parse it properly into json (as in my case, the nodejs express.json() middleware) --- docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 842c7633..7e91ccbf 100644 --- a/docs/index.md +++ b/docs/index.md @@ -86,9 +86,9 @@ RestClient::Response r = conn->head("/get") RestClient::Response r = conn->del("/delete") // set different content header for POST and PUT -conn->AppendHeader("Content-Type", "text/json") +conn->AppendHeader("Content-Type", "application/json") RestClient::Response r = conn->post("/post", "{\"foo\": \"bla\"}") -RestClient::Response r = conn->put("/put", "text/json", "{\"foo\": \"bla\"}") +RestClient::Response r = conn->put("/put", "application/json", "{\"foo\": \"bla\"}") // deinit RestClient. After calling this you have to call RestClient::init() // again before you can use it From b12b24f25d1cea2ea67a0fefc094662ed59071ad Mon Sep 17 00:00:00 2001 From: Cypherpunk Samurai <66906402+CypherpunkSamurai@users.noreply.github.com> Date: Tue, 11 Oct 2022 02:25:26 +0530 Subject: [PATCH 195/212] Added Mingw Instructions Added Instructions to help build with Mingw64. --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index 3ec3cfc9..a60a5709 100644 --- a/README.md +++ b/README.md @@ -328,6 +328,20 @@ cd vcpkg The restclient-cpp port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. +Another option is to use Mingw64 and CMake to compile on Windows. This requires you to have [Mingw64](https://www.mingw-w64.org/) installed with [CMake](https://cmake.org/download/) and [libCurl](https://curl.se/windows/) (MSYS2 would also work fine). + +```bash +# Make sure cmake, mingw32-make and g++ are in PATH +# Clone the repo +git clone https://github.com/mrtazz/restclient-cpp && cd restclient-cpp +# Build library +mkdir build && cd build +# Run cmake +cmake -DCMAKE_CXX_COMPILER=g++ -DCMAKE_CC_COMPILER=gcc -DCMAKE_MAKE_PROGRAM=mingw32-make -G "MinGW Makefiles" .. +# Builds the dll.a lib and dll file +mingw32-make +``` + ## Contribute All contributions are highly appreciated. This includes filing issues, updating documentation and writing code. Please take a look at the From d7c68f53aac84c1b83c138d5b6dda61d747a281f Mon Sep 17 00:00:00 2001 From: Chris Kruger Date: Sun, 12 Mar 2023 08:02:05 +0800 Subject: [PATCH 196/212] init Connection::curlErrorBuf[] at compile --- include/restclient-cpp/connection.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index 5f82c7c6..f4ae0a35 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -264,7 +264,7 @@ class Connection { bool verifyPeer; std::string uriProxy; std::string unixSocketPath; - char curlErrorBuf[CURL_ERROR_SIZE]; + char curlErrorBuf[CURL_ERROR_SIZE] = {0}; RestClient::WriteCallback writeCallback; RestClient::Response* performCurlRequest(const std::string& uri, RestClient::Response* resp); From 154df8f3b21b8b5312866987e1ce4f60b983a70b Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Fri, 16 Jun 2023 10:02:55 -0500 Subject: [PATCH 197/212] Fix missing cstdint include The previous code did not compile under GCC-13 because libstdcpp headers have changed such that cstdint is not included implicitly. Add cstdint include when `uint64_t` types are used. Signed-off-by: Patrick Williams --- include/restclient-cpp/connection.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/restclient-cpp/connection.h b/include/restclient-cpp/connection.h index 5f82c7c6..12984fe7 100644 --- a/include/restclient-cpp/connection.h +++ b/include/restclient-cpp/connection.h @@ -13,6 +13,7 @@ #include #include #include +#include #include "restclient-cpp/restclient.h" #include "restclient-cpp/version.h" From a1e49cc4c333dbb49a78f2f0312f19b312084414 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 9 Jan 2024 13:32:15 +0100 Subject: [PATCH 198/212] add unit test actions workflow --- .github/workflows/tests.yaml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/tests.yaml diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml new file mode 100644 index 00000000..7080742f --- /dev/null +++ b/.github/workflows/tests.yaml @@ -0,0 +1,23 @@ +name: test + +on: + workflow_dispatch: + pull_request: + types: [opened, synchronize] + + +jobs: + unit: + name: unit + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: build + run: | + ./autogen.sh + ./configure --enable-coverage + + - name: run tests + run: make ci From cdac0814d9087a5aa3cdcd85e9f650a1ae5ab1d6 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 9 Jan 2024 13:34:19 +0100 Subject: [PATCH 199/212] install cpplint --- .github/workflows/tests.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 7080742f..e4eafa25 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -14,6 +14,10 @@ jobs: steps: - uses: actions/checkout@v3 + - name: install dependencies + run: | + pip install cpplint + - name: build run: | ./autogen.sh From c0bd89527651ad9f634cc7f38c13ad38c07df6c8 Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 9 Jan 2024 13:36:44 +0100 Subject: [PATCH 200/212] install valgrind and curl dependencies --- .github/workflows/tests.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index e4eafa25..3af3203f 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -17,6 +17,8 @@ jobs: - name: install dependencies run: | pip install cpplint + apt-get install -qq valgrind + apt-get install -qq libcurl4-openssl-dev - name: build run: | From 13b0f5dcbdcabcf207d7b7d2176ccfb5213e852f Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 9 Jan 2024 13:38:26 +0100 Subject: [PATCH 201/212] need sudo for apt-get --- .github/workflows/tests.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 3af3203f..d016e508 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -17,8 +17,7 @@ jobs: - name: install dependencies run: | pip install cpplint - apt-get install -qq valgrind - apt-get install -qq libcurl4-openssl-dev + sudo apt-get install -qq valgrind libcurl4-openssl-dev - name: build run: | From a45c21356c8ad6bdc01cc2f07e990ec02be61efb Mon Sep 17 00:00:00 2001 From: Daniel Schauenberg Date: Tue, 9 Jan 2024 13:22:25 +0000 Subject: [PATCH 202/212] upgrade googletest to 1.14.0 and build on CXX14 --- Makefile.am | 10 +- utils/build_gtest.sh | 6 +- vendor/googletest-1.14.0/.clang-format | 4 + .../.github/ISSUE_TEMPLATE/00-bug_report.yml | 53 + .../ISSUE_TEMPLATE/10-feature_request.yml | 33 + .../.github/ISSUE_TEMPLATE/config.yml | 5 + .../.github/workflows/gtest-ci.yml | 43 + vendor/googletest-1.14.0/.gitignore | 88 + vendor/googletest-1.14.0/BUILD.bazel | 219 + vendor/googletest-1.14.0/CMakeLists.txt | 27 + vendor/googletest-1.14.0/CONTRIBUTING.md | 141 + .../CONTRIBUTORS | 28 + .../LICENSE | 0 vendor/googletest-1.14.0/README.md | 146 + vendor/googletest-1.14.0/WORKSPACE | 27 + .../googletest-1.14.0/ci/linux-presubmit.sh | 137 + .../googletest-1.14.0/ci/macos-presubmit.sh | 76 + .../ci/windows-presubmit.bat | 58 + vendor/googletest-1.14.0/docs/_config.yml | 1 + .../docs/_data/navigation.yml | 43 + .../docs/_layouts/default.html | 58 + vendor/googletest-1.14.0/docs/_sass/main.scss | 200 + vendor/googletest-1.14.0/docs/advanced.md | 2436 ++ .../docs/assets/css/style.scss | 5 + .../docs/community_created_documentation.md | 7 + vendor/googletest-1.14.0/docs/faq.md | 692 + .../docs/gmock_cheat_sheet.md | 241 + .../googletest-1.14.0/docs/gmock_cook_book.md | 4344 ++++ vendor/googletest-1.14.0/docs/gmock_faq.md | 390 + .../docs/gmock_for_dummies.md | 700 + vendor/googletest-1.14.0/docs/index.md | 22 + vendor/googletest-1.14.0/docs/pkgconfig.md | 144 + vendor/googletest-1.14.0/docs/platforms.md | 8 + vendor/googletest-1.14.0/docs/primer.md | 483 + .../docs/quickstart-bazel.md | 153 + .../docs/quickstart-cmake.md | 157 + .../docs/reference/actions.md | 115 + .../docs/reference/assertions.md | 633 + .../docs/reference/matchers.md | 302 + .../docs/reference/mocking.md | 589 + .../docs/reference/testing.md | 1432 ++ vendor/googletest-1.14.0/docs/samples.md | 22 + .../googlemock/CMakeLists.txt | 209 + vendor/googletest-1.14.0/googlemock/README.md | 40 + .../googlemock/cmake/gmock.pc.in | 10 + .../googlemock/cmake/gmock_main.pc.in | 10 + .../googlemock/docs/README.md | 4 + .../googlemock/include/gmock/gmock-actions.h | 2297 ++ .../include/gmock/gmock-cardinalities.h | 159 + .../include/gmock/gmock-function-mocker.h | 518 + .../googlemock/include/gmock/gmock-matchers.h | 5623 +++++ .../include/gmock/gmock-more-actions.h | 658 + .../include/gmock/gmock-more-matchers.h | 120 + .../include/gmock/gmock-nice-strict.h | 277 + .../include/gmock/gmock-spec-builders.h | 2148 ++ .../googlemock/include/gmock/gmock.h | 96 + .../include/gmock/internal/custom/README.md | 18 + .../internal/custom/gmock-generated-actions.h | 7 + .../gmock/internal/custom/gmock-matchers.h | 37 + .../gmock/internal/custom/gmock-port.h | 40 + .../gmock/internal/gmock-internal-utils.h | 487 + .../include/gmock/internal/gmock-port.h | 139 + .../include/gmock/internal/gmock-pp.h | 279 + .../googlemock/src/gmock-all.cc | 46 + .../googlemock/src/gmock-cardinalities.cc | 155 + .../googlemock/src/gmock-internal-utils.cc | 257 + .../googlemock/src/gmock-matchers.cc | 479 + .../googlemock/src/gmock-spec-builders.cc | 791 + .../googletest-1.14.0/googlemock/src/gmock.cc | 225 + .../googlemock/src/gmock_main.cc | 73 + .../googlemock/test/BUILD.bazel | 118 + .../googlemock/test/gmock-actions_test.cc | 2169 ++ .../test/gmock-cardinalities_test.cc | 424 + .../test/gmock-function-mocker_test.cc | 998 + .../test/gmock-internal-utils_test.cc | 766 + .../test/gmock-matchers-arithmetic_test.cc | 1516 ++ .../test/gmock-matchers-comparisons_test.cc | 2361 ++ .../test/gmock-matchers-containers_test.cc | 3137 +++ .../test/gmock-matchers-misc_test.cc | 1823 ++ .../googlemock/test/gmock-matchers_test.h | 192 + .../test/gmock-more-actions_test.cc | 1550 ++ .../googlemock/test/gmock-nice-strict_test.cc | 541 + .../googlemock/test/gmock-port_test.cc | 42 + .../googlemock/test/gmock-pp-string_test.cc | 205 + .../googlemock/test/gmock-pp_test.cc | 83 + .../test/gmock-spec-builders_test.cc | 2600 ++ .../googlemock/test/gmock_all_test.cc | 49 + .../googlemock/test/gmock_ex_test.cc | 80 + .../googlemock/test/gmock_leak_test.py | 113 + .../googlemock/test/gmock_leak_test_.cc | 99 + .../googlemock/test/gmock_link2_test.cc} | 16 +- .../googlemock/test/gmock_link_test.cc | 38 + .../googlemock/test/gmock_link_test.h | 684 + .../googlemock/test/gmock_output_test.py | 190 + .../googlemock/test/gmock_output_test_.cc | 286 + .../test/gmock_output_test_golden.txt | 335 + .../googlemock/test/gmock_stress_test.cc | 227 + .../googlemock/test/gmock_test.cc | 179 + .../googlemock/test/gmock_test_utils.py | 91 + .../googletest}/CMakeLists.txt | 218 +- vendor/googletest-1.14.0/googletest/README.md | 231 + .../googletest/cmake/Config.cmake.in | 9 + .../googletest/cmake/gtest.pc.in | 9 + .../googletest/cmake/gtest_main.pc.in | 10 + .../googletest}/cmake/internal_utils.cmake | 181 +- .../googletest/cmake/libgtest.la.in | 21 + .../googletest/docs/README.md | 4 + .../include/gtest/gtest-assertion-result.h | 237 + .../include/gtest/gtest-death-test.h | 157 +- .../googletest/include/gtest/gtest-matchers.h | 923 + .../googletest}/include/gtest/gtest-message.h | 126 +- .../include/gtest/gtest-param-test.h} | 335 +- .../googletest/include/gtest/gtest-printers.h | 1161 + .../googletest}/include/gtest/gtest-spi.h | 156 +- .../include/gtest/gtest-test-part.h | 67 +- .../include/gtest/gtest-typed-test.h | 331 + .../googletest}/include/gtest/gtest.h | 1650 +- .../include/gtest/gtest_pred_impl.h | 279 + .../googletest}/include/gtest/gtest_prod.h | 28 +- .../include/gtest/internal/custom/README.md | 44 + .../gtest/internal/custom/gtest-port.h} | 15 +- .../gtest/internal/custom/gtest-printers.h} | 20 +- .../include/gtest/internal/custom/gtest.h} | 17 +- .../internal/gtest-death-test-internal.h | 252 +- .../include/gtest/internal/gtest-filepath.h | 53 +- .../include/gtest/internal/gtest-internal.h | 1560 ++ .../include/gtest/internal/gtest-param-util.h | 1026 + .../include/gtest/internal/gtest-port-arch.h | 122 + .../include/gtest/internal/gtest-port.h | 2481 ++ .../include/gtest/internal/gtest-string.h | 59 +- .../include/gtest/internal/gtest-type-util.h | 220 + .../googletest}/samples/prime_tables.h | 44 +- .../googletest}/samples/sample1.cc | 10 +- .../googletest}/samples/sample1.h | 10 +- .../googletest}/samples/sample10_unittest.cc | 20 +- .../googletest}/samples/sample1_unittest.cc | 17 +- .../googletest}/samples/sample2.cc | 6 +- .../googletest}/samples/sample2.h | 20 +- .../googletest}/samples/sample2_unittest.cc | 16 +- .../googletest}/samples/sample3-inl.h | 33 +- .../googletest}/samples/sample3_unittest.cc | 39 +- .../googletest}/samples/sample4.cc | 22 +- .../googletest}/samples/sample4.h | 12 +- .../googletest}/samples/sample4_unittest.cc | 14 +- .../googletest}/samples/sample5_unittest.cc | 34 +- .../googletest}/samples/sample6_unittest.cc | 34 +- .../googletest}/samples/sample7_unittest.cc | 45 +- .../googletest}/samples/sample8_unittest.cc | 65 +- .../googletest}/samples/sample9_unittest.cc | 50 +- .../googletest}/src/gtest-all.cc | 9 +- .../googletest/src/gtest-assertion-result.cc} | 62 +- .../googletest}/src/gtest-death-test.cc | 1003 +- .../googletest}/src/gtest-filepath.cc | 250 +- .../googletest}/src/gtest-internal-inl.h | 636 +- .../googletest/src/gtest-matchers.cc | 98 + .../googletest/src/gtest-port.cc | 1392 ++ .../googletest}/src/gtest-printers.cc | 352 +- .../googletest}/src/gtest-test-part.cc | 46 +- .../googletest}/src/gtest-typed-test.cc | 72 +- .../googletest-1.14.0/googletest/src/gtest.cc | 6906 ++++++ .../googletest/src/gtest_main.cc | 66 + .../googletest/test/BUILD.bazel | 595 + .../googletest-break-on-failure-unittest.py} | 87 +- .../googletest-break-on-failure-unittest_.cc} | 27 +- .../test/googletest-catch-exceptions-test.py | 315 + .../googletest-catch-exceptions-test_.cc} | 132 +- .../googletest/test/googletest-color-test.py} | 79 +- .../test/googletest-color-test_.cc} | 13 +- .../test/googletest-death-test-test.cc} | 761 +- .../test/googletest-death-test_ex_test.cc} | 34 +- .../test/googletest-env-var-test.py} | 31 +- .../test/googletest-env-var-test_.cc} | 44 +- .../test/googletest-failfast-unittest.py | 461 + .../test/googletest-failfast-unittest_.cc | 166 + .../test/googletest-filepath-test.cc} | 259 +- .../test/googletest-filter-unittest.py} | 485 +- .../test/googletest-filter-unittest_.cc} | 78 +- .../googletest-global-environment-unittest.py | 141 + ...googletest-global-environment-unittest_.cc | 58 + .../test/googletest-json-outfiles-test.py | 180 + .../test/googletest-json-output-unittest.py | 820 + .../test/googletest-list-tests-unittest.py} | 120 +- .../test/googletest-list-tests-unittest_.cc} | 104 +- .../test/googletest-listener-test.cc | 509 + .../test/googletest-message-test.cc} | 51 +- .../test/googletest-options-test.cc} | 117 +- .../googletest-output-test-golden-lin.txt} | 868 +- .../test/googletest-output-test.py} | 212 +- .../test/googletest-output-test_.cc} | 592 +- ...oogletest-param-test-invalid-name1-test.py | 63 + ...ogletest-param-test-invalid-name1-test_.cc | 46 + ...oogletest-param-test-invalid-name2-test.py | 63 + ...ogletest-param-test-invalid-name2-test_.cc | 52 + .../test/googletest-param-test-test.cc} | 679 +- .../test/googletest-param-test-test.h} | 22 +- .../test/googletest-param-test2-test.cc} | 33 +- .../googletest/test/googletest-port-test.cc} | 474 +- .../test/googletest-printers-test.cc} | 1226 +- .../test/googletest-setuptestsuite-test.py} | 62 +- .../test/googletest-setuptestsuite-test_.cc} | 25 +- .../test/googletest-shuffle-test.py} | 211 +- .../test/googletest-shuffle-test_.cc} | 14 +- .../test/googletest-test-part-test.cc} | 60 +- .../test/googletest-throw-on-failure-test.py} | 83 +- .../googletest-throw-on-failure-test_.cc} | 15 +- .../test/googletest-uninitialized-test.py} | 18 +- .../test/googletest-uninitialized-test_.cc} | 10 +- .../test/gtest-typed-test2_test.cc | 12 +- .../googletest/test/gtest-typed-test_test.cc | 423 + .../googletest}/test/gtest-typed-test_test.h | 25 +- .../test/gtest-unittest-api_test.cc | 328 + .../googletest}/test/gtest_all_test.cc | 21 +- .../test/gtest_assert_by_exception_test.cc | 112 + .../googletest/test/gtest_dirs_test.cc | 101 + .../test/gtest_environment_test.cc | 35 +- .../googletest}/test/gtest_help_test.py | 133 +- .../googletest}/test/gtest_help_test_.cc | 4 +- .../googletest/test/gtest_json_test_utils.py} | 65 +- .../test/gtest_list_output_unittest.py | 289 + .../test/gtest_list_output_unittest_.cc | 77 + .../googletest}/test/gtest_main_unittest.cc | 9 +- .../test/gtest_no_test_unittest.cc | 2 - .../test/gtest_pred_impl_unittest.cc | 1793 +- .../test/gtest_premature_exit_test.cc | 47 +- .../googletest}/test/gtest_prod_test.cc | 7 +- .../googletest}/test/gtest_repeat_test.cc | 99 +- .../test/gtest_skip_check_output_test.py | 60 + ...test_skip_environment_check_output_test.py | 55 + .../gtest_skip_in_environment_setup_test.cc | 50 + .../googletest/test/gtest_skip_test.cc | 51 + .../test/gtest_sole_header_test.cc | 7 +- .../googletest}/test/gtest_stress_test.cc | 43 +- .../gtest_test_macro_stack_footprint_test.cc | 89 + .../googletest}/test/gtest_test_utils.py | 168 +- .../googletest/test/gtest_testbridge_test.py | 63 + .../googletest/test/gtest_testbridge_test_.cc | 42 + .../test/gtest_throw_on_failure_ex_test.cc | 20 +- .../googletest}/test/gtest_unittest.cc | 4396 ++-- .../test/gtest_xml_outfile1_test_.cc | 10 +- .../test/gtest_xml_outfile2_test_.cc} | 71 +- .../test/gtest_xml_outfiles_test.py | 69 +- .../test/gtest_xml_output_unittest.py | 469 + .../test/gtest_xml_output_unittest_.cc | 58 +- .../googletest}/test/gtest_xml_test_utils.py | 190 +- .../googletest}/test/production.cc | 5 +- .../googletest}/test/production.h | 12 +- vendor/googletest-1.14.0/googletest_deps.bzl | 22 + vendor/gtest-1.7.0/CHANGES | 157 - vendor/gtest-1.7.0/Makefile.am | 306 - vendor/gtest-1.7.0/README | 435 - vendor/gtest-1.7.0/build-aux/compile | 347 - vendor/gtest-1.7.0/build-aux/config.guess | 1530 -- vendor/gtest-1.7.0/build-aux/config.sub | 1773 -- vendor/gtest-1.7.0/build-aux/depcomp | 688 - vendor/gtest-1.7.0/build-aux/install-sh | 527 - vendor/gtest-1.7.0/build-aux/missing | 331 - vendor/gtest-1.7.0/build-aux/stamp-h1 | 1 - vendor/gtest-1.7.0/build-aux/test-driver | 139 - vendor/gtest-1.7.0/codegear/gtest.cbproj | 138 - vendor/gtest-1.7.0/codegear/gtest.groupproj | 54 - vendor/gtest-1.7.0/codegear/gtest_main.cbproj | 82 - .../codegear/gtest_unittest.cbproj | 88 - vendor/gtest-1.7.0/configure.ac | 68 - .../.deps/test_fused_gtest_test-gtest-all.Po | 1 - .../.deps/test_fused_gtest_test-gtest_main.Po | 1 - .../gtest-1.7.0/fused-src/gtest/gtest-all.cc | 9592 -------- vendor/gtest-1.7.0/fused-src/gtest/gtest.h | 20061 ---------------- .../include/gtest/gtest-param-test.h | 1421 -- .../include/gtest/gtest-printers.h | 855 - .../include/gtest/gtest-typed-test.h | 259 - .../include/gtest/gtest_pred_impl.h | 358 - .../include/gtest/internal/gtest-internal.h | 1158 - .../include/gtest/internal/gtest-linked_ptr.h | 233 - .../internal/gtest-param-util-generated.h | 5143 ---- .../gtest-param-util-generated.h.pump | 301 - .../include/gtest/internal/gtest-param-util.h | 619 - .../include/gtest/internal/gtest-port.h | 1947 -- .../include/gtest/internal/gtest-tuple.h | 1012 - .../include/gtest/internal/gtest-tuple.h.pump | 339 - .../include/gtest/internal/gtest-type-util.h | 3331 --- .../gtest/internal/gtest-type-util.h.pump | 297 - vendor/gtest-1.7.0/m4/acx_pthread.m4 | 363 - vendor/gtest-1.7.0/m4/gtest.m4 | 74 - vendor/gtest-1.7.0/m4/ltsugar.m4 | 123 - vendor/gtest-1.7.0/m4/lt~obsolete.m4 | 98 - vendor/gtest-1.7.0/make/Makefile | 82 - vendor/gtest-1.7.0/msvc/gtest-md.sln | 45 - vendor/gtest-1.7.0/msvc/gtest-md.vcproj | 126 - vendor/gtest-1.7.0/msvc/gtest.sln | 45 - vendor/gtest-1.7.0/msvc/gtest.vcproj | 126 - vendor/gtest-1.7.0/msvc/gtest_main-md.vcproj | 129 - vendor/gtest-1.7.0/msvc/gtest_main.vcproj | 129 - .../msvc/gtest_prod_test-md.vcproj | 164 - .../gtest-1.7.0/msvc/gtest_prod_test.vcproj | 164 - .../gtest-1.7.0/msvc/gtest_unittest-md.vcproj | 147 - vendor/gtest-1.7.0/msvc/gtest_unittest.vcproj | 147 - vendor/gtest-1.7.0/samples/.dirstamp | 0 .../gtest-1.7.0/scripts/fuse_gtest_files.py | 250 - .../scripts/gen_gtest_pred_impl.py | 730 - vendor/gtest-1.7.0/scripts/gtest-config.in | 274 - vendor/gtest-1.7.0/scripts/pump.py | 855 - vendor/gtest-1.7.0/scripts/test/Makefile | 59 - vendor/gtest-1.7.0/src/.dirstamp | 0 vendor/gtest-1.7.0/src/gtest-port.cc | 805 - vendor/gtest-1.7.0/src/gtest.cc | 5015 ---- .../gtest-1.7.0/test/.deps/gtest_all_test.Po | 1 - .../gtest-1.7.0/test/gtest-linked_ptr_test.cc | 154 - .../gtest-1.7.0/test/gtest-listener_test.cc | 310 - vendor/gtest-1.7.0/test/gtest-tuple_test.cc | 320 - .../gtest-1.7.0/test/gtest-typed-test_test.cc | 360 - .../test/gtest-unittest-api_test.cc | 341 - .../test/gtest_catch_exceptions_test.py | 237 - .../test/gtest_xml_output_unittest.py | 307 - .../xcode/Config/DebugProject.xcconfig | 30 - .../xcode/Config/FrameworkTarget.xcconfig | 17 - .../gtest-1.7.0/xcode/Config/General.xcconfig | 41 - .../xcode/Config/ReleaseProject.xcconfig | 32 - .../xcode/Config/StaticLibraryTarget.xcconfig | 18 - .../xcode/Config/TestTarget.xcconfig | 8 - vendor/gtest-1.7.0/xcode/Resources/Info.plist | 30 - .../xcode/Samples/FrameworkSample/Info.plist | 28 - .../WidgetFramework.xcodeproj/project.pbxproj | 457 - .../xcode/Samples/FrameworkSample/widget.h | 59 - .../xcode/Scripts/versiongenerate.py | 100 - .../xcode/gtest.xcodeproj/project.pbxproj | 1135 - 325 files changed, 84645 insertions(+), 76686 deletions(-) create mode 100644 vendor/googletest-1.14.0/.clang-format create mode 100644 vendor/googletest-1.14.0/.github/ISSUE_TEMPLATE/00-bug_report.yml create mode 100644 vendor/googletest-1.14.0/.github/ISSUE_TEMPLATE/10-feature_request.yml create mode 100644 vendor/googletest-1.14.0/.github/ISSUE_TEMPLATE/config.yml create mode 100644 vendor/googletest-1.14.0/.github/workflows/gtest-ci.yml create mode 100644 vendor/googletest-1.14.0/.gitignore create mode 100644 vendor/googletest-1.14.0/BUILD.bazel create mode 100644 vendor/googletest-1.14.0/CMakeLists.txt create mode 100644 vendor/googletest-1.14.0/CONTRIBUTING.md rename vendor/{gtest-1.7.0 => googletest-1.14.0}/CONTRIBUTORS (60%) rename vendor/{gtest-1.7.0 => googletest-1.14.0}/LICENSE (100%) create mode 100644 vendor/googletest-1.14.0/README.md create mode 100644 vendor/googletest-1.14.0/WORKSPACE create mode 100644 vendor/googletest-1.14.0/ci/linux-presubmit.sh create mode 100644 vendor/googletest-1.14.0/ci/macos-presubmit.sh create mode 100644 vendor/googletest-1.14.0/ci/windows-presubmit.bat create mode 100644 vendor/googletest-1.14.0/docs/_config.yml create mode 100644 vendor/googletest-1.14.0/docs/_data/navigation.yml create mode 100644 vendor/googletest-1.14.0/docs/_layouts/default.html create mode 100644 vendor/googletest-1.14.0/docs/_sass/main.scss create mode 100644 vendor/googletest-1.14.0/docs/advanced.md create mode 100644 vendor/googletest-1.14.0/docs/assets/css/style.scss create mode 100644 vendor/googletest-1.14.0/docs/community_created_documentation.md create mode 100644 vendor/googletest-1.14.0/docs/faq.md create mode 100644 vendor/googletest-1.14.0/docs/gmock_cheat_sheet.md create mode 100644 vendor/googletest-1.14.0/docs/gmock_cook_book.md create mode 100644 vendor/googletest-1.14.0/docs/gmock_faq.md create mode 100644 vendor/googletest-1.14.0/docs/gmock_for_dummies.md create mode 100644 vendor/googletest-1.14.0/docs/index.md create mode 100644 vendor/googletest-1.14.0/docs/pkgconfig.md create mode 100644 vendor/googletest-1.14.0/docs/platforms.md create mode 100644 vendor/googletest-1.14.0/docs/primer.md create mode 100644 vendor/googletest-1.14.0/docs/quickstart-bazel.md create mode 100644 vendor/googletest-1.14.0/docs/quickstart-cmake.md create mode 100644 vendor/googletest-1.14.0/docs/reference/actions.md create mode 100644 vendor/googletest-1.14.0/docs/reference/assertions.md create mode 100644 vendor/googletest-1.14.0/docs/reference/matchers.md create mode 100644 vendor/googletest-1.14.0/docs/reference/mocking.md create mode 100644 vendor/googletest-1.14.0/docs/reference/testing.md create mode 100644 vendor/googletest-1.14.0/docs/samples.md create mode 100644 vendor/googletest-1.14.0/googlemock/CMakeLists.txt create mode 100644 vendor/googletest-1.14.0/googlemock/README.md create mode 100644 vendor/googletest-1.14.0/googlemock/cmake/gmock.pc.in create mode 100644 vendor/googletest-1.14.0/googlemock/cmake/gmock_main.pc.in create mode 100644 vendor/googletest-1.14.0/googlemock/docs/README.md create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/gmock-actions.h create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/gmock-cardinalities.h create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/gmock-function-mocker.h create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/gmock-matchers.h create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/gmock-more-actions.h create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/gmock-more-matchers.h create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/gmock-nice-strict.h create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/gmock-spec-builders.h create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/gmock.h create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/internal/custom/README.md create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/internal/custom/gmock-generated-actions.h create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/internal/custom/gmock-matchers.h create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/internal/custom/gmock-port.h create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/internal/gmock-internal-utils.h create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/internal/gmock-port.h create mode 100644 vendor/googletest-1.14.0/googlemock/include/gmock/internal/gmock-pp.h create mode 100644 vendor/googletest-1.14.0/googlemock/src/gmock-all.cc create mode 100644 vendor/googletest-1.14.0/googlemock/src/gmock-cardinalities.cc create mode 100644 vendor/googletest-1.14.0/googlemock/src/gmock-internal-utils.cc create mode 100644 vendor/googletest-1.14.0/googlemock/src/gmock-matchers.cc create mode 100644 vendor/googletest-1.14.0/googlemock/src/gmock-spec-builders.cc create mode 100644 vendor/googletest-1.14.0/googlemock/src/gmock.cc create mode 100644 vendor/googletest-1.14.0/googlemock/src/gmock_main.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/BUILD.bazel create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-actions_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-cardinalities_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-function-mocker_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-internal-utils_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-matchers-arithmetic_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-matchers-comparisons_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-matchers-containers_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-matchers-misc_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-matchers_test.h create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-more-actions_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-nice-strict_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-port_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-pp-string_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-pp_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock-spec-builders_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock_all_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock_ex_test.cc create mode 100755 vendor/googletest-1.14.0/googlemock/test/gmock_leak_test.py create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock_leak_test_.cc rename vendor/{gtest-1.7.0/fused-src/gtest/gtest_main.cc => googletest-1.14.0/googlemock/test/gmock_link2_test.cc} (81%) create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock_link_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock_link_test.h create mode 100755 vendor/googletest-1.14.0/googlemock/test/gmock_output_test.py create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock_output_test_.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock_output_test_golden.txt create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock_stress_test.cc create mode 100644 vendor/googletest-1.14.0/googlemock/test/gmock_test.cc create mode 100755 vendor/googletest-1.14.0/googlemock/test/gmock_test_utils.py rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/CMakeLists.txt (51%) create mode 100644 vendor/googletest-1.14.0/googletest/README.md create mode 100644 vendor/googletest-1.14.0/googletest/cmake/Config.cmake.in create mode 100644 vendor/googletest-1.14.0/googletest/cmake/gtest.pc.in create mode 100644 vendor/googletest-1.14.0/googletest/cmake/gtest_main.pc.in rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/cmake/internal_utils.cmake (53%) create mode 100644 vendor/googletest-1.14.0/googletest/cmake/libgtest.la.in create mode 100644 vendor/googletest-1.14.0/googletest/docs/README.md create mode 100644 vendor/googletest-1.14.0/googletest/include/gtest/gtest-assertion-result.h rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/include/gtest/gtest-death-test.h (62%) create mode 100644 vendor/googletest-1.14.0/googletest/include/gtest/gtest-matchers.h rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/include/gtest/gtest-message.h (75%) rename vendor/{gtest-1.7.0/include/gtest/gtest-param-test.h.pump => googletest-1.14.0/googletest/include/gtest/gtest-param-test.h} (53%) create mode 100644 vendor/googletest-1.14.0/googletest/include/gtest/gtest-printers.h rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/include/gtest/gtest-spi.h (58%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/include/gtest/gtest-test-part.h (75%) create mode 100644 vendor/googletest-1.14.0/googletest/include/gtest/gtest-typed-test.h rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/include/gtest/gtest.h (57%) create mode 100644 vendor/googletest-1.14.0/googletest/include/gtest/gtest_pred_impl.h rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/include/gtest/gtest_prod.h (73%) create mode 100644 vendor/googletest-1.14.0/googletest/include/gtest/internal/custom/README.md rename vendor/{gtest-1.7.0/codegear/gtest_all.cc => googletest-1.14.0/googletest/include/gtest/internal/custom/gtest-port.h} (81%) rename vendor/{gtest-1.7.0/codegear/gtest_link.cc => googletest-1.14.0/googletest/include/gtest/internal/custom/gtest-printers.h} (73%) rename vendor/{gtest-1.7.0/src/gtest_main.cc => googletest-1.14.0/googletest/include/gtest/internal/custom/gtest.h} (82%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/include/gtest/internal/gtest-death-test-internal.h (54%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/include/gtest/internal/gtest-filepath.h (86%) create mode 100644 vendor/googletest-1.14.0/googletest/include/gtest/internal/gtest-internal.h create mode 100644 vendor/googletest-1.14.0/googletest/include/gtest/internal/gtest-param-util.h create mode 100644 vendor/googletest-1.14.0/googletest/include/gtest/internal/gtest-port-arch.h create mode 100644 vendor/googletest-1.14.0/googletest/include/gtest/internal/gtest-port.h rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/include/gtest/internal/gtest-string.h (80%) create mode 100644 vendor/googletest-1.14.0/googletest/include/gtest/internal/gtest-type-util.h rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/prime_tables.h (76%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample1.cc (92%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample1.h (90%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample10_unittest.cc (91%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample1_unittest.cc (97%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample2.cc (94%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample2.h (87%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample2_unittest.cc (94%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample3-inl.h (87%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample3_unittest.cc (87%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample4.cc (84%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample4.h (90%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample4_unittest.cc (93%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample5_unittest.cc (94%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample6_unittest.cc (91%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample7_unittest.cc (76%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample8_unittest.cc (77%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/samples/sample9_unittest.cc (78%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/src/gtest-all.cc (93%) rename vendor/{gtest-1.7.0/xcode/Samples/FrameworkSample/widget.cc => googletest-1.14.0/googletest/src/gtest-assertion-result.cc} (51%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/src/gtest-death-test.cc (57%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/src/gtest-filepath.cc (68%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/src/gtest-internal-inl.h (66%) create mode 100644 vendor/googletest-1.14.0/googletest/src/gtest-matchers.cc create mode 100644 vendor/googletest-1.14.0/googletest/src/gtest-port.cc rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/src/gtest-printers.cc (50%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/src/gtest-test-part.cc (74%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/src/gtest-typed-test.cc (64%) create mode 100644 vendor/googletest-1.14.0/googletest/src/gtest.cc create mode 100644 vendor/googletest-1.14.0/googletest/src/gtest_main.cc create mode 100644 vendor/googletest-1.14.0/googletest/test/BUILD.bazel rename vendor/{gtest-1.7.0/test/gtest_break_on_failure_unittest.py => googletest-1.14.0/googletest/test/googletest-break-on-failure-unittest.py} (70%) rename vendor/{gtest-1.7.0/test/gtest_break_on_failure_unittest_.cc => googletest-1.14.0/googletest/test/googletest-break-on-failure-unittest_.cc} (87%) create mode 100755 vendor/googletest-1.14.0/googletest/test/googletest-catch-exceptions-test.py rename vendor/{gtest-1.7.0/test/gtest_catch_exceptions_test_.cc => googletest-1.14.0/googletest/test/googletest-catch-exceptions-test_.cc} (66%) rename vendor/{gtest-1.7.0/test/gtest_color_test.py => googletest-1.14.0/googletest/test/googletest-color-test.py} (57%) rename vendor/{gtest-1.7.0/test/gtest_color_test_.cc => googletest-1.14.0/googletest/test/googletest-color-test_.cc} (85%) rename vendor/{gtest-1.7.0/test/gtest-death-test_test.cc => googletest-1.14.0/googletest/test/googletest-death-test-test.cc} (69%) rename vendor/{gtest-1.7.0/test/gtest-death-test_ex_test.cc => googletest-1.14.0/googletest/test/googletest-death-test_ex_test.cc} (81%) rename vendor/{gtest-1.7.0/test/gtest_env_var_test.py => googletest-1.14.0/googletest/test/googletest-env-var-test.py} (76%) rename vendor/{gtest-1.7.0/test/gtest_env_var_test_.cc => googletest-1.14.0/googletest/test/googletest-env-var-test_.cc} (80%) create mode 100755 vendor/googletest-1.14.0/googletest/test/googletest-failfast-unittest.py create mode 100644 vendor/googletest-1.14.0/googletest/test/googletest-failfast-unittest_.cc rename vendor/{gtest-1.7.0/test/gtest-filepath_test.cc => googletest-1.14.0/googletest/test/googletest-filepath-test.cc} (75%) rename vendor/{gtest-1.7.0/test/gtest_filter_unittest.py => googletest-1.14.0/googletest/test/googletest-filter-unittest.py} (64%) rename vendor/{gtest-1.7.0/test/gtest_filter_unittest_.cc => googletest-1.14.0/googletest/test/googletest-filter-unittest_.cc} (65%) create mode 100644 vendor/googletest-1.14.0/googletest/test/googletest-global-environment-unittest.py create mode 100644 vendor/googletest-1.14.0/googletest/test/googletest-global-environment-unittest_.cc create mode 100644 vendor/googletest-1.14.0/googletest/test/googletest-json-outfiles-test.py create mode 100644 vendor/googletest-1.14.0/googletest/test/googletest-json-output-unittest.py rename vendor/{gtest-1.7.0/test/gtest_list_tests_unittest.py => googletest-1.14.0/googletest/test/googletest-list-tests-unittest.py} (62%) rename vendor/{gtest-1.7.0/test/gtest_list_tests_unittest_.cc => googletest-1.14.0/googletest/test/googletest-list-tests-unittest_.cc} (63%) create mode 100644 vendor/googletest-1.14.0/googletest/test/googletest-listener-test.cc rename vendor/{gtest-1.7.0/test/gtest-message_test.cc => googletest-1.14.0/googletest/test/googletest-message-test.cc} (81%) rename vendor/{gtest-1.7.0/test/gtest-options_test.cc => googletest-1.14.0/googletest/test/googletest-options-test.cc} (70%) rename vendor/{gtest-1.7.0/test/gtest_output_test_golden_lin.txt => googletest-1.14.0/googletest/test/googletest-output-test-golden-lin.txt} (50%) rename vendor/{gtest-1.7.0/test/gtest_output_test.py => googletest-1.14.0/googletest/test/googletest-output-test.py} (64%) rename vendor/{gtest-1.7.0/test/gtest_output_test_.cc => googletest-1.14.0/googletest/test/googletest-output-test_.cc} (64%) create mode 100644 vendor/googletest-1.14.0/googletest/test/googletest-param-test-invalid-name1-test.py create mode 100644 vendor/googletest-1.14.0/googletest/test/googletest-param-test-invalid-name1-test_.cc create mode 100644 vendor/googletest-1.14.0/googletest/test/googletest-param-test-invalid-name2-test.py create mode 100644 vendor/googletest-1.14.0/googletest/test/googletest-param-test-invalid-name2-test_.cc rename vendor/{gtest-1.7.0/test/gtest-param-test_test.cc => googletest-1.14.0/googletest/test/googletest-param-test-test.cc} (56%) rename vendor/{gtest-1.7.0/test/gtest-param-test_test.h => googletest-1.14.0/googletest/test/googletest-param-test-test.h} (83%) rename vendor/{gtest-1.7.0/test/gtest-param-test2_test.cc => googletest-1.14.0/googletest/test/googletest-param-test2-test.cc} (73%) rename vendor/{gtest-1.7.0/test/gtest-port_test.cc => googletest-1.14.0/googletest/test/googletest-port-test.cc} (76%) rename vendor/{gtest-1.7.0/test/gtest-printers_test.cc => googletest-1.14.0/googletest/test/googletest-printers-test.cc} (53%) rename vendor/{gtest-1.7.0/xcode/Samples/FrameworkSample/runtests.sh => googletest-1.14.0/googletest/test/googletest-setuptestsuite-test.py} (63%) mode change 100644 => 100755 rename vendor/{gtest-1.7.0/test/gtest_xml_outfile2_test_.cc => googletest-1.14.0/googletest/test/googletest-setuptestsuite-test_.cc} (79%) rename vendor/{gtest-1.7.0/test/gtest_shuffle_test.py => googletest-1.14.0/googletest/test/googletest-shuffle-test.py} (65%) rename vendor/{gtest-1.7.0/test/gtest_shuffle_test_.cc => googletest-1.14.0/googletest/test/googletest-shuffle-test_.cc} (88%) rename vendor/{gtest-1.7.0/test/gtest-test-part_test.cc => googletest-1.14.0/googletest/test/googletest-test-part-test.cc} (81%) rename vendor/{gtest-1.7.0/test/gtest_throw_on_failure_test.py => googletest-1.14.0/googletest/test/googletest-throw-on-failure-test.py} (65%) rename vendor/{gtest-1.7.0/test/gtest_throw_on_failure_test_.cc => googletest-1.14.0/googletest/test/googletest-throw-on-failure-test_.cc} (89%) rename vendor/{gtest-1.7.0/test/gtest_uninitialized_test.py => googletest-1.14.0/googletest/test/googletest-uninitialized-test.py} (88%) rename vendor/{gtest-1.7.0/test/gtest_uninitialized_test_.cc => googletest-1.14.0/googletest/test/googletest-uninitialized-test_.cc} (90%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest-typed-test2_test.cc (89%) create mode 100644 vendor/googletest-1.14.0/googletest/test/gtest-typed-test_test.cc rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest-typed-test_test.h (79%) create mode 100644 vendor/googletest-1.14.0/googletest/test/gtest-unittest-api_test.cc rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_all_test.cc (85%) create mode 100644 vendor/googletest-1.14.0/googletest/test/gtest_assert_by_exception_test.cc create mode 100644 vendor/googletest-1.14.0/googletest/test/gtest_dirs_test.cc rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_environment_test.cc (91%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_help_test.py (59%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_help_test_.cc (96%) rename vendor/{gtest-1.7.0/xcode/Scripts/runtests.sh => googletest-1.14.0/googletest/test/gtest_json_test_utils.py} (58%) create mode 100644 vendor/googletest-1.14.0/googletest/test/gtest_list_output_unittest.py create mode 100644 vendor/googletest-1.14.0/googletest/test/gtest_list_output_unittest_.cc rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_main_unittest.cc (90%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_no_test_unittest.cc (98%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_pred_impl_unittest.cc (55%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_premature_exit_test.cc (76%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_prod_test.cc (94%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_repeat_test.cc (73%) create mode 100755 vendor/googletest-1.14.0/googletest/test/gtest_skip_check_output_test.py create mode 100755 vendor/googletest-1.14.0/googletest/test/gtest_skip_environment_check_output_test.py create mode 100644 vendor/googletest-1.14.0/googletest/test/gtest_skip_in_environment_setup_test.cc create mode 100644 vendor/googletest-1.14.0/googletest/test/gtest_skip_test.cc rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_sole_header_test.cc (95%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_stress_test.cc (89%) create mode 100644 vendor/googletest-1.14.0/googletest/test/gtest_test_macro_stack_footprint_test.cc rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_test_utils.py (60%) create mode 100755 vendor/googletest-1.14.0/googletest/test/gtest_testbridge_test.py create mode 100644 vendor/googletest-1.14.0/googletest/test/gtest_testbridge_test_.cc rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_throw_on_failure_ex_test.cc (93%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_unittest.cc (63%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_xml_outfile1_test_.cc (90%) rename vendor/{gtest-1.7.0/xcode/Samples/FrameworkSample/widget_test.cc => googletest-1.14.0/googletest/test/gtest_xml_outfile2_test_.cc} (56%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_xml_outfiles_test.py (64%) create mode 100755 vendor/googletest-1.14.0/googletest/test/gtest_xml_output_unittest.py rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_xml_output_unittest_.cc (81%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/gtest_xml_test_utils.py (57%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/production.cc (93%) rename vendor/{gtest-1.7.0 => googletest-1.14.0/googletest}/test/production.h (90%) create mode 100644 vendor/googletest-1.14.0/googletest_deps.bzl delete mode 100644 vendor/gtest-1.7.0/CHANGES delete mode 100644 vendor/gtest-1.7.0/Makefile.am delete mode 100644 vendor/gtest-1.7.0/README delete mode 100755 vendor/gtest-1.7.0/build-aux/compile delete mode 100755 vendor/gtest-1.7.0/build-aux/config.guess delete mode 100755 vendor/gtest-1.7.0/build-aux/config.sub delete mode 100755 vendor/gtest-1.7.0/build-aux/depcomp delete mode 100755 vendor/gtest-1.7.0/build-aux/install-sh delete mode 100755 vendor/gtest-1.7.0/build-aux/missing delete mode 100644 vendor/gtest-1.7.0/build-aux/stamp-h1 delete mode 100755 vendor/gtest-1.7.0/build-aux/test-driver delete mode 100644 vendor/gtest-1.7.0/codegear/gtest.cbproj delete mode 100644 vendor/gtest-1.7.0/codegear/gtest.groupproj delete mode 100644 vendor/gtest-1.7.0/codegear/gtest_main.cbproj delete mode 100644 vendor/gtest-1.7.0/codegear/gtest_unittest.cbproj delete mode 100644 vendor/gtest-1.7.0/configure.ac delete mode 100644 vendor/gtest-1.7.0/fused-src/gtest/.deps/test_fused_gtest_test-gtest-all.Po delete mode 100644 vendor/gtest-1.7.0/fused-src/gtest/.deps/test_fused_gtest_test-gtest_main.Po delete mode 100644 vendor/gtest-1.7.0/fused-src/gtest/gtest-all.cc delete mode 100644 vendor/gtest-1.7.0/fused-src/gtest/gtest.h delete mode 100644 vendor/gtest-1.7.0/include/gtest/gtest-param-test.h delete mode 100644 vendor/gtest-1.7.0/include/gtest/gtest-printers.h delete mode 100644 vendor/gtest-1.7.0/include/gtest/gtest-typed-test.h delete mode 100644 vendor/gtest-1.7.0/include/gtest/gtest_pred_impl.h delete mode 100644 vendor/gtest-1.7.0/include/gtest/internal/gtest-internal.h delete mode 100644 vendor/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h delete mode 100644 vendor/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h delete mode 100644 vendor/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump delete mode 100644 vendor/gtest-1.7.0/include/gtest/internal/gtest-param-util.h delete mode 100644 vendor/gtest-1.7.0/include/gtest/internal/gtest-port.h delete mode 100644 vendor/gtest-1.7.0/include/gtest/internal/gtest-tuple.h delete mode 100644 vendor/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump delete mode 100644 vendor/gtest-1.7.0/include/gtest/internal/gtest-type-util.h delete mode 100644 vendor/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump delete mode 100644 vendor/gtest-1.7.0/m4/acx_pthread.m4 delete mode 100644 vendor/gtest-1.7.0/m4/gtest.m4 delete mode 100644 vendor/gtest-1.7.0/m4/ltsugar.m4 delete mode 100644 vendor/gtest-1.7.0/m4/lt~obsolete.m4 delete mode 100644 vendor/gtest-1.7.0/make/Makefile delete mode 100755 vendor/gtest-1.7.0/msvc/gtest-md.sln delete mode 100755 vendor/gtest-1.7.0/msvc/gtest-md.vcproj delete mode 100755 vendor/gtest-1.7.0/msvc/gtest.sln delete mode 100755 vendor/gtest-1.7.0/msvc/gtest.vcproj delete mode 100755 vendor/gtest-1.7.0/msvc/gtest_main-md.vcproj delete mode 100755 vendor/gtest-1.7.0/msvc/gtest_main.vcproj delete mode 100755 vendor/gtest-1.7.0/msvc/gtest_prod_test-md.vcproj delete mode 100755 vendor/gtest-1.7.0/msvc/gtest_prod_test.vcproj delete mode 100755 vendor/gtest-1.7.0/msvc/gtest_unittest-md.vcproj delete mode 100755 vendor/gtest-1.7.0/msvc/gtest_unittest.vcproj delete mode 100644 vendor/gtest-1.7.0/samples/.dirstamp delete mode 100755 vendor/gtest-1.7.0/scripts/fuse_gtest_files.py delete mode 100755 vendor/gtest-1.7.0/scripts/gen_gtest_pred_impl.py delete mode 100755 vendor/gtest-1.7.0/scripts/gtest-config.in delete mode 100755 vendor/gtest-1.7.0/scripts/pump.py delete mode 100644 vendor/gtest-1.7.0/scripts/test/Makefile delete mode 100644 vendor/gtest-1.7.0/src/.dirstamp delete mode 100644 vendor/gtest-1.7.0/src/gtest-port.cc delete mode 100644 vendor/gtest-1.7.0/src/gtest.cc delete mode 100644 vendor/gtest-1.7.0/test/.deps/gtest_all_test.Po delete mode 100644 vendor/gtest-1.7.0/test/gtest-linked_ptr_test.cc delete mode 100644 vendor/gtest-1.7.0/test/gtest-listener_test.cc delete mode 100644 vendor/gtest-1.7.0/test/gtest-tuple_test.cc delete mode 100644 vendor/gtest-1.7.0/test/gtest-typed-test_test.cc delete mode 100644 vendor/gtest-1.7.0/test/gtest-unittest-api_test.cc delete mode 100755 vendor/gtest-1.7.0/test/gtest_catch_exceptions_test.py delete mode 100755 vendor/gtest-1.7.0/test/gtest_xml_output_unittest.py delete mode 100644 vendor/gtest-1.7.0/xcode/Config/DebugProject.xcconfig delete mode 100644 vendor/gtest-1.7.0/xcode/Config/FrameworkTarget.xcconfig delete mode 100644 vendor/gtest-1.7.0/xcode/Config/General.xcconfig delete mode 100644 vendor/gtest-1.7.0/xcode/Config/ReleaseProject.xcconfig delete mode 100644 vendor/gtest-1.7.0/xcode/Config/StaticLibraryTarget.xcconfig delete mode 100644 vendor/gtest-1.7.0/xcode/Config/TestTarget.xcconfig delete mode 100644 vendor/gtest-1.7.0/xcode/Resources/Info.plist delete mode 100644 vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/Info.plist delete mode 100644 vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj delete mode 100644 vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.h delete mode 100755 vendor/gtest-1.7.0/xcode/Scripts/versiongenerate.py delete mode 100644 vendor/gtest-1.7.0/xcode/gtest.xcodeproj/project.pbxproj diff --git a/Makefile.am b/Makefile.am index f297443a..29b049e7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,12 +6,12 @@ BUILT_SOURCES = include/restclient-cpp/version.h test_program_SOURCES = vendor/jsoncpp-0.10.5/dist/jsoncpp.cpp test/tests.cpp test/test_helpers.cc test/test_restclient.cc test/test_connection.cc test_program_LDADD = .libs/librestclient-cpp.a -test_program_LDFLAGS=-Lvendor/gtest-1.7.0/lib/.libs -lgtest -test_program_CPPFLAGS=-std=c++11 -Iinclude -Ivendor/gtest-1.7.0/include -Ivendor/jsoncpp-0.10.5/dist +test_program_LDFLAGS=-Lvendor/googletest-1.14.0/lib -lgtest +test_program_CPPFLAGS=-std=c++14 -Iinclude -Ivendor/googletest-1.14.0/googletest/include -Ivendor/jsoncpp-0.10.5/dist lib_LTLIBRARIES=librestclient-cpp.la librestclient_cpp_la_SOURCES=source/restclient.cc source/connection.cc source/helpers.cc -librestclient_cpp_la_CXXFLAGS=-fPIC -std=c++11 +librestclient_cpp_la_CXXFLAGS=-fPIC -std=c++14 librestclient_cpp_la_LDFLAGS=-version-info 2:1:1 dist_doc_DATA = README.md @@ -19,8 +19,8 @@ dist_doc_DATA = README.md .PHONY: test check clean-coverage-files coverage-html include/restclient-cpp/version.h lint ci docker-services clean-docker-services include/restclient-cpp/version.h: - m4 -I ${top_srcdir}/m4 -DM4_RESTCLIENT_VERSION=$(PACKAGE_VERSION) version.h.m4 > ${top_srcdir}/$@ - + m4 -I ${top_srcdir}/m4 -DM4_RESTCLIENT_VERSION=$(PACKAGE_VERSION) version.h.m4 > ${top_srcdir}/$@ + test: check docker-services diff --git a/utils/build_gtest.sh b/utils/build_gtest.sh index f7912998..29582fbd 100755 --- a/utils/build_gtest.sh +++ b/utils/build_gtest.sh @@ -1,6 +1,4 @@ #!/bin/sh -cd vendor/gtest-1.7.0 -autoreconf -i -./configure - +cd vendor/googletest-1.14.0 +cmake . which -s gmake && gmake || make diff --git a/vendor/googletest-1.14.0/.clang-format b/vendor/googletest-1.14.0/.clang-format new file mode 100644 index 00000000..5b9bfe6d --- /dev/null +++ b/vendor/googletest-1.14.0/.clang-format @@ -0,0 +1,4 @@ +# Run manually to reformat a file: +# clang-format -i --style=file +Language: Cpp +BasedOnStyle: Google diff --git a/vendor/googletest-1.14.0/.github/ISSUE_TEMPLATE/00-bug_report.yml b/vendor/googletest-1.14.0/.github/ISSUE_TEMPLATE/00-bug_report.yml new file mode 100644 index 00000000..586779ad --- /dev/null +++ b/vendor/googletest-1.14.0/.github/ISSUE_TEMPLATE/00-bug_report.yml @@ -0,0 +1,53 @@ +name: Bug Report +description: Let us know that something does not work as expected. +title: "[Bug]: Please title this bug report" +body: + - type: textarea + id: what-happened + attributes: + label: Describe the issue + description: What happened, and what did you expect to happen? + validations: + required: true + - type: textarea + id: steps + attributes: + label: Steps to reproduce the problem + description: It is important that we are able to reproduce the problem that you are experiencing. Please provide all code and relevant steps to reproduce the problem, including your `BUILD`/`CMakeLists.txt` file and build commands. Links to a GitHub branch or [godbolt.org](https://godbolt.org/) that demonstrate the problem are also helpful. + validations: + required: true + - type: textarea + id: version + attributes: + label: What version of GoogleTest are you using? + description: Please include the output of `git rev-parse HEAD` or the GoogleTest release version number that you are using. + validations: + required: true + - type: textarea + id: os + attributes: + label: What operating system and version are you using? + description: If you are using a Linux distribution please include the name and version of the distribution as well. + validations: + required: true + - type: textarea + id: compiler + attributes: + label: What compiler and version are you using? + description: Please include the output of `gcc -v` or `clang -v`, or the equivalent for your compiler. + validations: + required: true + - type: textarea + id: buildsystem + attributes: + label: What build system are you using? + description: Please include the output of `bazel --version` or `cmake --version`, or the equivalent for your build system. + validations: + required: true + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any other context about the problem here. + validations: + required: false diff --git a/vendor/googletest-1.14.0/.github/ISSUE_TEMPLATE/10-feature_request.yml b/vendor/googletest-1.14.0/.github/ISSUE_TEMPLATE/10-feature_request.yml new file mode 100644 index 00000000..f3bbc091 --- /dev/null +++ b/vendor/googletest-1.14.0/.github/ISSUE_TEMPLATE/10-feature_request.yml @@ -0,0 +1,33 @@ +name: Feature request +description: Propose a new feature. +title: "[FR]: Please title this feature request" +labels: "enhancement" +body: + - type: textarea + id: version + attributes: + label: Does the feature exist in the most recent commit? + description: We recommend using the latest commit from GitHub in your projects. + validations: + required: true + - type: textarea + id: why + attributes: + label: Why do we need this feature? + description: Ideally, explain why a combination of existing features cannot be used instead. + validations: + required: true + - type: textarea + id: proposal + attributes: + label: Describe the proposal. + description: Include a detailed description of the feature, with usage examples. + validations: + required: true + - type: textarea + id: platform + attributes: + label: Is the feature specific to an operating system, compiler, or build system version? + description: If it is, please specify which versions. + validations: + required: true diff --git a/vendor/googletest-1.14.0/.github/ISSUE_TEMPLATE/config.yml b/vendor/googletest-1.14.0/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..65170d10 --- /dev/null +++ b/vendor/googletest-1.14.0/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Get Help + url: https://github.com/google/googletest/discussions + about: Please ask and answer questions here. diff --git a/vendor/googletest-1.14.0/.github/workflows/gtest-ci.yml b/vendor/googletest-1.14.0/.github/workflows/gtest-ci.yml new file mode 100644 index 00000000..03a8cc5e --- /dev/null +++ b/vendor/googletest-1.14.0/.github/workflows/gtest-ci.yml @@ -0,0 +1,43 @@ +name: ci + +on: + push: + pull_request: + +env: + BAZEL_CXXOPTS: -std=c++14 + +jobs: + Linux: + runs-on: ubuntu-latest + steps: + + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Tests + run: bazel test --cxxopt=-std=c++14 --features=external_include_paths --test_output=errors ... + + macOS: + runs-on: macos-latest + steps: + + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Tests + run: bazel test --cxxopt=-std=c++14 --features=external_include_paths --test_output=errors ... + + + Windows: + runs-on: windows-latest + steps: + + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Tests + run: bazel test --cxxopt=/std:c++14 --features=external_include_paths --test_output=errors ... diff --git a/vendor/googletest-1.14.0/.gitignore b/vendor/googletest-1.14.0/.gitignore new file mode 100644 index 00000000..fede02f6 --- /dev/null +++ b/vendor/googletest-1.14.0/.gitignore @@ -0,0 +1,88 @@ +# Ignore CI build directory +build/ +xcuserdata +cmake-build-debug/ +.idea/ +bazel-bin +bazel-genfiles +bazel-googletest +bazel-out +bazel-testlogs +# python +*.pyc + +# Visual Studio files +.vs +*.sdf +*.opensdf +*.VC.opendb +*.suo +*.user +_ReSharper.Caches/ +Win32-Debug/ +Win32-Release/ +x64-Debug/ +x64-Release/ + +# VSCode files +.cache/ +cmake-variants.yaml + +# Ignore autoconf / automake files +Makefile.in +aclocal.m4 +configure +build-aux/ +autom4te.cache/ +googletest/m4/libtool.m4 +googletest/m4/ltoptions.m4 +googletest/m4/ltsugar.m4 +googletest/m4/ltversion.m4 +googletest/m4/lt~obsolete.m4 +googlemock/m4 + +# Ignore generated directories. +googlemock/fused-src/ +googletest/fused-src/ + +# macOS files +.DS_Store +googletest/.DS_Store +googletest/xcode/.DS_Store + +# Ignore cmake generated directories and files. +CMakeFiles +CTestTestfile.cmake +Makefile +cmake_install.cmake +googlemock/CMakeFiles +googlemock/CTestTestfile.cmake +googlemock/Makefile +googlemock/cmake_install.cmake +googlemock/gtest +/bin +/googlemock/gmock.dir +/googlemock/gmock_main.dir +/googlemock/RUN_TESTS.vcxproj.filters +/googlemock/RUN_TESTS.vcxproj +/googlemock/INSTALL.vcxproj.filters +/googlemock/INSTALL.vcxproj +/googlemock/gmock_main.vcxproj.filters +/googlemock/gmock_main.vcxproj +/googlemock/gmock.vcxproj.filters +/googlemock/gmock.vcxproj +/googlemock/gmock.sln +/googlemock/ALL_BUILD.vcxproj.filters +/googlemock/ALL_BUILD.vcxproj +/lib +/Win32 +/ZERO_CHECK.vcxproj.filters +/ZERO_CHECK.vcxproj +/RUN_TESTS.vcxproj.filters +/RUN_TESTS.vcxproj +/INSTALL.vcxproj.filters +/INSTALL.vcxproj +/googletest-distribution.sln +/CMakeCache.txt +/ALL_BUILD.vcxproj.filters +/ALL_BUILD.vcxproj diff --git a/vendor/googletest-1.14.0/BUILD.bazel b/vendor/googletest-1.14.0/BUILD.bazel new file mode 100644 index 00000000..b1e3b7fb --- /dev/null +++ b/vendor/googletest-1.14.0/BUILD.bazel @@ -0,0 +1,219 @@ +# Copyright 2017 Google Inc. +# All Rights Reserved. +# +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Bazel Build for Google C++ Testing Framework(Google Test) + +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +exports_files(["LICENSE"]) + +config_setting( + name = "qnx", + constraint_values = ["@platforms//os:qnx"], +) + +config_setting( + name = "windows", + constraint_values = ["@platforms//os:windows"], +) + +config_setting( + name = "freebsd", + constraint_values = ["@platforms//os:freebsd"], +) + +config_setting( + name = "openbsd", + constraint_values = ["@platforms//os:openbsd"], +) + +config_setting( + name = "msvc_compiler", + flag_values = { + "@bazel_tools//tools/cpp:compiler": "msvc-cl", + }, + visibility = [":__subpackages__"], +) + +config_setting( + name = "has_absl", + values = {"define": "absl=1"}, +) + +# Library that defines the FRIEND_TEST macro. +cc_library( + name = "gtest_prod", + hdrs = ["googletest/include/gtest/gtest_prod.h"], + includes = ["googletest/include"], +) + +# Google Test including Google Mock +cc_library( + name = "gtest", + srcs = glob( + include = [ + "googletest/src/*.cc", + "googletest/src/*.h", + "googletest/include/gtest/**/*.h", + "googlemock/src/*.cc", + "googlemock/include/gmock/**/*.h", + ], + exclude = [ + "googletest/src/gtest-all.cc", + "googletest/src/gtest_main.cc", + "googlemock/src/gmock-all.cc", + "googlemock/src/gmock_main.cc", + ], + ), + hdrs = glob([ + "googletest/include/gtest/*.h", + "googlemock/include/gmock/*.h", + ]), + copts = select({ + ":qnx": [], + ":windows": [], + "//conditions:default": ["-pthread"], + }), + defines = select({ + ":has_absl": ["GTEST_HAS_ABSL=1"], + "//conditions:default": [], + }), + features = select({ + ":windows": ["windows_export_all_symbols"], + "//conditions:default": [], + }), + includes = [ + "googlemock", + "googlemock/include", + "googletest", + "googletest/include", + ], + linkopts = select({ + ":qnx": ["-lregex"], + ":windows": [], + ":freebsd": [ + "-lm", + "-pthread", + ], + ":openbsd": [ + "-lm", + "-pthread", + ], + "//conditions:default": ["-pthread"], + }), + deps = select({ + ":has_absl": [ + "@com_google_absl//absl/container:flat_hash_set", + "@com_google_absl//absl/debugging:failure_signal_handler", + "@com_google_absl//absl/debugging:stacktrace", + "@com_google_absl//absl/debugging:symbolize", + "@com_google_absl//absl/flags:flag", + "@com_google_absl//absl/flags:parse", + "@com_google_absl//absl/flags:reflection", + "@com_google_absl//absl/flags:usage", + "@com_google_absl//absl/strings", + "@com_google_absl//absl/types:any", + "@com_google_absl//absl/types:optional", + "@com_google_absl//absl/types:variant", + "@com_googlesource_code_re2//:re2", + ], + "//conditions:default": [], + }), +) + +cc_library( + name = "gtest_main", + srcs = ["googlemock/src/gmock_main.cc"], + features = select({ + ":windows": ["windows_export_all_symbols"], + "//conditions:default": [], + }), + deps = [":gtest"], +) + +# The following rules build samples of how to use gTest. +cc_library( + name = "gtest_sample_lib", + srcs = [ + "googletest/samples/sample1.cc", + "googletest/samples/sample2.cc", + "googletest/samples/sample4.cc", + ], + hdrs = [ + "googletest/samples/prime_tables.h", + "googletest/samples/sample1.h", + "googletest/samples/sample2.h", + "googletest/samples/sample3-inl.h", + "googletest/samples/sample4.h", + ], + features = select({ + ":windows": ["windows_export_all_symbols"], + "//conditions:default": [], + }), +) + +cc_test( + name = "gtest_samples", + size = "small", + # All Samples except: + # sample9 (main) + # sample10 (main and takes a command line option and needs to be separate) + srcs = [ + "googletest/samples/sample1_unittest.cc", + "googletest/samples/sample2_unittest.cc", + "googletest/samples/sample3_unittest.cc", + "googletest/samples/sample4_unittest.cc", + "googletest/samples/sample5_unittest.cc", + "googletest/samples/sample6_unittest.cc", + "googletest/samples/sample7_unittest.cc", + "googletest/samples/sample8_unittest.cc", + ], + linkstatic = 0, + deps = [ + "gtest_sample_lib", + ":gtest_main", + ], +) + +cc_test( + name = "sample9_unittest", + size = "small", + srcs = ["googletest/samples/sample9_unittest.cc"], + deps = [":gtest"], +) + +cc_test( + name = "sample10_unittest", + size = "small", + srcs = ["googletest/samples/sample10_unittest.cc"], + deps = [":gtest"], +) diff --git a/vendor/googletest-1.14.0/CMakeLists.txt b/vendor/googletest-1.14.0/CMakeLists.txt new file mode 100644 index 00000000..089ac987 --- /dev/null +++ b/vendor/googletest-1.14.0/CMakeLists.txt @@ -0,0 +1,27 @@ +# Note: CMake support is community-based. The maintainers do not use CMake +# internally. + +cmake_minimum_required(VERSION 3.13) + +project(googletest-distribution) +set(GOOGLETEST_VERSION 1.14.0) + +if(NOT CYGWIN AND NOT MSYS AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL QNX) + set(CMAKE_CXX_EXTENSIONS OFF) +endif() + +enable_testing() + +include(CMakeDependentOption) +include(GNUInstallDirs) + +#Note that googlemock target already builds googletest +option(BUILD_GMOCK "Builds the googlemock subproject" ON) +option(INSTALL_GTEST "Enable installation of googletest. (Projects embedding googletest may want to turn this OFF.)" ON) +option(GTEST_HAS_ABSL "Use Abseil and RE2. Requires Abseil and RE2 to be separately added to the build." OFF) + +if(BUILD_GMOCK) + add_subdirectory( googlemock ) +else() + add_subdirectory( googletest ) +endif() diff --git a/vendor/googletest-1.14.0/CONTRIBUTING.md b/vendor/googletest-1.14.0/CONTRIBUTING.md new file mode 100644 index 00000000..8bed14b2 --- /dev/null +++ b/vendor/googletest-1.14.0/CONTRIBUTING.md @@ -0,0 +1,141 @@ +# How to become a contributor and submit your own code + +## Contributor License Agreements + +We'd love to accept your patches! Before we can take them, we have to jump a +couple of legal hurdles. + +Please fill out either the individual or corporate Contributor License Agreement +(CLA). + +* If you are an individual writing original source code and you're sure you + own the intellectual property, then you'll need to sign an + [individual CLA](https://developers.google.com/open-source/cla/individual). +* If you work for a company that wants to allow you to contribute your work, + then you'll need to sign a + [corporate CLA](https://developers.google.com/open-source/cla/corporate). + +Follow either of the two links above to access the appropriate CLA and +instructions for how to sign and return it. Once we receive it, we'll be able to +accept your pull requests. + +## Are you a Googler? + +If you are a Googler, please make an attempt to submit an internal contribution +rather than a GitHub Pull Request. If you are not able to submit internally, a +PR is acceptable as an alternative. + +## Contributing A Patch + +1. Submit an issue describing your proposed change to the + [issue tracker](https://github.com/google/googletest/issues). +2. Please don't mix more than one logical change per submittal, because it + makes the history hard to follow. If you want to make a change that doesn't + have a corresponding issue in the issue tracker, please create one. +3. Also, coordinate with team members that are listed on the issue in question. + This ensures that work isn't being duplicated and communicating your plan + early also generally leads to better patches. +4. If your proposed change is accepted, and you haven't already done so, sign a + Contributor License Agreement + ([see details above](#contributor-license-agreements)). +5. Fork the desired repo, develop and test your code changes. +6. Ensure that your code adheres to the existing style in the sample to which + you are contributing. +7. Ensure that your code has an appropriate set of unit tests which all pass. +8. Submit a pull request. + +## The Google Test and Google Mock Communities + +The Google Test community exists primarily through the +[discussion group](http://groups.google.com/group/googletestframework) and the +GitHub repository. Likewise, the Google Mock community exists primarily through +their own [discussion group](http://groups.google.com/group/googlemock). You are +definitely encouraged to contribute to the discussion and you can also help us +to keep the effectiveness of the group high by following and promoting the +guidelines listed here. + +### Please Be Friendly + +Showing courtesy and respect to others is a vital part of the Google culture, +and we strongly encourage everyone participating in Google Test development to +join us in accepting nothing less. Of course, being courteous is not the same as +failing to constructively disagree with each other, but it does mean that we +should be respectful of each other when enumerating the 42 technical reasons +that a particular proposal may not be the best choice. There's never a reason to +be antagonistic or dismissive toward anyone who is sincerely trying to +contribute to a discussion. + +Sure, C++ testing is serious business and all that, but it's also a lot of fun. +Let's keep it that way. Let's strive to be one of the friendliest communities in +all of open source. + +As always, discuss Google Test in the official GoogleTest discussion group. You +don't have to actually submit code in order to sign up. Your participation +itself is a valuable contribution. + +## Style + +To keep the source consistent, readable, diffable and easy to merge, we use a +fairly rigid coding style, as defined by the +[google-styleguide](https://github.com/google/styleguide) project. All patches +will be expected to conform to the style outlined +[here](https://google.github.io/styleguide/cppguide.html). Use +[.clang-format](https://github.com/google/googletest/blob/main/.clang-format) to +check your formatting. + +## Requirements for Contributors + +If you plan to contribute a patch, you need to build Google Test, Google Mock, +and their own tests from a git checkout, which has further requirements: + +* [Python](https://www.python.org/) v3.6 or newer (for running some of the + tests and re-generating certain source files from templates) +* [CMake](https://cmake.org/) v2.8.12 or newer + +## Developing Google Test and Google Mock + +This section discusses how to make your own changes to the Google Test project. + +### Testing Google Test and Google Mock Themselves + +To make sure your changes work as intended and don't break existing +functionality, you'll want to compile and run Google Test and GoogleMock's own +tests. For that you can use CMake: + +``` +mkdir mybuild +cd mybuild +cmake -Dgtest_build_tests=ON -Dgmock_build_tests=ON ${GTEST_REPO_DIR} +``` + +To choose between building only Google Test or Google Mock, you may modify your +cmake command to be one of each + +``` +cmake -Dgtest_build_tests=ON ${GTEST_DIR} # sets up Google Test tests +cmake -Dgmock_build_tests=ON ${GMOCK_DIR} # sets up Google Mock tests +``` + +Make sure you have Python installed, as some of Google Test's tests are written +in Python. If the cmake command complains about not being able to find Python +(`Could NOT find PythonInterp (missing: PYTHON_EXECUTABLE)`), try telling it +explicitly where your Python executable can be found: + +``` +cmake -DPYTHON_EXECUTABLE=path/to/python ... +``` + +Next, you can build Google Test and / or Google Mock and all desired tests. On +\*nix, this is usually done by + +``` +make +``` + +To run the tests, do + +``` +make test +``` + +All tests should pass. diff --git a/vendor/gtest-1.7.0/CONTRIBUTORS b/vendor/googletest-1.14.0/CONTRIBUTORS similarity index 60% rename from vendor/gtest-1.7.0/CONTRIBUTORS rename to vendor/googletest-1.14.0/CONTRIBUTORS index feae2fc0..77397a5b 100644 --- a/vendor/gtest-1.7.0/CONTRIBUTORS +++ b/vendor/googletest-1.14.0/CONTRIBUTORS @@ -5,33 +5,61 @@ Ajay Joshi Balázs Dán +Benoit Sigoure Bharat Mediratta +Bogdan Piloca Chandler Carruth Chris Prince Chris Taylor Dan Egnor +Dave MacLachlan +David Anderson +Dean Sturtevant Eric Roman +Gene Volovich Hady Zalek +Hal Burch Jeffrey Yasskin +Jim Keller +Joe Walnes +Jon Wray Jói Sigurðsson Keir Mierle Keith Ray Kenton Varda +Kostya Serebryany +Krystian Kuzniarek +Lev Makhlis Manuel Klimek +Mario Tanev +Mark Paskin Markus Heule +Martijn Vels +Matthew Simmons Mika Raento +Mike Bland Miklós Fazekas +Neal Norwitz +Nermin Ozkiranartli +Owen Carlsen +Paneendra Ba Pasi Valminen Patrick Hanna Patrick Riley +Paul Menage Peter Kaminski +Piotr Kaminski Preston Jackson Rainer Klaffenboeck Russ Cox Russ Rufer Sean Mcafee Sigurður Ásgeirsson +Sverre Sundsdal +Szymon Sobik +Takeshi Yoshino Tracy Bialik Vadim Berman Vlad Losev +Wolfgang Klier Zhanyong Wan diff --git a/vendor/gtest-1.7.0/LICENSE b/vendor/googletest-1.14.0/LICENSE similarity index 100% rename from vendor/gtest-1.7.0/LICENSE rename to vendor/googletest-1.14.0/LICENSE diff --git a/vendor/googletest-1.14.0/README.md b/vendor/googletest-1.14.0/README.md new file mode 100644 index 00000000..443e0206 --- /dev/null +++ b/vendor/googletest-1.14.0/README.md @@ -0,0 +1,146 @@ +# GoogleTest + +### Announcements + +#### Live at Head + +GoogleTest now follows the +[Abseil Live at Head philosophy](https://abseil.io/about/philosophy#upgrade-support). +We recommend +[updating to the latest commit in the `main` branch as often as possible](https://github.com/abseil/abseil-cpp/blob/master/FAQ.md#what-is-live-at-head-and-how-do-i-do-it). +We do publish occasional semantic versions, tagged with +`v${major}.${minor}.${patch}` (e.g. `v1.13.0`). + +#### Documentation Updates + +Our documentation is now live on GitHub Pages at +https://google.github.io/googletest/. We recommend browsing the documentation on +GitHub Pages rather than directly in the repository. + +#### Release 1.13.0 + +[Release 1.13.0](https://github.com/google/googletest/releases/tag/v1.13.0) is +now available. + +The 1.13.x branch requires at least C++14. + +#### Continuous Integration + +We use Google's internal systems for continuous integration. \ +GitHub Actions were added for the convenience of open-source contributors. They +are exclusively maintained by the open-source community and not used by the +GoogleTest team. + +#### Coming Soon + +* We are planning to take a dependency on + [Abseil](https://github.com/abseil/abseil-cpp). +* More documentation improvements are planned. + +## Welcome to **GoogleTest**, Google's C++ test framework! + +This repository is a merger of the formerly separate GoogleTest and GoogleMock +projects. These were so closely related that it makes sense to maintain and +release them together. + +### Getting Started + +See the [GoogleTest User's Guide](https://google.github.io/googletest/) for +documentation. We recommend starting with the +[GoogleTest Primer](https://google.github.io/googletest/primer.html). + +More information about building GoogleTest can be found at +[googletest/README.md](googletest/README.md). + +## Features + +* xUnit test framework: \ + Googletest is based on the [xUnit](https://en.wikipedia.org/wiki/XUnit) + testing framework, a popular architecture for unit testing +* Test discovery: \ + Googletest automatically discovers and runs your tests, eliminating the need + to manually register your tests +* Rich set of assertions: \ + Googletest provides a variety of assertions, such as equality, inequality, + exceptions, and more, making it easy to test your code +* User-defined assertions: \ + You can define your own assertions with Googletest, making it simple to + write tests that are specific to your code +* Death tests: \ + Googletest supports death tests, which verify that your code exits in a + certain way, making it useful for testing error-handling code +* Fatal and non-fatal failures: \ + You can specify whether a test failure should be treated as fatal or + non-fatal with Googletest, allowing tests to continue running even if a + failure occurs +* Value-parameterized tests: \ + Googletest supports value-parameterized tests, which run multiple times with + different input values, making it useful for testing functions that take + different inputs +* Type-parameterized tests: \ + Googletest also supports type-parameterized tests, which run with different + data types, making it useful for testing functions that work with different + data types +* Various options for running tests: \ + Googletest provides many options for running tests including running + individual tests, running tests in a specific order and running tests in + parallel + +## Supported Platforms + +GoogleTest follows Google's +[Foundational C++ Support Policy](https://opensource.google/documentation/policies/cplusplus-support). +See +[this table](https://github.com/google/oss-policies-info/blob/main/foundational-cxx-support-matrix.md) +for a list of currently supported versions of compilers, platforms, and build +tools. + +## Who Is Using GoogleTest? + +In addition to many internal projects at Google, GoogleTest is also used by the +following notable projects: + +* The [Chromium projects](http://www.chromium.org/) (behind the Chrome browser + and Chrome OS). +* The [LLVM](http://llvm.org/) compiler. +* [Protocol Buffers](https://github.com/google/protobuf), Google's data + interchange format. +* The [OpenCV](http://opencv.org/) computer vision library. + +## Related Open Source Projects + +[GTest Runner](https://github.com/nholthaus/gtest-runner) is a Qt5 based +automated test-runner and Graphical User Interface with powerful features for +Windows and Linux platforms. + +[GoogleTest UI](https://github.com/ospector/gtest-gbar) is a test runner that +runs your test binary, allows you to track its progress via a progress bar, and +displays a list of test failures. Clicking on one shows failure text. GoogleTest +UI is written in C#. + +[GTest TAP Listener](https://github.com/kinow/gtest-tap-listener) is an event +listener for GoogleTest that implements the +[TAP protocol](https://en.wikipedia.org/wiki/Test_Anything_Protocol) for test +result output. If your test runner understands TAP, you may find it useful. + +[gtest-parallel](https://github.com/google/gtest-parallel) is a test runner that +runs tests from your binary in parallel to provide significant speed-up. + +[GoogleTest Adapter](https://marketplace.visualstudio.com/items?itemName=DavidSchuldenfrei.gtest-adapter) +is a VS Code extension allowing to view GoogleTest in a tree view and run/debug +your tests. + +[C++ TestMate](https://github.com/matepek/vscode-catch2-test-adapter) is a VS +Code extension allowing to view GoogleTest in a tree view and run/debug your +tests. + +[Cornichon](https://pypi.org/project/cornichon/) is a small Gherkin DSL parser +that generates stub code for GoogleTest. + +## Contributing Changes + +Please read +[`CONTRIBUTING.md`](https://github.com/google/googletest/blob/main/CONTRIBUTING.md) +for details on how to contribute to this project. + +Happy testing! diff --git a/vendor/googletest-1.14.0/WORKSPACE b/vendor/googletest-1.14.0/WORKSPACE new file mode 100644 index 00000000..f819ffe6 --- /dev/null +++ b/vendor/googletest-1.14.0/WORKSPACE @@ -0,0 +1,27 @@ +workspace(name = "com_google_googletest") + +load("//:googletest_deps.bzl", "googletest_deps") +googletest_deps() + +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "rules_python", # 2023-07-31T20:39:27Z + sha256 = "1250b59a33c591a1c4ba68c62e95fc88a84c334ec35a2e23f46cbc1b9a5a8b55", + strip_prefix = "rules_python-e355becc30275939d87116a4ec83dad4bb50d9e1", + urls = ["https://github.com/bazelbuild/rules_python/archive/e355becc30275939d87116a4ec83dad4bb50d9e1.zip"], +) + +http_archive( + name = "bazel_skylib", # 2023-05-31T19:24:07Z + sha256 = "08c0386f45821ce246bbbf77503c973246ed6ee5c3463e41efc197fa9bc3a7f4", + strip_prefix = "bazel-skylib-288731ef9f7f688932bd50e704a91a45ec185f9b", + urls = ["https://github.com/bazelbuild/bazel-skylib/archive/288731ef9f7f688932bd50e704a91a45ec185f9b.zip"], +) + +http_archive( + name = "platforms", # 2023-07-28T19:44:27Z + sha256 = "40eb313613ff00a5c03eed20aba58890046f4d38dec7344f00bb9a8867853526", + strip_prefix = "platforms-4ad40ef271da8176d4fc0194d2089b8a76e19d7b", + urls = ["https://github.com/bazelbuild/platforms/archive/4ad40ef271da8176d4fc0194d2089b8a76e19d7b.zip"], +) diff --git a/vendor/googletest-1.14.0/ci/linux-presubmit.sh b/vendor/googletest-1.14.0/ci/linux-presubmit.sh new file mode 100644 index 00000000..6bac8878 --- /dev/null +++ b/vendor/googletest-1.14.0/ci/linux-presubmit.sh @@ -0,0 +1,137 @@ +#!/bin/bash +# +# Copyright 2020, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +set -euox pipefail + +readonly LINUX_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20230217" +readonly LINUX_GCC_FLOOR_CONTAINER="gcr.io/google.com/absl-177019/linux_gcc-floor:20230120" + +if [[ -z ${GTEST_ROOT:-} ]]; then + GTEST_ROOT="$(realpath $(dirname ${0})/..)" +fi + +if [[ -z ${STD:-} ]]; then + STD="c++14 c++17 c++20" +fi + +# Test the CMake build +for cc in /usr/local/bin/gcc /opt/llvm/clang/bin/clang; do + for cmake_off_on in OFF ON; do + time docker run \ + --volume="${GTEST_ROOT}:/src:ro" \ + --tmpfs="/build:exec" \ + --workdir="/build" \ + --rm \ + --env="CC=${cc}" \ + --env=CXXFLAGS="-Werror -Wdeprecated" \ + ${LINUX_LATEST_CONTAINER} \ + /bin/bash -c " + cmake /src \ + -DCMAKE_CXX_STANDARD=14 \ + -Dgtest_build_samples=ON \ + -Dgtest_build_tests=ON \ + -Dgmock_build_tests=ON \ + -Dcxx_no_exception=${cmake_off_on} \ + -Dcxx_no_rtti=${cmake_off_on} && \ + make -j$(nproc) && \ + ctest -j$(nproc) --output-on-failure" + done +done + +# Do one test with an older version of GCC +time docker run \ + --volume="${GTEST_ROOT}:/src:ro" \ + --workdir="/src" \ + --rm \ + --env="CC=/usr/local/bin/gcc" \ + --env="BAZEL_CXXOPTS=-std=c++14" \ + ${LINUX_GCC_FLOOR_CONTAINER} \ + /usr/local/bin/bazel test ... \ + --copt="-Wall" \ + --copt="-Werror" \ + --copt="-Wuninitialized" \ + --copt="-Wundef" \ + --copt="-Wno-error=pragmas" \ + --distdir="/bazel-distdir" \ + --features=external_include_paths \ + --keep_going \ + --show_timestamps \ + --test_output=errors + +# Test GCC +for std in ${STD}; do + for absl in 0 1; do + time docker run \ + --volume="${GTEST_ROOT}:/src:ro" \ + --workdir="/src" \ + --rm \ + --env="CC=/usr/local/bin/gcc" \ + --env="BAZEL_CXXOPTS=-std=${std}" \ + ${LINUX_LATEST_CONTAINER} \ + /usr/local/bin/bazel test ... \ + --copt="-Wall" \ + --copt="-Werror" \ + --copt="-Wuninitialized" \ + --copt="-Wundef" \ + --define="absl=${absl}" \ + --distdir="/bazel-distdir" \ + --features=external_include_paths \ + --keep_going \ + --show_timestamps \ + --test_output=errors + done +done + +# Test Clang +for std in ${STD}; do + for absl in 0 1; do + time docker run \ + --volume="${GTEST_ROOT}:/src:ro" \ + --workdir="/src" \ + --rm \ + --env="CC=/opt/llvm/clang/bin/clang" \ + --env="BAZEL_CXXOPTS=-std=${std}" \ + ${LINUX_LATEST_CONTAINER} \ + /usr/local/bin/bazel test ... \ + --copt="--gcc-toolchain=/usr/local" \ + --copt="-Wall" \ + --copt="-Werror" \ + --copt="-Wuninitialized" \ + --copt="-Wundef" \ + --define="absl=${absl}" \ + --distdir="/bazel-distdir" \ + --features=external_include_paths \ + --keep_going \ + --linkopt="--gcc-toolchain=/usr/local" \ + --show_timestamps \ + --test_output=errors + done +done diff --git a/vendor/googletest-1.14.0/ci/macos-presubmit.sh b/vendor/googletest-1.14.0/ci/macos-presubmit.sh new file mode 100644 index 00000000..681ebc2a --- /dev/null +++ b/vendor/googletest-1.14.0/ci/macos-presubmit.sh @@ -0,0 +1,76 @@ +#!/bin/bash +# +# Copyright 2020, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +set -euox pipefail + +if [[ -z ${GTEST_ROOT:-} ]]; then + GTEST_ROOT="$(realpath $(dirname ${0})/..)" +fi + +# Test the CMake build +for cmake_off_on in OFF ON; do + BUILD_DIR=$(mktemp -d build_dir.XXXXXXXX) + cd ${BUILD_DIR} + time cmake ${GTEST_ROOT} \ + -DCMAKE_CXX_STANDARD=14 \ + -Dgtest_build_samples=ON \ + -Dgtest_build_tests=ON \ + -Dgmock_build_tests=ON \ + -Dcxx_no_exception=${cmake_off_on} \ + -Dcxx_no_rtti=${cmake_off_on} + time make + time ctest -j$(nproc) --output-on-failure +done + +# Test the Bazel build + +# If we are running on Kokoro, check for a versioned Bazel binary. +KOKORO_GFILE_BAZEL_BIN="bazel-5.1.1-darwin-x86_64" +if [[ ${KOKORO_GFILE_DIR:-} ]] && [[ -f ${KOKORO_GFILE_DIR}/${KOKORO_GFILE_BAZEL_BIN} ]]; then + BAZEL_BIN="${KOKORO_GFILE_DIR}/${KOKORO_GFILE_BAZEL_BIN}" + chmod +x ${BAZEL_BIN} +else + BAZEL_BIN="bazel" +fi + +cd ${GTEST_ROOT} +for absl in 0 1; do + ${BAZEL_BIN} test ... \ + --copt="-Wall" \ + --copt="-Werror" \ + --copt="-Wundef" \ + --cxxopt="-std=c++14" \ + --define="absl=${absl}" \ + --features=external_include_paths \ + --keep_going \ + --show_timestamps \ + --test_output=errors +done diff --git a/vendor/googletest-1.14.0/ci/windows-presubmit.bat b/vendor/googletest-1.14.0/ci/windows-presubmit.bat new file mode 100644 index 00000000..48962eb9 --- /dev/null +++ b/vendor/googletest-1.14.0/ci/windows-presubmit.bat @@ -0,0 +1,58 @@ +SETLOCAL ENABLEDELAYEDEXPANSION + +SET BAZEL_EXE=%KOKORO_GFILE_DIR%\bazel-5.1.1-windows-x86_64.exe + +SET PATH=C:\Python34;%PATH% +SET BAZEL_PYTHON=C:\python34\python.exe +SET BAZEL_SH=C:\tools\msys64\usr\bin\bash.exe +SET CMAKE_BIN="cmake.exe" +SET CTEST_BIN="ctest.exe" +SET CTEST_OUTPUT_ON_FAILURE=1 +SET CMAKE_BUILD_PARALLEL_LEVEL=16 +SET CTEST_PARALLEL_LEVEL=16 + +IF EXIST git\googletest ( + CD git\googletest +) ELSE IF EXIST github\googletest ( + CD github\googletest +) + +IF %errorlevel% neq 0 EXIT /B 1 + +:: ---------------------------------------------------------------------------- +:: CMake +MKDIR cmake_msvc2022 +CD cmake_msvc2022 + +%CMAKE_BIN% .. ^ + -G "Visual Studio 17 2022" ^ + -DPYTHON_EXECUTABLE:FILEPATH=c:\python37\python.exe ^ + -DPYTHON_INCLUDE_DIR:PATH=c:\python37\include ^ + -DPYTHON_LIBRARY:FILEPATH=c:\python37\lib\site-packages\pip ^ + -Dgtest_build_samples=ON ^ + -Dgtest_build_tests=ON ^ + -Dgmock_build_tests=ON +IF %errorlevel% neq 0 EXIT /B 1 + +%CMAKE_BIN% --build . --target ALL_BUILD --config Debug -- -maxcpucount +IF %errorlevel% neq 0 EXIT /B 1 + +%CTEST_BIN% -C Debug --timeout 600 +IF %errorlevel% neq 0 EXIT /B 1 + +CD .. +RMDIR /S /Q cmake_msvc2022 + +:: ---------------------------------------------------------------------------- +:: Bazel + +SET BAZEL_VS=C:\Program Files\Microsoft Visual Studio\2022\Community +%BAZEL_EXE% test ... ^ + --compilation_mode=dbg ^ + --copt=/std:c++14 ^ + --copt=/WX ^ + --features=external_include_paths ^ + --keep_going ^ + --test_output=errors ^ + --test_tag_filters=-no_test_msvc2017 +IF %errorlevel% neq 0 EXIT /B 1 diff --git a/vendor/googletest-1.14.0/docs/_config.yml b/vendor/googletest-1.14.0/docs/_config.yml new file mode 100644 index 00000000..d12867ea --- /dev/null +++ b/vendor/googletest-1.14.0/docs/_config.yml @@ -0,0 +1 @@ +title: GoogleTest diff --git a/vendor/googletest-1.14.0/docs/_data/navigation.yml b/vendor/googletest-1.14.0/docs/_data/navigation.yml new file mode 100644 index 00000000..9f333270 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/_data/navigation.yml @@ -0,0 +1,43 @@ +nav: +- section: "Get Started" + items: + - title: "Supported Platforms" + url: "/platforms.html" + - title: "Quickstart: Bazel" + url: "/quickstart-bazel.html" + - title: "Quickstart: CMake" + url: "/quickstart-cmake.html" +- section: "Guides" + items: + - title: "GoogleTest Primer" + url: "/primer.html" + - title: "Advanced Topics" + url: "/advanced.html" + - title: "Mocking for Dummies" + url: "/gmock_for_dummies.html" + - title: "Mocking Cookbook" + url: "/gmock_cook_book.html" + - title: "Mocking Cheat Sheet" + url: "/gmock_cheat_sheet.html" +- section: "References" + items: + - title: "Testing Reference" + url: "/reference/testing.html" + - title: "Mocking Reference" + url: "/reference/mocking.html" + - title: "Assertions" + url: "/reference/assertions.html" + - title: "Matchers" + url: "/reference/matchers.html" + - title: "Actions" + url: "/reference/actions.html" + - title: "Testing FAQ" + url: "/faq.html" + - title: "Mocking FAQ" + url: "/gmock_faq.html" + - title: "Code Samples" + url: "/samples.html" + - title: "Using pkg-config" + url: "/pkgconfig.html" + - title: "Community Documentation" + url: "/community_created_documentation.html" diff --git a/vendor/googletest-1.14.0/docs/_layouts/default.html b/vendor/googletest-1.14.0/docs/_layouts/default.html new file mode 100644 index 00000000..c7f331b8 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/_layouts/default.html @@ -0,0 +1,58 @@ + + + + + + + +{% seo %} + + + + + + +
        +
        + {{ content }} +
        + +
        + + + + diff --git a/vendor/googletest-1.14.0/docs/_sass/main.scss b/vendor/googletest-1.14.0/docs/_sass/main.scss new file mode 100644 index 00000000..92edc877 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/_sass/main.scss @@ -0,0 +1,200 @@ +// Styles for GoogleTest docs website on GitHub Pages. +// Color variables are defined in +// https://github.com/pages-themes/primer/tree/master/_sass/primer-support/lib/variables + +$sidebar-width: 260px; + +body { + display: flex; + margin: 0; +} + +.sidebar { + background: $black; + color: $text-white; + flex-shrink: 0; + height: 100vh; + overflow: auto; + position: sticky; + top: 0; + width: $sidebar-width; +} + +.sidebar h1 { + font-size: 1.5em; +} + +.sidebar h2 { + color: $gray-light; + font-size: 0.8em; + font-weight: normal; + margin-bottom: 0.8em; + padding-left: 2.5em; + text-transform: uppercase; +} + +.sidebar .header { + background: $black; + padding: 2em; + position: sticky; + top: 0; + width: 100%; +} + +.sidebar .header a { + color: $text-white; + text-decoration: none; +} + +.sidebar .nav-toggle { + display: none; +} + +.sidebar .expander { + cursor: pointer; + display: none; + height: 3em; + position: absolute; + right: 1em; + top: 1.5em; + width: 3em; +} + +.sidebar .expander .arrow { + border: solid $white; + border-width: 0 3px 3px 0; + display: block; + height: 0.7em; + margin: 1em auto; + transform: rotate(45deg); + transition: transform 0.5s; + width: 0.7em; +} + +.sidebar nav { + width: 100%; +} + +.sidebar nav ul { + list-style-type: none; + margin-bottom: 1em; + padding: 0; + + &:last-child { + margin-bottom: 2em; + } + + a { + text-decoration: none; + } + + li { + color: $text-white; + padding-left: 2em; + text-decoration: none; + } + + li.active { + background: $border-gray-darker; + font-weight: bold; + } + + li:hover { + background: $border-gray-darker; + } +} + +.main { + background-color: $bg-gray; + width: calc(100% - #{$sidebar-width}); +} + +.main .main-inner { + background-color: $white; + padding: 2em; +} + +.main .footer { + margin: 0; + padding: 2em; +} + +.main table th { + text-align: left; +} + +.main .callout { + border-left: 0.25em solid $white; + padding: 1em; + + a { + text-decoration: underline; + } + + &.important { + background-color: $bg-yellow-light; + border-color: $bg-yellow; + color: $black; + } + + &.note { + background-color: $bg-blue-light; + border-color: $text-blue; + color: $text-blue; + } + + &.tip { + background-color: $green-000; + border-color: $green-700; + color: $green-700; + } + + &.warning { + background-color: $red-000; + border-color: $text-red; + color: $text-red; + } +} + +.main .good pre { + background-color: $bg-green-light; +} + +.main .bad pre { + background-color: $red-000; +} + +@media all and (max-width: 768px) { + body { + flex-direction: column; + } + + .sidebar { + height: auto; + position: relative; + width: 100%; + } + + .sidebar .expander { + display: block; + } + + .sidebar nav { + height: 0; + overflow: hidden; + } + + .sidebar .nav-toggle:checked { + & ~ nav { + height: auto; + } + + & + .expander .arrow { + transform: rotate(-135deg); + } + } + + .main { + width: 100%; + } +} diff --git a/vendor/googletest-1.14.0/docs/advanced.md b/vendor/googletest-1.14.0/docs/advanced.md new file mode 100644 index 00000000..3871db13 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/advanced.md @@ -0,0 +1,2436 @@ +# Advanced GoogleTest Topics + +## Introduction + +Now that you have read the [GoogleTest Primer](primer.md) and learned how to +write tests using GoogleTest, it's time to learn some new tricks. This document +will show you more assertions as well as how to construct complex failure +messages, propagate fatal failures, reuse and speed up your test fixtures, and +use various flags with your tests. + +## More Assertions + +This section covers some less frequently used, but still significant, +assertions. + +### Explicit Success and Failure + +See [Explicit Success and Failure](reference/assertions.md#success-failure) in +the Assertions Reference. + +### Exception Assertions + +See [Exception Assertions](reference/assertions.md#exceptions) in the Assertions +Reference. + +### Predicate Assertions for Better Error Messages + +Even though GoogleTest has a rich set of assertions, they can never be complete, +as it's impossible (nor a good idea) to anticipate all scenarios a user might +run into. Therefore, sometimes a user has to use `EXPECT_TRUE()` to check a +complex expression, for lack of a better macro. This has the problem of not +showing you the values of the parts of the expression, making it hard to +understand what went wrong. As a workaround, some users choose to construct the +failure message by themselves, streaming it into `EXPECT_TRUE()`. However, this +is awkward especially when the expression has side-effects or is expensive to +evaluate. + +GoogleTest gives you three different options to solve this problem: + +#### Using an Existing Boolean Function + +If you already have a function or functor that returns `bool` (or a type that +can be implicitly converted to `bool`), you can use it in a *predicate +assertion* to get the function arguments printed for free. See +[`EXPECT_PRED*`](reference/assertions.md#EXPECT_PRED) in the Assertions +Reference for details. + +#### Using a Function That Returns an AssertionResult + +While `EXPECT_PRED*()` and friends are handy for a quick job, the syntax is not +satisfactory: you have to use different macros for different arities, and it +feels more like Lisp than C++. The `::testing::AssertionResult` class solves +this problem. + +An `AssertionResult` object represents the result of an assertion (whether it's +a success or a failure, and an associated message). You can create an +`AssertionResult` using one of these factory functions: + +```c++ +namespace testing { + +// Returns an AssertionResult object to indicate that an assertion has +// succeeded. +AssertionResult AssertionSuccess(); + +// Returns an AssertionResult object to indicate that an assertion has +// failed. +AssertionResult AssertionFailure(); + +} +``` + +You can then use the `<<` operator to stream messages to the `AssertionResult` +object. + +To provide more readable messages in Boolean assertions (e.g. `EXPECT_TRUE()`), +write a predicate function that returns `AssertionResult` instead of `bool`. For +example, if you define `IsEven()` as: + +```c++ +testing::AssertionResult IsEven(int n) { + if ((n % 2) == 0) + return testing::AssertionSuccess(); + else + return testing::AssertionFailure() << n << " is odd"; +} +``` + +instead of: + +```c++ +bool IsEven(int n) { + return (n % 2) == 0; +} +``` + +the failed assertion `EXPECT_TRUE(IsEven(Fib(4)))` will print: + +```none +Value of: IsEven(Fib(4)) + Actual: false (3 is odd) +Expected: true +``` + +instead of a more opaque + +```none +Value of: IsEven(Fib(4)) + Actual: false +Expected: true +``` + +If you want informative messages in `EXPECT_FALSE` and `ASSERT_FALSE` as well +(one third of Boolean assertions in the Google code base are negative ones), and +are fine with making the predicate slower in the success case, you can supply a +success message: + +```c++ +testing::AssertionResult IsEven(int n) { + if ((n % 2) == 0) + return testing::AssertionSuccess() << n << " is even"; + else + return testing::AssertionFailure() << n << " is odd"; +} +``` + +Then the statement `EXPECT_FALSE(IsEven(Fib(6)))` will print + +```none + Value of: IsEven(Fib(6)) + Actual: true (8 is even) + Expected: false +``` + +#### Using a Predicate-Formatter + +If you find the default message generated by +[`EXPECT_PRED*`](reference/assertions.md#EXPECT_PRED) and +[`EXPECT_TRUE`](reference/assertions.md#EXPECT_TRUE) unsatisfactory, or some +arguments to your predicate do not support streaming to `ostream`, you can +instead use *predicate-formatter assertions* to *fully* customize how the +message is formatted. See +[`EXPECT_PRED_FORMAT*`](reference/assertions.md#EXPECT_PRED_FORMAT) in the +Assertions Reference for details. + +### Floating-Point Comparison + +See [Floating-Point Comparison](reference/assertions.md#floating-point) in the +Assertions Reference. + +#### Floating-Point Predicate-Format Functions + +Some floating-point operations are useful, but not that often used. In order to +avoid an explosion of new macros, we provide them as predicate-format functions +that can be used in the predicate assertion macro +[`EXPECT_PRED_FORMAT2`](reference/assertions.md#EXPECT_PRED_FORMAT), for +example: + +```c++ +using ::testing::FloatLE; +using ::testing::DoubleLE; +... +EXPECT_PRED_FORMAT2(FloatLE, val1, val2); +EXPECT_PRED_FORMAT2(DoubleLE, val1, val2); +``` + +The above code verifies that `val1` is less than, or approximately equal to, +`val2`. + +### Asserting Using gMock Matchers + +See [`EXPECT_THAT`](reference/assertions.md#EXPECT_THAT) in the Assertions +Reference. + +### More String Assertions + +(Please read the [previous](#asserting-using-gmock-matchers) section first if +you haven't.) + +You can use the gMock [string matchers](reference/matchers.md#string-matchers) +with [`EXPECT_THAT`](reference/assertions.md#EXPECT_THAT) to do more string +comparison tricks (sub-string, prefix, suffix, regular expression, and etc). For +example, + +```c++ +using ::testing::HasSubstr; +using ::testing::MatchesRegex; +... + ASSERT_THAT(foo_string, HasSubstr("needle")); + EXPECT_THAT(bar_string, MatchesRegex("\\w*\\d+")); +``` + +### Windows HRESULT assertions + +See [Windows HRESULT Assertions](reference/assertions.md#HRESULT) in the +Assertions Reference. + +### Type Assertions + +You can call the function + +```c++ +::testing::StaticAssertTypeEq(); +``` + +to assert that types `T1` and `T2` are the same. The function does nothing if +the assertion is satisfied. If the types are different, the function call will +fail to compile, the compiler error message will say that `T1 and T2 are not the +same type` and most likely (depending on the compiler) show you the actual +values of `T1` and `T2`. This is mainly useful inside template code. + +**Caveat**: When used inside a member function of a class template or a function +template, `StaticAssertTypeEq()` is effective only if the function is +instantiated. For example, given: + +```c++ +template class Foo { + public: + void Bar() { testing::StaticAssertTypeEq(); } +}; +``` + +the code: + +```c++ +void Test1() { Foo foo; } +``` + +will not generate a compiler error, as `Foo::Bar()` is never actually +instantiated. Instead, you need: + +```c++ +void Test2() { Foo foo; foo.Bar(); } +``` + +to cause a compiler error. + +### Assertion Placement + +You can use assertions in any C++ function. In particular, it doesn't have to be +a method of the test fixture class. The one constraint is that assertions that +generate a fatal failure (`FAIL*` and `ASSERT_*`) can only be used in +void-returning functions. This is a consequence of Google's not using +exceptions. By placing it in a non-void function you'll get a confusing compile +error like `"error: void value not ignored as it ought to be"` or `"cannot +initialize return object of type 'bool' with an rvalue of type 'void'"` or +`"error: no viable conversion from 'void' to 'string'"`. + +If you need to use fatal assertions in a function that returns non-void, one +option is to make the function return the value in an out parameter instead. For +example, you can rewrite `T2 Foo(T1 x)` to `void Foo(T1 x, T2* result)`. You +need to make sure that `*result` contains some sensible value even when the +function returns prematurely. As the function now returns `void`, you can use +any assertion inside of it. + +If changing the function's type is not an option, you should just use assertions +that generate non-fatal failures, such as `ADD_FAILURE*` and `EXPECT_*`. + +{: .callout .note} +NOTE: Constructors and destructors are not considered void-returning functions, +according to the C++ language specification, and so you may not use fatal +assertions in them; you'll get a compilation error if you try. Instead, either +call `abort` and crash the entire test executable, or put the fatal assertion in +a `SetUp`/`TearDown` function; see +[constructor/destructor vs. `SetUp`/`TearDown`](faq.md#CtorVsSetUp) + +{: .callout .warning} +WARNING: A fatal assertion in a helper function (private void-returning method) +called from a constructor or destructor does not terminate the current test, as +your intuition might suggest: it merely returns from the constructor or +destructor early, possibly leaving your object in a partially-constructed or +partially-destructed state! You almost certainly want to `abort` or use +`SetUp`/`TearDown` instead. + +## Skipping test execution + +Related to the assertions `SUCCEED()` and `FAIL()`, you can prevent further test +execution at runtime with the `GTEST_SKIP()` macro. This is useful when you need +to check for preconditions of the system under test during runtime and skip +tests in a meaningful way. + +`GTEST_SKIP()` can be used in individual test cases or in the `SetUp()` methods +of classes derived from either `::testing::Environment` or `::testing::Test`. +For example: + +```c++ +TEST(SkipTest, DoesSkip) { + GTEST_SKIP() << "Skipping single test"; + EXPECT_EQ(0, 1); // Won't fail; it won't be executed +} + +class SkipFixture : public ::testing::Test { + protected: + void SetUp() override { + GTEST_SKIP() << "Skipping all tests for this fixture"; + } +}; + +// Tests for SkipFixture won't be executed. +TEST_F(SkipFixture, SkipsOneTest) { + EXPECT_EQ(5, 7); // Won't fail +} +``` + +As with assertion macros, you can stream a custom message into `GTEST_SKIP()`. + +## Teaching GoogleTest How to Print Your Values + +When a test assertion such as `EXPECT_EQ` fails, GoogleTest prints the argument +values to help you debug. It does this using a user-extensible value printer. + +This printer knows how to print built-in C++ types, native arrays, STL +containers, and any type that supports the `<<` operator. For other types, it +prints the raw bytes in the value and hopes that you the user can figure it out. + +As mentioned earlier, the printer is *extensible*. That means you can teach it +to do a better job at printing your particular type than to dump the bytes. To +do that, define an `AbslStringify()` overload as a `friend` function template +for your type: + +```cpp +namespace foo { + +class Point { // We want GoogleTest to be able to print instances of this. + ... + // Provide a friend overload. + template + friend void AbslStringify(Sink& sink, const Point& point) { + absl::Format(&sink, "(%d, %d)", point.x, point.y); + } + + int x; + int y; +}; + +// If you can't declare the function in the class it's important that the +// AbslStringify overload is defined in the SAME namespace that defines Point. +// C++'s look-up rules rely on that. +enum class EnumWithStringify { kMany = 0, kChoices = 1 }; + +template +void AbslStringify(Sink& sink, EnumWithStringify e) { + absl::Format(&sink, "%s", e == EnumWithStringify::kMany ? "Many" : "Choices"); +} + +} // namespace foo +``` + +{: .callout .note} +Note: `AbslStringify()` utilizes a generic "sink" buffer to construct its +string. For more information about supported operations on `AbslStringify()`'s +sink, see go/abslstringify. + +`AbslStringify()` can also use `absl::StrFormat`'s catch-all `%v` type specifier +within its own format strings to perform type deduction. `Point` above could be +formatted as `"(%v, %v)"` for example, and deduce the `int` values as `%d`. + +Sometimes, `AbslStringify()` might not be an option: your team may wish to print +types with extra debugging information for testing purposes only. If so, you can +instead define a `PrintTo()` function like this: + +```c++ +#include + +namespace foo { + +class Point { + ... + friend void PrintTo(const Point& point, std::ostream* os) { + *os << "(" << point.x << "," << point.y << ")"; + } + + int x; + int y; +}; + +// If you can't declare the function in the class it's important that PrintTo() +// is defined in the SAME namespace that defines Point. C++'s look-up rules +// rely on that. +void PrintTo(const Point& point, std::ostream* os) { + *os << "(" << point.x << "," << point.y << ")"; +} + +} // namespace foo +``` + +If you have defined both `AbslStringify()` and `PrintTo()`, the latter will be +used by GoogleTest. This allows you to customize how the value appears in +GoogleTest's output without affecting code that relies on the behavior of +`AbslStringify()`. + +If you have an existing `<<` operator and would like to define an +`AbslStringify()`, the latter will be used for GoogleTest printing. + +If you want to print a value `x` using GoogleTest's value printer yourself, just +call `::testing::PrintToString(x)`, which returns an `std::string`: + +```c++ +vector > point_ints = GetPointIntVector(); + +EXPECT_TRUE(IsCorrectPointIntVector(point_ints)) + << "point_ints = " << testing::PrintToString(point_ints); +``` + +For more details regarding `AbslStringify()` and its integration with other +libraries, see go/abslstringify. + +## Death Tests + +In many applications, there are assertions that can cause application failure if +a condition is not met. These consistency checks, which ensure that the program +is in a known good state, are there to fail at the earliest possible time after +some program state is corrupted. If the assertion checks the wrong condition, +then the program may proceed in an erroneous state, which could lead to memory +corruption, security holes, or worse. Hence it is vitally important to test that +such assertion statements work as expected. + +Since these precondition checks cause the processes to die, we call such tests +_death tests_. More generally, any test that checks that a program terminates +(except by throwing an exception) in an expected fashion is also a death test. + +Note that if a piece of code throws an exception, we don't consider it "death" +for the purpose of death tests, as the caller of the code could catch the +exception and avoid the crash. If you want to verify exceptions thrown by your +code, see [Exception Assertions](#ExceptionAssertions). + +If you want to test `EXPECT_*()/ASSERT_*()` failures in your test code, see +["Catching" Failures](#catching-failures). + +### How to Write a Death Test + +GoogleTest provides assertion macros to support death tests. See +[Death Assertions](reference/assertions.md#death) in the Assertions Reference +for details. + +To write a death test, simply use one of the macros inside your test function. +For example, + +```c++ +TEST(MyDeathTest, Foo) { + // This death test uses a compound statement. + ASSERT_DEATH({ + int n = 5; + Foo(&n); + }, "Error on line .* of Foo()"); +} + +TEST(MyDeathTest, NormalExit) { + EXPECT_EXIT(NormalExit(), testing::ExitedWithCode(0), "Success"); +} + +TEST(MyDeathTest, KillProcess) { + EXPECT_EXIT(KillProcess(), testing::KilledBySignal(SIGKILL), + "Sending myself unblockable signal"); +} +``` + +verifies that: + +* calling `Foo(5)` causes the process to die with the given error message, +* calling `NormalExit()` causes the process to print `"Success"` to stderr and + exit with exit code 0, and +* calling `KillProcess()` kills the process with signal `SIGKILL`. + +The test function body may contain other assertions and statements as well, if +necessary. + +Note that a death test only cares about three things: + +1. does `statement` abort or exit the process? +2. (in the case of `ASSERT_EXIT` and `EXPECT_EXIT`) does the exit status + satisfy `predicate`? Or (in the case of `ASSERT_DEATH` and `EXPECT_DEATH`) + is the exit status non-zero? And +3. does the stderr output match `matcher`? + +In particular, if `statement` generates an `ASSERT_*` or `EXPECT_*` failure, it +will **not** cause the death test to fail, as GoogleTest assertions don't abort +the process. + +### Death Test Naming + +{: .callout .important} +IMPORTANT: We strongly recommend you to follow the convention of naming your +**test suite** (not test) `*DeathTest` when it contains a death test, as +demonstrated in the above example. The +[Death Tests And Threads](#death-tests-and-threads) section below explains why. + +If a test fixture class is shared by normal tests and death tests, you can use +`using` or `typedef` to introduce an alias for the fixture class and avoid +duplicating its code: + +```c++ +class FooTest : public testing::Test { ... }; + +using FooDeathTest = FooTest; + +TEST_F(FooTest, DoesThis) { + // normal test +} + +TEST_F(FooDeathTest, DoesThat) { + // death test +} +``` + +### Regular Expression Syntax + +When built with Bazel and using Abseil, GoogleTest uses the +[RE2](https://github.com/google/re2/wiki/Syntax) syntax. Otherwise, for POSIX +systems (Linux, Cygwin, Mac), GoogleTest uses the +[POSIX extended regular expression](http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html#tag_09_04) +syntax. To learn about POSIX syntax, you may want to read this +[Wikipedia entry](http://en.wikipedia.org/wiki/Regular_expression#POSIX_extended). + +On Windows, GoogleTest uses its own simple regular expression implementation. It +lacks many features. For example, we don't support union (`"x|y"`), grouping +(`"(xy)"`), brackets (`"[xy]"`), and repetition count (`"x{5,7}"`), among +others. Below is what we do support (`A` denotes a literal character, period +(`.`), or a single `\\ ` escape sequence; `x` and `y` denote regular +expressions.): + +Expression | Meaning +---------- | -------------------------------------------------------------- +`c` | matches any literal character `c` +`\\d` | matches any decimal digit +`\\D` | matches any character that's not a decimal digit +`\\f` | matches `\f` +`\\n` | matches `\n` +`\\r` | matches `\r` +`\\s` | matches any ASCII whitespace, including `\n` +`\\S` | matches any character that's not a whitespace +`\\t` | matches `\t` +`\\v` | matches `\v` +`\\w` | matches any letter, `_`, or decimal digit +`\\W` | matches any character that `\\w` doesn't match +`\\c` | matches any literal character `c`, which must be a punctuation +`.` | matches any single character except `\n` +`A?` | matches 0 or 1 occurrences of `A` +`A*` | matches 0 or many occurrences of `A` +`A+` | matches 1 or many occurrences of `A` +`^` | matches the beginning of a string (not that of each line) +`$` | matches the end of a string (not that of each line) +`xy` | matches `x` followed by `y` + +To help you determine which capability is available on your system, GoogleTest +defines macros to govern which regular expression it is using. The macros are: +`GTEST_USES_SIMPLE_RE=1` or `GTEST_USES_POSIX_RE=1`. If you want your death +tests to work in all cases, you can either `#if` on these macros or use the more +limited syntax only. + +### How It Works + +See [Death Assertions](reference/assertions.md#death) in the Assertions +Reference. + +### Death Tests And Threads + +The reason for the two death test styles has to do with thread safety. Due to +well-known problems with forking in the presence of threads, death tests should +be run in a single-threaded context. Sometimes, however, it isn't feasible to +arrange that kind of environment. For example, statically-initialized modules +may start threads before main is ever reached. Once threads have been created, +it may be difficult or impossible to clean them up. + +GoogleTest has three features intended to raise awareness of threading issues. + +1. A warning is emitted if multiple threads are running when a death test is + encountered. +2. Test suites with a name ending in "DeathTest" are run before all other + tests. +3. It uses `clone()` instead of `fork()` to spawn the child process on Linux + (`clone()` is not available on Cygwin and Mac), as `fork()` is more likely + to cause the child to hang when the parent process has multiple threads. + +It's perfectly fine to create threads inside a death test statement; they are +executed in a separate process and cannot affect the parent. + +### Death Test Styles + +The "threadsafe" death test style was introduced in order to help mitigate the +risks of testing in a possibly multithreaded environment. It trades increased +test execution time (potentially dramatically so) for improved thread safety. + +The automated testing framework does not set the style flag. You can choose a +particular style of death tests by setting the flag programmatically: + +```c++ +GTEST_FLAG_SET(death_test_style, "threadsafe"); +``` + +You can do this in `main()` to set the style for all death tests in the binary, +or in individual tests. Recall that flags are saved before running each test and +restored afterwards, so you need not do that yourself. For example: + +```c++ +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + GTEST_FLAG_SET(death_test_style, "fast"); + return RUN_ALL_TESTS(); +} + +TEST(MyDeathTest, TestOne) { + GTEST_FLAG_SET(death_test_style, "threadsafe"); + // This test is run in the "threadsafe" style: + ASSERT_DEATH(ThisShouldDie(), ""); +} + +TEST(MyDeathTest, TestTwo) { + // This test is run in the "fast" style: + ASSERT_DEATH(ThisShouldDie(), ""); +} +``` + +### Caveats + +The `statement` argument of `ASSERT_EXIT()` can be any valid C++ statement. If +it leaves the current function via a `return` statement or by throwing an +exception, the death test is considered to have failed. Some GoogleTest macros +may return from the current function (e.g. `ASSERT_TRUE()`), so be sure to avoid +them in `statement`. + +Since `statement` runs in the child process, any in-memory side effect (e.g. +modifying a variable, releasing memory, etc) it causes will *not* be observable +in the parent process. In particular, if you release memory in a death test, +your program will fail the heap check as the parent process will never see the +memory reclaimed. To solve this problem, you can + +1. try not to free memory in a death test; +2. free the memory again in the parent process; or +3. do not use the heap checker in your program. + +Due to an implementation detail, you cannot place multiple death test assertions +on the same line; otherwise, compilation will fail with an unobvious error +message. + +Despite the improved thread safety afforded by the "threadsafe" style of death +test, thread problems such as deadlock are still possible in the presence of +handlers registered with `pthread_atfork(3)`. + +## Using Assertions in Sub-routines + +{: .callout .note} +Note: If you want to put a series of test assertions in a subroutine to check +for a complex condition, consider using +[a custom GMock matcher](gmock_cook_book.md#NewMatchers) instead. This lets you +provide a more readable error message in case of failure and avoid all of the +issues described below. + +### Adding Traces to Assertions + +If a test sub-routine is called from several places, when an assertion inside it +fails, it can be hard to tell which invocation of the sub-routine the failure is +from. You can alleviate this problem using extra logging or custom failure +messages, but that usually clutters up your tests. A better solution is to use +the `SCOPED_TRACE` macro or the `ScopedTrace` utility: + +```c++ +SCOPED_TRACE(message); +``` + +```c++ +ScopedTrace trace("file_path", line_number, message); +``` + +where `message` can be anything streamable to `std::ostream`. `SCOPED_TRACE` +macro will cause the current file name, line number, and the given message to be +added in every failure message. `ScopedTrace` accepts explicit file name and +line number in arguments, which is useful for writing test helpers. The effect +will be undone when the control leaves the current lexical scope. + +For example, + +```c++ +10: void Sub1(int n) { +11: EXPECT_EQ(Bar(n), 1); +12: EXPECT_EQ(Bar(n + 1), 2); +13: } +14: +15: TEST(FooTest, Bar) { +16: { +17: SCOPED_TRACE("A"); // This trace point will be included in +18: // every failure in this scope. +19: Sub1(1); +20: } +21: // Now it won't. +22: Sub1(9); +23: } +``` + +could result in messages like these: + +```none +path/to/foo_test.cc:11: Failure +Value of: Bar(n) +Expected: 1 + Actual: 2 +Google Test trace: +path/to/foo_test.cc:17: A + +path/to/foo_test.cc:12: Failure +Value of: Bar(n + 1) +Expected: 2 + Actual: 3 +``` + +Without the trace, it would've been difficult to know which invocation of +`Sub1()` the two failures come from respectively. (You could add an extra +message to each assertion in `Sub1()` to indicate the value of `n`, but that's +tedious.) + +Some tips on using `SCOPED_TRACE`: + +1. With a suitable message, it's often enough to use `SCOPED_TRACE` at the + beginning of a sub-routine, instead of at each call site. +2. When calling sub-routines inside a loop, make the loop iterator part of the + message in `SCOPED_TRACE` such that you can know which iteration the failure + is from. +3. Sometimes the line number of the trace point is enough for identifying the + particular invocation of a sub-routine. In this case, you don't have to + choose a unique message for `SCOPED_TRACE`. You can simply use `""`. +4. You can use `SCOPED_TRACE` in an inner scope when there is one in the outer + scope. In this case, all active trace points will be included in the failure + messages, in reverse order they are encountered. +5. The trace dump is clickable in Emacs - hit `return` on a line number and + you'll be taken to that line in the source file! + +### Propagating Fatal Failures + +A common pitfall when using `ASSERT_*` and `FAIL*` is not understanding that +when they fail they only abort the _current function_, not the entire test. For +example, the following test will segfault: + +```c++ +void Subroutine() { + // Generates a fatal failure and aborts the current function. + ASSERT_EQ(1, 2); + + // The following won't be executed. + ... +} + +TEST(FooTest, Bar) { + Subroutine(); // The intended behavior is for the fatal failure + // in Subroutine() to abort the entire test. + + // The actual behavior: the function goes on after Subroutine() returns. + int* p = nullptr; + *p = 3; // Segfault! +} +``` + +To alleviate this, GoogleTest provides three different solutions. You could use +either exceptions, the `(ASSERT|EXPECT)_NO_FATAL_FAILURE` assertions or the +`HasFatalFailure()` function. They are described in the following two +subsections. + +#### Asserting on Subroutines with an exception + +The following code can turn ASSERT-failure into an exception: + +```c++ +class ThrowListener : public testing::EmptyTestEventListener { + void OnTestPartResult(const testing::TestPartResult& result) override { + if (result.type() == testing::TestPartResult::kFatalFailure) { + throw testing::AssertionException(result); + } + } +}; +int main(int argc, char** argv) { + ... + testing::UnitTest::GetInstance()->listeners().Append(new ThrowListener); + return RUN_ALL_TESTS(); +} +``` + +This listener should be added after other listeners if you have any, otherwise +they won't see failed `OnTestPartResult`. + +#### Asserting on Subroutines + +As shown above, if your test calls a subroutine that has an `ASSERT_*` failure +in it, the test will continue after the subroutine returns. This may not be what +you want. + +Often people want fatal failures to propagate like exceptions. For that +GoogleTest offers the following macros: + +Fatal assertion | Nonfatal assertion | Verifies +------------------------------------- | ------------------------------------- | -------- +`ASSERT_NO_FATAL_FAILURE(statement);` | `EXPECT_NO_FATAL_FAILURE(statement);` | `statement` doesn't generate any new fatal failures in the current thread. + +Only failures in the thread that executes the assertion are checked to determine +the result of this type of assertions. If `statement` creates new threads, +failures in these threads are ignored. + +Examples: + +```c++ +ASSERT_NO_FATAL_FAILURE(Foo()); + +int i; +EXPECT_NO_FATAL_FAILURE({ + i = Bar(); +}); +``` + +Assertions from multiple threads are currently not supported on Windows. + +#### Checking for Failures in the Current Test + +`HasFatalFailure()` in the `::testing::Test` class returns `true` if an +assertion in the current test has suffered a fatal failure. This allows +functions to catch fatal failures in a sub-routine and return early. + +```c++ +class Test { + public: + ... + static bool HasFatalFailure(); +}; +``` + +The typical usage, which basically simulates the behavior of a thrown exception, +is: + +```c++ +TEST(FooTest, Bar) { + Subroutine(); + // Aborts if Subroutine() had a fatal failure. + if (HasFatalFailure()) return; + + // The following won't be executed. + ... +} +``` + +If `HasFatalFailure()` is used outside of `TEST()` , `TEST_F()` , or a test +fixture, you must add the `::testing::Test::` prefix, as in: + +```c++ +if (testing::Test::HasFatalFailure()) return; +``` + +Similarly, `HasNonfatalFailure()` returns `true` if the current test has at +least one non-fatal failure, and `HasFailure()` returns `true` if the current +test has at least one failure of either kind. + +## Logging Additional Information + +In your test code, you can call `RecordProperty("key", value)` to log additional +information, where `value` can be either a string or an `int`. The *last* value +recorded for a key will be emitted to the +[XML output](#generating-an-xml-report) if you specify one. For example, the +test + +```c++ +TEST_F(WidgetUsageTest, MinAndMaxWidgets) { + RecordProperty("MaximumWidgets", ComputeMaxUsage()); + RecordProperty("MinimumWidgets", ComputeMinUsage()); +} +``` + +will output XML like this: + +```xml + ... + + ... +``` + +{: .callout .note} +> NOTE: +> +> * `RecordProperty()` is a static member of the `Test` class. Therefore it +> needs to be prefixed with `::testing::Test::` if used outside of the +> `TEST` body and the test fixture class. +> * *`key`* must be a valid XML attribute name, and cannot conflict with the +> ones already used by GoogleTest (`name`, `status`, `time`, `classname`, +> `type_param`, and `value_param`). +> * Calling `RecordProperty()` outside of the lifespan of a test is allowed. +> If it's called outside of a test but between a test suite's +> `SetUpTestSuite()` and `TearDownTestSuite()` methods, it will be +> attributed to the XML element for the test suite. If it's called outside +> of all test suites (e.g. in a test environment), it will be attributed to +> the top-level XML element. + +## Sharing Resources Between Tests in the Same Test Suite + +GoogleTest creates a new test fixture object for each test in order to make +tests independent and easier to debug. However, sometimes tests use resources +that are expensive to set up, making the one-copy-per-test model prohibitively +expensive. + +If the tests don't change the resource, there's no harm in their sharing a +single resource copy. So, in addition to per-test set-up/tear-down, GoogleTest +also supports per-test-suite set-up/tear-down. To use it: + +1. In your test fixture class (say `FooTest` ), declare as `static` some member + variables to hold the shared resources. +2. Outside your test fixture class (typically just below it), define those + member variables, optionally giving them initial values. +3. In the same test fixture class, define a `static void SetUpTestSuite()` + function (remember not to spell it as **`SetupTestSuite`** with a small + `u`!) to set up the shared resources and a `static void TearDownTestSuite()` + function to tear them down. + +That's it! GoogleTest automatically calls `SetUpTestSuite()` before running the +*first test* in the `FooTest` test suite (i.e. before creating the first +`FooTest` object), and calls `TearDownTestSuite()` after running the *last test* +in it (i.e. after deleting the last `FooTest` object). In between, the tests can +use the shared resources. + +Remember that the test order is undefined, so your code can't depend on a test +preceding or following another. Also, the tests must either not modify the state +of any shared resource, or, if they do modify the state, they must restore the +state to its original value before passing control to the next test. + +Note that `SetUpTestSuite()` may be called multiple times for a test fixture +class that has derived classes, so you should not expect code in the function +body to be run only once. Also, derived classes still have access to shared +resources defined as static members, so careful consideration is needed when +managing shared resources to avoid memory leaks if shared resources are not +properly cleaned up in `TearDownTestSuite()`. + +Here's an example of per-test-suite set-up and tear-down: + +```c++ +class FooTest : public testing::Test { + protected: + // Per-test-suite set-up. + // Called before the first test in this test suite. + // Can be omitted if not needed. + static void SetUpTestSuite() { + shared_resource_ = new ...; + + // If `shared_resource_` is **not deleted** in `TearDownTestSuite()`, + // reallocation should be prevented because `SetUpTestSuite()` may be called + // in subclasses of FooTest and lead to memory leak. + // + // if (shared_resource_ == nullptr) { + // shared_resource_ = new ...; + // } + } + + // Per-test-suite tear-down. + // Called after the last test in this test suite. + // Can be omitted if not needed. + static void TearDownTestSuite() { + delete shared_resource_; + shared_resource_ = nullptr; + } + + // You can define per-test set-up logic as usual. + void SetUp() override { ... } + + // You can define per-test tear-down logic as usual. + void TearDown() override { ... } + + // Some expensive resource shared by all tests. + static T* shared_resource_; +}; + +T* FooTest::shared_resource_ = nullptr; + +TEST_F(FooTest, Test1) { + ... you can refer to shared_resource_ here ... +} + +TEST_F(FooTest, Test2) { + ... you can refer to shared_resource_ here ... +} +``` + +{: .callout .note} +NOTE: Though the above code declares `SetUpTestSuite()` protected, it may +sometimes be necessary to declare it public, such as when using it with +`TEST_P`. + +## Global Set-Up and Tear-Down + +Just as you can do set-up and tear-down at the test level and the test suite +level, you can also do it at the test program level. Here's how. + +First, you subclass the `::testing::Environment` class to define a test +environment, which knows how to set-up and tear-down: + +```c++ +class Environment : public ::testing::Environment { + public: + ~Environment() override {} + + // Override this to define how to set up the environment. + void SetUp() override {} + + // Override this to define how to tear down the environment. + void TearDown() override {} +}; +``` + +Then, you register an instance of your environment class with GoogleTest by +calling the `::testing::AddGlobalTestEnvironment()` function: + +```c++ +Environment* AddGlobalTestEnvironment(Environment* env); +``` + +Now, when `RUN_ALL_TESTS()` is called, it first calls the `SetUp()` method of +each environment object, then runs the tests if none of the environments +reported fatal failures and `GTEST_SKIP()` was not called. `RUN_ALL_TESTS()` +always calls `TearDown()` with each environment object, regardless of whether or +not the tests were run. + +It's OK to register multiple environment objects. In this suite, their `SetUp()` +will be called in the order they are registered, and their `TearDown()` will be +called in the reverse order. + +Note that GoogleTest takes ownership of the registered environment objects. +Therefore **do not delete them** by yourself. + +You should call `AddGlobalTestEnvironment()` before `RUN_ALL_TESTS()` is called, +probably in `main()`. If you use `gtest_main`, you need to call this before +`main()` starts for it to take effect. One way to do this is to define a global +variable like this: + +```c++ +testing::Environment* const foo_env = + testing::AddGlobalTestEnvironment(new FooEnvironment); +``` + +However, we strongly recommend you to write your own `main()` and call +`AddGlobalTestEnvironment()` there, as relying on initialization of global +variables makes the code harder to read and may cause problems when you register +multiple environments from different translation units and the environments have +dependencies among them (remember that the compiler doesn't guarantee the order +in which global variables from different translation units are initialized). + +## Value-Parameterized Tests + +*Value-parameterized tests* allow you to test your code with different +parameters without writing multiple copies of the same test. This is useful in a +number of situations, for example: + +* You have a piece of code whose behavior is affected by one or more + command-line flags. You want to make sure your code performs correctly for + various values of those flags. +* You want to test different implementations of an OO interface. +* You want to test your code over various inputs (a.k.a. data-driven testing). + This feature is easy to abuse, so please exercise your good sense when doing + it! + +### How to Write Value-Parameterized Tests + +To write value-parameterized tests, first you should define a fixture class. It +must be derived from both `testing::Test` and `testing::WithParamInterface` +(the latter is a pure interface), where `T` is the type of your parameter +values. For convenience, you can just derive the fixture class from +`testing::TestWithParam`, which itself is derived from both `testing::Test` +and `testing::WithParamInterface`. `T` can be any copyable type. If it's a +raw pointer, you are responsible for managing the lifespan of the pointed +values. + +{: .callout .note} +NOTE: If your test fixture defines `SetUpTestSuite()` or `TearDownTestSuite()` +they must be declared **public** rather than **protected** in order to use +`TEST_P`. + +```c++ +class FooTest : + public testing::TestWithParam { + // You can implement all the usual fixture class members here. + // To access the test parameter, call GetParam() from class + // TestWithParam. +}; + +// Or, when you want to add parameters to a pre-existing fixture class: +class BaseTest : public testing::Test { + ... +}; +class BarTest : public BaseTest, + public testing::WithParamInterface { + ... +}; +``` + +Then, use the `TEST_P` macro to define as many test patterns using this fixture +as you want. The `_P` suffix is for "parameterized" or "pattern", whichever you +prefer to think. + +```c++ +TEST_P(FooTest, DoesBlah) { + // Inside a test, access the test parameter with the GetParam() method + // of the TestWithParam class: + EXPECT_TRUE(foo.Blah(GetParam())); + ... +} + +TEST_P(FooTest, HasBlahBlah) { + ... +} +``` + +Finally, you can use the `INSTANTIATE_TEST_SUITE_P` macro to instantiate the +test suite with any set of parameters you want. GoogleTest defines a number of +functions for generating test parameters—see details at +[`INSTANTIATE_TEST_SUITE_P`](reference/testing.md#INSTANTIATE_TEST_SUITE_P) in +the Testing Reference. + +For example, the following statement will instantiate tests from the `FooTest` +test suite each with parameter values `"meeny"`, `"miny"`, and `"moe"` using the +[`Values`](reference/testing.md#param-generators) parameter generator: + +```c++ +INSTANTIATE_TEST_SUITE_P(MeenyMinyMoe, + FooTest, + testing::Values("meeny", "miny", "moe")); +``` + +{: .callout .note} +NOTE: The code above must be placed at global or namespace scope, not at +function scope. + +The first argument to `INSTANTIATE_TEST_SUITE_P` is a unique name for the +instantiation of the test suite. The next argument is the name of the test +pattern, and the last is the +[parameter generator](reference/testing.md#param-generators). + +The parameter generator expression is not evaluated until GoogleTest is +initialized (via `InitGoogleTest()`). Any prior initialization done in the +`main` function will be accessible from the parameter generator, for example, +the results of flag parsing. + +You can instantiate a test pattern more than once, so to distinguish different +instances of the pattern, the instantiation name is added as a prefix to the +actual test suite name. Remember to pick unique prefixes for different +instantiations. The tests from the instantiation above will have these names: + +* `MeenyMinyMoe/FooTest.DoesBlah/0` for `"meeny"` +* `MeenyMinyMoe/FooTest.DoesBlah/1` for `"miny"` +* `MeenyMinyMoe/FooTest.DoesBlah/2` for `"moe"` +* `MeenyMinyMoe/FooTest.HasBlahBlah/0` for `"meeny"` +* `MeenyMinyMoe/FooTest.HasBlahBlah/1` for `"miny"` +* `MeenyMinyMoe/FooTest.HasBlahBlah/2` for `"moe"` + +You can use these names in [`--gtest_filter`](#running-a-subset-of-the-tests). + +The following statement will instantiate all tests from `FooTest` again, each +with parameter values `"cat"` and `"dog"` using the +[`ValuesIn`](reference/testing.md#param-generators) parameter generator: + +```c++ +constexpr absl::string_view kPets[] = {"cat", "dog"}; +INSTANTIATE_TEST_SUITE_P(Pets, FooTest, testing::ValuesIn(kPets)); +``` + +The tests from the instantiation above will have these names: + +* `Pets/FooTest.DoesBlah/0` for `"cat"` +* `Pets/FooTest.DoesBlah/1` for `"dog"` +* `Pets/FooTest.HasBlahBlah/0` for `"cat"` +* `Pets/FooTest.HasBlahBlah/1` for `"dog"` + +Please note that `INSTANTIATE_TEST_SUITE_P` will instantiate *all* tests in the +given test suite, whether their definitions come before or *after* the +`INSTANTIATE_TEST_SUITE_P` statement. + +Additionally, by default, every `TEST_P` without a corresponding +`INSTANTIATE_TEST_SUITE_P` causes a failing test in test suite +`GoogleTestVerification`. If you have a test suite where that omission is not an +error, for example it is in a library that may be linked in for other reasons or +where the list of test cases is dynamic and may be empty, then this check can be +suppressed by tagging the test suite: + +```c++ +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FooTest); +``` + +You can see [sample7_unittest.cc] and [sample8_unittest.cc] for more examples. + +[sample7_unittest.cc]: https://github.com/google/googletest/blob/main/googletest/samples/sample7_unittest.cc "Parameterized Test example" +[sample8_unittest.cc]: https://github.com/google/googletest/blob/main/googletest/samples/sample8_unittest.cc "Parameterized Test example with multiple parameters" + +### Creating Value-Parameterized Abstract Tests + +In the above, we define and instantiate `FooTest` in the *same* source file. +Sometimes you may want to define value-parameterized tests in a library and let +other people instantiate them later. This pattern is known as *abstract tests*. +As an example of its application, when you are designing an interface you can +write a standard suite of abstract tests (perhaps using a factory function as +the test parameter) that all implementations of the interface are expected to +pass. When someone implements the interface, they can instantiate your suite to +get all the interface-conformance tests for free. + +To define abstract tests, you should organize your code like this: + +1. Put the definition of the parameterized test fixture class (e.g. `FooTest`) + in a header file, say `foo_param_test.h`. Think of this as *declaring* your + abstract tests. +2. Put the `TEST_P` definitions in `foo_param_test.cc`, which includes + `foo_param_test.h`. Think of this as *implementing* your abstract tests. + +Once they are defined, you can instantiate them by including `foo_param_test.h`, +invoking `INSTANTIATE_TEST_SUITE_P()`, and depending on the library target that +contains `foo_param_test.cc`. You can instantiate the same abstract test suite +multiple times, possibly in different source files. + +### Specifying Names for Value-Parameterized Test Parameters + +The optional last argument to `INSTANTIATE_TEST_SUITE_P()` allows the user to +specify a function or functor that generates custom test name suffixes based on +the test parameters. The function should accept one argument of type +`testing::TestParamInfo`, and return `std::string`. + +`testing::PrintToStringParamName` is a builtin test suffix generator that +returns the value of `testing::PrintToString(GetParam())`. It does not work for +`std::string` or C strings. + +{: .callout .note} +NOTE: test names must be non-empty, unique, and may only contain ASCII +alphanumeric characters. In particular, they +[should not contain underscores](faq.md#why-should-test-suite-names-and-test-names-not-contain-underscore) + +```c++ +class MyTestSuite : public testing::TestWithParam {}; + +TEST_P(MyTestSuite, MyTest) +{ + std::cout << "Example Test Param: " << GetParam() << std::endl; +} + +INSTANTIATE_TEST_SUITE_P(MyGroup, MyTestSuite, testing::Range(0, 10), + testing::PrintToStringParamName()); +``` + +Providing a custom functor allows for more control over test parameter name +generation, especially for types where the automatic conversion does not +generate helpful parameter names (e.g. strings as demonstrated above). The +following example illustrates this for multiple parameters, an enumeration type +and a string, and also demonstrates how to combine generators. It uses a lambda +for conciseness: + +```c++ +enum class MyType { MY_FOO = 0, MY_BAR = 1 }; + +class MyTestSuite : public testing::TestWithParam> { +}; + +INSTANTIATE_TEST_SUITE_P( + MyGroup, MyTestSuite, + testing::Combine( + testing::Values(MyType::MY_FOO, MyType::MY_BAR), + testing::Values("A", "B")), + [](const testing::TestParamInfo& info) { + std::string name = absl::StrCat( + std::get<0>(info.param) == MyType::MY_FOO ? "Foo" : "Bar", + std::get<1>(info.param)); + absl::c_replace_if(name, [](char c) { return !std::isalnum(c); }, '_'); + return name; + }); +``` + +## Typed Tests + +Suppose you have multiple implementations of the same interface and want to make +sure that all of them satisfy some common requirements. Or, you may have defined +several types that are supposed to conform to the same "concept" and you want to +verify it. In both cases, you want the same test logic repeated for different +types. + +While you can write one `TEST` or `TEST_F` for each type you want to test (and +you may even factor the test logic into a function template that you invoke from +the `TEST`), it's tedious and doesn't scale: if you want `m` tests over `n` +types, you'll end up writing `m*n` `TEST`s. + +*Typed tests* allow you to repeat the same test logic over a list of types. You +only need to write the test logic once, although you must know the type list +when writing typed tests. Here's how you do it: + +First, define a fixture class template. It should be parameterized by a type. +Remember to derive it from `::testing::Test`: + +```c++ +template +class FooTest : public testing::Test { + public: + ... + using List = std::list; + static T shared_; + T value_; +}; +``` + +Next, associate a list of types with the test suite, which will be repeated for +each type in the list: + +```c++ +using MyTypes = ::testing::Types; +TYPED_TEST_SUITE(FooTest, MyTypes); +``` + +The type alias (`using` or `typedef`) is necessary for the `TYPED_TEST_SUITE` +macro to parse correctly. Otherwise the compiler will think that each comma in +the type list introduces a new macro argument. + +Then, use `TYPED_TEST()` instead of `TEST_F()` to define a typed test for this +test suite. You can repeat this as many times as you want: + +```c++ +TYPED_TEST(FooTest, DoesBlah) { + // Inside a test, refer to the special name TypeParam to get the type + // parameter. Since we are inside a derived class template, C++ requires + // us to visit the members of FooTest via 'this'. + TypeParam n = this->value_; + + // To visit static members of the fixture, add the 'TestFixture::' + // prefix. + n += TestFixture::shared_; + + // To refer to typedefs in the fixture, add the 'typename TestFixture::' + // prefix. The 'typename' is required to satisfy the compiler. + typename TestFixture::List values; + + values.push_back(n); + ... +} + +TYPED_TEST(FooTest, HasPropertyA) { ... } +``` + +You can see [sample6_unittest.cc] for a complete example. + +[sample6_unittest.cc]: https://github.com/google/googletest/blob/main/googletest/samples/sample6_unittest.cc "Typed Test example" + +## Type-Parameterized Tests + +*Type-parameterized tests* are like typed tests, except that they don't require +you to know the list of types ahead of time. Instead, you can define the test +logic first and instantiate it with different type lists later. You can even +instantiate it more than once in the same program. + +If you are designing an interface or concept, you can define a suite of +type-parameterized tests to verify properties that any valid implementation of +the interface/concept should have. Then, the author of each implementation can +just instantiate the test suite with their type to verify that it conforms to +the requirements, without having to write similar tests repeatedly. Here's an +example: + +First, define a fixture class template, as we did with typed tests: + +```c++ +template +class FooTest : public testing::Test { + void DoSomethingInteresting(); + ... +}; +``` + +Next, declare that you will define a type-parameterized test suite: + +```c++ +TYPED_TEST_SUITE_P(FooTest); +``` + +Then, use `TYPED_TEST_P()` to define a type-parameterized test. You can repeat +this as many times as you want: + +```c++ +TYPED_TEST_P(FooTest, DoesBlah) { + // Inside a test, refer to TypeParam to get the type parameter. + TypeParam n = 0; + + // You will need to use `this` explicitly to refer to fixture members. + this->DoSomethingInteresting() + ... +} + +TYPED_TEST_P(FooTest, HasPropertyA) { ... } +``` + +Now the tricky part: you need to register all test patterns using the +`REGISTER_TYPED_TEST_SUITE_P` macro before you can instantiate them. The first +argument of the macro is the test suite name; the rest are the names of the +tests in this test suite: + +```c++ +REGISTER_TYPED_TEST_SUITE_P(FooTest, + DoesBlah, HasPropertyA); +``` + +Finally, you are free to instantiate the pattern with the types you want. If you +put the above code in a header file, you can `#include` it in multiple C++ +source files and instantiate it multiple times. + +```c++ +using MyTypes = ::testing::Types; +INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); +``` + +To distinguish different instances of the pattern, the first argument to the +`INSTANTIATE_TYPED_TEST_SUITE_P` macro is a prefix that will be added to the +actual test suite name. Remember to pick unique prefixes for different +instances. + +In the special case where the type list contains only one type, you can write +that type directly without `::testing::Types<...>`, like this: + +```c++ +INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, int); +``` + +You can see [sample6_unittest.cc] for a complete example. + +## Testing Private Code + +If you change your software's internal implementation, your tests should not +break as long as the change is not observable by users. Therefore, **per the +black-box testing principle, most of the time you should test your code through +its public interfaces.** + +**If you still find yourself needing to test internal implementation code, +consider if there's a better design.** The desire to test internal +implementation is often a sign that the class is doing too much. Consider +extracting an implementation class, and testing it. Then use that implementation +class in the original class. + +If you absolutely have to test non-public interface code though, you can. There +are two cases to consider: + +* Static functions ( *not* the same as static member functions!) or unnamed + namespaces, and +* Private or protected class members + +To test them, we use the following special techniques: + +* Both static functions and definitions/declarations in an unnamed namespace + are only visible within the same translation unit. To test them, you can + `#include` the entire `.cc` file being tested in your `*_test.cc` file. + (#including `.cc` files is not a good way to reuse code - you should not do + this in production code!) + + However, a better approach is to move the private code into the + `foo::internal` namespace, where `foo` is the namespace your project + normally uses, and put the private declarations in a `*-internal.h` file. + Your production `.cc` files and your tests are allowed to include this + internal header, but your clients are not. This way, you can fully test your + internal implementation without leaking it to your clients. + +* Private class members are only accessible from within the class or by + friends. To access a class' private members, you can declare your test + fixture as a friend to the class and define accessors in your fixture. Tests + using the fixture can then access the private members of your production + class via the accessors in the fixture. Note that even though your fixture + is a friend to your production class, your tests are not automatically + friends to it, as they are technically defined in sub-classes of the + fixture. + + Another way to test private members is to refactor them into an + implementation class, which is then declared in a `*-internal.h` file. Your + clients aren't allowed to include this header but your tests can. Such is + called the + [Pimpl](https://www.gamedev.net/articles/programming/general-and-gameplay-programming/the-c-pimpl-r1794/) + (Private Implementation) idiom. + + Or, you can declare an individual test as a friend of your class by adding + this line in the class body: + + ```c++ + FRIEND_TEST(TestSuiteName, TestName); + ``` + + For example, + + ```c++ + // foo.h + class Foo { + ... + private: + FRIEND_TEST(FooTest, BarReturnsZeroOnNull); + + int Bar(void* x); + }; + + // foo_test.cc + ... + TEST(FooTest, BarReturnsZeroOnNull) { + Foo foo; + EXPECT_EQ(foo.Bar(NULL), 0); // Uses Foo's private member Bar(). + } + ``` + + Pay special attention when your class is defined in a namespace. If you want + your test fixtures and tests to be friends of your class, then they must be + defined in the exact same namespace (no anonymous or inline namespaces). + + For example, if the code to be tested looks like: + + ```c++ + namespace my_namespace { + + class Foo { + friend class FooTest; + FRIEND_TEST(FooTest, Bar); + FRIEND_TEST(FooTest, Baz); + ... definition of the class Foo ... + }; + + } // namespace my_namespace + ``` + + Your test code should be something like: + + ```c++ + namespace my_namespace { + + class FooTest : public testing::Test { + protected: + ... + }; + + TEST_F(FooTest, Bar) { ... } + TEST_F(FooTest, Baz) { ... } + + } // namespace my_namespace + ``` + +## "Catching" Failures + +If you are building a testing utility on top of GoogleTest, you'll want to test +your utility. What framework would you use to test it? GoogleTest, of course. + +The challenge is to verify that your testing utility reports failures correctly. +In frameworks that report a failure by throwing an exception, you could catch +the exception and assert on it. But GoogleTest doesn't use exceptions, so how do +we test that a piece of code generates an expected failure? + +`"gtest/gtest-spi.h"` contains some constructs to do this. +After #including this header, you can use + +```c++ + EXPECT_FATAL_FAILURE(statement, substring); +``` + +to assert that `statement` generates a fatal (e.g. `ASSERT_*`) failure in the +current thread whose message contains the given `substring`, or use + +```c++ + EXPECT_NONFATAL_FAILURE(statement, substring); +``` + +if you are expecting a non-fatal (e.g. `EXPECT_*`) failure. + +Only failures in the current thread are checked to determine the result of this +type of expectations. If `statement` creates new threads, failures in these +threads are also ignored. If you want to catch failures in other threads as +well, use one of the following macros instead: + +```c++ + EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substring); + EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substring); +``` + +{: .callout .note} +NOTE: Assertions from multiple threads are currently not supported on Windows. + +For technical reasons, there are some caveats: + +1. You cannot stream a failure message to either macro. + +2. `statement` in `EXPECT_FATAL_FAILURE{_ON_ALL_THREADS}()` cannot reference + local non-static variables or non-static members of `this` object. + +3. `statement` in `EXPECT_FATAL_FAILURE{_ON_ALL_THREADS}()` cannot return a + value. + +## Registering tests programmatically + +The `TEST` macros handle the vast majority of all use cases, but there are few +where runtime registration logic is required. For those cases, the framework +provides the `::testing::RegisterTest` that allows callers to register arbitrary +tests dynamically. + +This is an advanced API only to be used when the `TEST` macros are insufficient. +The macros should be preferred when possible, as they avoid most of the +complexity of calling this function. + +It provides the following signature: + +```c++ +template +TestInfo* RegisterTest(const char* test_suite_name, const char* test_name, + const char* type_param, const char* value_param, + const char* file, int line, Factory factory); +``` + +The `factory` argument is a factory callable (move-constructible) object or +function pointer that creates a new instance of the Test object. It handles +ownership to the caller. The signature of the callable is `Fixture*()`, where +`Fixture` is the test fixture class for the test. All tests registered with the +same `test_suite_name` must return the same fixture type. This is checked at +runtime. + +The framework will infer the fixture class from the factory and will call the +`SetUpTestSuite` and `TearDownTestSuite` for it. + +Must be called before `RUN_ALL_TESTS()` is invoked, otherwise behavior is +undefined. + +Use case example: + +```c++ +class MyFixture : public testing::Test { + public: + // All of these optional, just like in regular macro usage. + static void SetUpTestSuite() { ... } + static void TearDownTestSuite() { ... } + void SetUp() override { ... } + void TearDown() override { ... } +}; + +class MyTest : public MyFixture { + public: + explicit MyTest(int data) : data_(data) {} + void TestBody() override { ... } + + private: + int data_; +}; + +void RegisterMyTests(const std::vector& values) { + for (int v : values) { + testing::RegisterTest( + "MyFixture", ("Test" + std::to_string(v)).c_str(), nullptr, + std::to_string(v).c_str(), + __FILE__, __LINE__, + // Important to use the fixture type as the return type here. + [=]() -> MyFixture* { return new MyTest(v); }); + } +} +... +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + std::vector values_to_test = LoadValuesFromConfig(); + RegisterMyTests(values_to_test); + ... + return RUN_ALL_TESTS(); +} +``` + +## Getting the Current Test's Name + +Sometimes a function may need to know the name of the currently running test. +For example, you may be using the `SetUp()` method of your test fixture to set +the golden file name based on which test is running. The +[`TestInfo`](reference/testing.md#TestInfo) class has this information. + +To obtain a `TestInfo` object for the currently running test, call +`current_test_info()` on the [`UnitTest`](reference/testing.md#UnitTest) +singleton object: + +```c++ + // Gets information about the currently running test. + // Do NOT delete the returned object - it's managed by the UnitTest class. + const testing::TestInfo* const test_info = + testing::UnitTest::GetInstance()->current_test_info(); + + printf("We are in test %s of test suite %s.\n", + test_info->name(), + test_info->test_suite_name()); +``` + +`current_test_info()` returns a null pointer if no test is running. In +particular, you cannot find the test suite name in `SetUpTestSuite()`, +`TearDownTestSuite()` (where you know the test suite name implicitly), or +functions called from them. + +## Extending GoogleTest by Handling Test Events + +GoogleTest provides an **event listener API** to let you receive notifications +about the progress of a test program and test failures. The events you can +listen to include the start and end of the test program, a test suite, or a test +method, among others. You may use this API to augment or replace the standard +console output, replace the XML output, or provide a completely different form +of output, such as a GUI or a database. You can also use test events as +checkpoints to implement a resource leak checker, for example. + +### Defining Event Listeners + +To define a event listener, you subclass either +[`testing::TestEventListener`](reference/testing.md#TestEventListener) or +[`testing::EmptyTestEventListener`](reference/testing.md#EmptyTestEventListener) +The former is an (abstract) interface, where *each pure virtual method can be +overridden to handle a test event* (For example, when a test starts, the +`OnTestStart()` method will be called.). The latter provides an empty +implementation of all methods in the interface, such that a subclass only needs +to override the methods it cares about. + +When an event is fired, its context is passed to the handler function as an +argument. The following argument types are used: + +* UnitTest reflects the state of the entire test program, +* TestSuite has information about a test suite, which can contain one or more + tests, +* TestInfo contains the state of a test, and +* TestPartResult represents the result of a test assertion. + +An event handler function can examine the argument it receives to find out +interesting information about the event and the test program's state. + +Here's an example: + +```c++ + class MinimalistPrinter : public testing::EmptyTestEventListener { + // Called before a test starts. + void OnTestStart(const testing::TestInfo& test_info) override { + printf("*** Test %s.%s starting.\n", + test_info.test_suite_name(), test_info.name()); + } + + // Called after a failed assertion or a SUCCESS(). + void OnTestPartResult(const testing::TestPartResult& test_part_result) override { + printf("%s in %s:%d\n%s\n", + test_part_result.failed() ? "*** Failure" : "Success", + test_part_result.file_name(), + test_part_result.line_number(), + test_part_result.summary()); + } + + // Called after a test ends. + void OnTestEnd(const testing::TestInfo& test_info) override { + printf("*** Test %s.%s ending.\n", + test_info.test_suite_name(), test_info.name()); + } + }; +``` + +### Using Event Listeners + +To use the event listener you have defined, add an instance of it to the +GoogleTest event listener list (represented by class +[`TestEventListeners`](reference/testing.md#TestEventListeners) - note the "s" +at the end of the name) in your `main()` function, before calling +`RUN_ALL_TESTS()`: + +```c++ +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + // Gets hold of the event listener list. + testing::TestEventListeners& listeners = + testing::UnitTest::GetInstance()->listeners(); + // Adds a listener to the end. GoogleTest takes the ownership. + listeners.Append(new MinimalistPrinter); + return RUN_ALL_TESTS(); +} +``` + +There's only one problem: the default test result printer is still in effect, so +its output will mingle with the output from your minimalist printer. To suppress +the default printer, just release it from the event listener list and delete it. +You can do so by adding one line: + +```c++ + ... + delete listeners.Release(listeners.default_result_printer()); + listeners.Append(new MinimalistPrinter); + return RUN_ALL_TESTS(); +``` + +Now, sit back and enjoy a completely different output from your tests. For more +details, see [sample9_unittest.cc]. + +[sample9_unittest.cc]: https://github.com/google/googletest/blob/main/googletest/samples/sample9_unittest.cc "Event listener example" + +You may append more than one listener to the list. When an `On*Start()` or +`OnTestPartResult()` event is fired, the listeners will receive it in the order +they appear in the list (since new listeners are added to the end of the list, +the default text printer and the default XML generator will receive the event +first). An `On*End()` event will be received by the listeners in the *reverse* +order. This allows output by listeners added later to be framed by output from +listeners added earlier. + +### Generating Failures in Listeners + +You may use failure-raising macros (`EXPECT_*()`, `ASSERT_*()`, `FAIL()`, etc) +when processing an event. There are some restrictions: + +1. You cannot generate any failure in `OnTestPartResult()` (otherwise it will + cause `OnTestPartResult()` to be called recursively). +2. A listener that handles `OnTestPartResult()` is not allowed to generate any + failure. + +When you add listeners to the listener list, you should put listeners that +handle `OnTestPartResult()` *before* listeners that can generate failures. This +ensures that failures generated by the latter are attributed to the right test +by the former. + +See [sample10_unittest.cc] for an example of a failure-raising listener. + +[sample10_unittest.cc]: https://github.com/google/googletest/blob/main/googletest/samples/sample10_unittest.cc "Failure-raising listener example" + +## Running Test Programs: Advanced Options + +GoogleTest test programs are ordinary executables. Once built, you can run them +directly and affect their behavior via the following environment variables +and/or command line flags. For the flags to work, your programs must call +`::testing::InitGoogleTest()` before calling `RUN_ALL_TESTS()`. + +To see a list of supported flags and their usage, please run your test program +with the `--help` flag. You can also use `-h`, `-?`, or `/?` for short. + +If an option is specified both by an environment variable and by a flag, the +latter takes precedence. + +### Selecting Tests + +#### Listing Test Names + +Sometimes it is necessary to list the available tests in a program before +running them so that a filter may be applied if needed. Including the flag +`--gtest_list_tests` overrides all other flags and lists tests in the following +format: + +```none +TestSuite1. + TestName1 + TestName2 +TestSuite2. + TestName +``` + +None of the tests listed are actually run if the flag is provided. There is no +corresponding environment variable for this flag. + +#### Running a Subset of the Tests + +By default, a GoogleTest program runs all tests the user has defined. Sometimes, +you want to run only a subset of the tests (e.g. for debugging or quickly +verifying a change). If you set the `GTEST_FILTER` environment variable or the +`--gtest_filter` flag to a filter string, GoogleTest will only run the tests +whose full names (in the form of `TestSuiteName.TestName`) match the filter. + +The format of a filter is a '`:`'-separated list of wildcard patterns (called +the *positive patterns*) optionally followed by a '`-`' and another +'`:`'-separated pattern list (called the *negative patterns*). A test matches +the filter if and only if it matches any of the positive patterns but does not +match any of the negative patterns. + +A pattern may contain `'*'` (matches any string) or `'?'` (matches any single +character). For convenience, the filter `'*-NegativePatterns'` can be also +written as `'-NegativePatterns'`. + +For example: + +* `./foo_test` Has no flag, and thus runs all its tests. +* `./foo_test --gtest_filter=*` Also runs everything, due to the single + match-everything `*` value. +* `./foo_test --gtest_filter=FooTest.*` Runs everything in test suite + `FooTest` . +* `./foo_test --gtest_filter=*Null*:*Constructor*` Runs any test whose full + name contains either `"Null"` or `"Constructor"` . +* `./foo_test --gtest_filter=-*DeathTest.*` Runs all non-death tests. +* `./foo_test --gtest_filter=FooTest.*-FooTest.Bar` Runs everything in test + suite `FooTest` except `FooTest.Bar`. +* `./foo_test --gtest_filter=FooTest.*:BarTest.*-FooTest.Bar:BarTest.Foo` Runs + everything in test suite `FooTest` except `FooTest.Bar` and everything in + test suite `BarTest` except `BarTest.Foo`. + +#### Stop test execution upon first failure + +By default, a GoogleTest program runs all tests the user has defined. In some +cases (e.g. iterative test development & execution) it may be desirable stop +test execution upon first failure (trading improved latency for completeness). +If `GTEST_FAIL_FAST` environment variable or `--gtest_fail_fast` flag is set, +the test runner will stop execution as soon as the first test failure is found. + +#### Temporarily Disabling Tests + +If you have a broken test that you cannot fix right away, you can add the +`DISABLED_` prefix to its name. This will exclude it from execution. This is +better than commenting out the code or using `#if 0`, as disabled tests are +still compiled (and thus won't rot). + +If you need to disable all tests in a test suite, you can either add `DISABLED_` +to the front of the name of each test, or alternatively add it to the front of +the test suite name. + +For example, the following tests won't be run by GoogleTest, even though they +will still be compiled: + +```c++ +// Tests that Foo does Abc. +TEST(FooTest, DISABLED_DoesAbc) { ... } + +class DISABLED_BarTest : public testing::Test { ... }; + +// Tests that Bar does Xyz. +TEST_F(DISABLED_BarTest, DoesXyz) { ... } +``` + +{: .callout .note} +NOTE: This feature should only be used for temporary pain-relief. You still have +to fix the disabled tests at a later date. As a reminder, GoogleTest will print +a banner warning you if a test program contains any disabled tests. + +{: .callout .tip} +TIP: You can easily count the number of disabled tests you have using +`grep`. This number can be used as a metric for +improving your test quality. + +#### Temporarily Enabling Disabled Tests + +To include disabled tests in test execution, just invoke the test program with +the `--gtest_also_run_disabled_tests` flag or set the +`GTEST_ALSO_RUN_DISABLED_TESTS` environment variable to a value other than `0`. +You can combine this with the `--gtest_filter` flag to further select which +disabled tests to run. + +### Repeating the Tests + +Once in a while you'll run into a test whose result is hit-or-miss. Perhaps it +will fail only 1% of the time, making it rather hard to reproduce the bug under +a debugger. This can be a major source of frustration. + +The `--gtest_repeat` flag allows you to repeat all (or selected) test methods in +a program many times. Hopefully, a flaky test will eventually fail and give you +a chance to debug. Here's how to use it: + +```none +$ foo_test --gtest_repeat=1000 +Repeat foo_test 1000 times and don't stop at failures. + +$ foo_test --gtest_repeat=-1 +A negative count means repeating forever. + +$ foo_test --gtest_repeat=1000 --gtest_break_on_failure +Repeat foo_test 1000 times, stopping at the first failure. This +is especially useful when running under a debugger: when the test +fails, it will drop into the debugger and you can then inspect +variables and stacks. + +$ foo_test --gtest_repeat=1000 --gtest_filter=FooBar.* +Repeat the tests whose name matches the filter 1000 times. +``` + +If your test program contains +[global set-up/tear-down](#global-set-up-and-tear-down) code, it will be +repeated in each iteration as well, as the flakiness may be in it. To avoid +repeating global set-up/tear-down, specify +`--gtest_recreate_environments_when_repeating=false`{.nowrap}. + +You can also specify the repeat count by setting the `GTEST_REPEAT` environment +variable. + +### Shuffling the Tests + +You can specify the `--gtest_shuffle` flag (or set the `GTEST_SHUFFLE` +environment variable to `1`) to run the tests in a program in a random order. +This helps to reveal bad dependencies between tests. + +By default, GoogleTest uses a random seed calculated from the current time. +Therefore you'll get a different order every time. The console output includes +the random seed value, such that you can reproduce an order-related test failure +later. To specify the random seed explicitly, use the `--gtest_random_seed=SEED` +flag (or set the `GTEST_RANDOM_SEED` environment variable), where `SEED` is an +integer in the range [0, 99999]. The seed value 0 is special: it tells +GoogleTest to do the default behavior of calculating the seed from the current +time. + +If you combine this with `--gtest_repeat=N`, GoogleTest will pick a different +random seed and re-shuffle the tests in each iteration. + +### Distributing Test Functions to Multiple Machines + +If you have more than one machine you can use to run a test program, you might +want to run the test functions in parallel and get the result faster. We call +this technique *sharding*, where each machine is called a *shard*. + +GoogleTest is compatible with test sharding. To take advantage of this feature, +your test runner (not part of GoogleTest) needs to do the following: + +1. Allocate a number of machines (shards) to run the tests. +1. On each shard, set the `GTEST_TOTAL_SHARDS` environment variable to the total + number of shards. It must be the same for all shards. +1. On each shard, set the `GTEST_SHARD_INDEX` environment variable to the index + of the shard. Different shards must be assigned different indices, which + must be in the range `[0, GTEST_TOTAL_SHARDS - 1]`. +1. Run the same test program on all shards. When GoogleTest sees the above two + environment variables, it will select a subset of the test functions to run. + Across all shards, each test function in the program will be run exactly + once. +1. Wait for all shards to finish, then collect and report the results. + +Your project may have tests that were written without GoogleTest and thus don't +understand this protocol. In order for your test runner to figure out which test +supports sharding, it can set the environment variable `GTEST_SHARD_STATUS_FILE` +to a non-existent file path. If a test program supports sharding, it will create +this file to acknowledge that fact; otherwise it will not create it. The actual +contents of the file are not important at this time, although we may put some +useful information in it in the future. + +Here's an example to make it clear. Suppose you have a test program `foo_test` +that contains the following 5 test functions: + +``` +TEST(A, V) +TEST(A, W) +TEST(B, X) +TEST(B, Y) +TEST(B, Z) +``` + +Suppose you have 3 machines at your disposal. To run the test functions in +parallel, you would set `GTEST_TOTAL_SHARDS` to 3 on all machines, and set +`GTEST_SHARD_INDEX` to 0, 1, and 2 on the machines respectively. Then you would +run the same `foo_test` on each machine. + +GoogleTest reserves the right to change how the work is distributed across the +shards, but here's one possible scenario: + +* Machine #0 runs `A.V` and `B.X`. +* Machine #1 runs `A.W` and `B.Y`. +* Machine #2 runs `B.Z`. + +### Controlling Test Output + +#### Colored Terminal Output + +GoogleTest can use colors in its terminal output to make it easier to spot the +important information: + +
        ...
        +[----------] 1 test from FooTest
        +[ RUN      ] FooTest.DoesAbc
        +[       OK ] FooTest.DoesAbc
        +[----------] 2 tests from BarTest
        +[ RUN      ] BarTest.HasXyzProperty
        +[       OK ] BarTest.HasXyzProperty
        +[ RUN      ] BarTest.ReturnsTrueOnSuccess
        +... some error messages ...
        +[   FAILED ] BarTest.ReturnsTrueOnSuccess
        +...
        +[==========] 30 tests from 14 test suites ran.
        +[   PASSED ] 28 tests.
        +[   FAILED ] 2 tests, listed below:
        +[   FAILED ] BarTest.ReturnsTrueOnSuccess
        +[   FAILED ] AnotherTest.DoesXyz
        +
        + 2 FAILED TESTS
        +
        + +You can set the `GTEST_COLOR` environment variable or the `--gtest_color` +command line flag to `yes`, `no`, or `auto` (the default) to enable colors, +disable colors, or let GoogleTest decide. When the value is `auto`, GoogleTest +will use colors if and only if the output goes to a terminal and (on non-Windows +platforms) the `TERM` environment variable is set to `xterm` or `xterm-color`. + +#### Suppressing test passes + +By default, GoogleTest prints 1 line of output for each test, indicating if it +passed or failed. To show only test failures, run the test program with +`--gtest_brief=1`, or set the GTEST_BRIEF environment variable to `1`. + +#### Suppressing the Elapsed Time + +By default, GoogleTest prints the time it takes to run each test. To disable +that, run the test program with the `--gtest_print_time=0` command line flag, or +set the GTEST_PRINT_TIME environment variable to `0`. + +#### Suppressing UTF-8 Text Output + +In case of assertion failures, GoogleTest prints expected and actual values of +type `string` both as hex-encoded strings as well as in readable UTF-8 text if +they contain valid non-ASCII UTF-8 characters. If you want to suppress the UTF-8 +text because, for example, you don't have an UTF-8 compatible output medium, run +the test program with `--gtest_print_utf8=0` or set the `GTEST_PRINT_UTF8` +environment variable to `0`. + +#### Generating an XML Report + +GoogleTest can emit a detailed XML report to a file in addition to its normal +textual output. The report contains the duration of each test, and thus can help +you identify slow tests. + +To generate the XML report, set the `GTEST_OUTPUT` environment variable or the +`--gtest_output` flag to the string `"xml:path_to_output_file"`, which will +create the file at the given location. You can also just use the string `"xml"`, +in which case the output can be found in the `test_detail.xml` file in the +current directory. + +If you specify a directory (for example, `"xml:output/directory/"` on Linux or +`"xml:output\directory\"` on Windows), GoogleTest will create the XML file in +that directory, named after the test executable (e.g. `foo_test.xml` for test +program `foo_test` or `foo_test.exe`). If the file already exists (perhaps left +over from a previous run), GoogleTest will pick a different name (e.g. +`foo_test_1.xml`) to avoid overwriting it. + +The report is based on the `junitreport` Ant task. Since that format was +originally intended for Java, a little interpretation is required to make it +apply to GoogleTest tests, as shown here: + +```xml + + + + + + + + + +``` + +* The root `` element corresponds to the entire test program. +* `` elements correspond to GoogleTest test suites. +* `` elements correspond to GoogleTest test functions. + +For instance, the following program + +```c++ +TEST(MathTest, Addition) { ... } +TEST(MathTest, Subtraction) { ... } +TEST(LogicTest, NonContradiction) { ... } +``` + +could generate this report: + +```xml + + + + + ... + ... + + + + + + + + + +``` + +Things to note: + +* The `tests` attribute of a `` or `` element tells how + many test functions the GoogleTest program or test suite contains, while the + `failures` attribute tells how many of them failed. + +* The `time` attribute expresses the duration of the test, test suite, or + entire test program in seconds. + +* The `timestamp` attribute records the local date and time of the test + execution. + +* The `file` and `line` attributes record the source file location, where the + test was defined. + +* Each `` element corresponds to a single failed GoogleTest + assertion. + +#### Generating a JSON Report + +GoogleTest can also emit a JSON report as an alternative format to XML. To +generate the JSON report, set the `GTEST_OUTPUT` environment variable or the +`--gtest_output` flag to the string `"json:path_to_output_file"`, which will +create the file at the given location. You can also just use the string +`"json"`, in which case the output can be found in the `test_detail.json` file +in the current directory. + +The report format conforms to the following JSON Schema: + +```json +{ + "$schema": "http://json-schema.org/schema#", + "type": "object", + "definitions": { + "TestCase": { + "type": "object", + "properties": { + "name": { "type": "string" }, + "tests": { "type": "integer" }, + "failures": { "type": "integer" }, + "disabled": { "type": "integer" }, + "time": { "type": "string" }, + "testsuite": { + "type": "array", + "items": { + "$ref": "#/definitions/TestInfo" + } + } + } + }, + "TestInfo": { + "type": "object", + "properties": { + "name": { "type": "string" }, + "file": { "type": "string" }, + "line": { "type": "integer" }, + "status": { + "type": "string", + "enum": ["RUN", "NOTRUN"] + }, + "time": { "type": "string" }, + "classname": { "type": "string" }, + "failures": { + "type": "array", + "items": { + "$ref": "#/definitions/Failure" + } + } + } + }, + "Failure": { + "type": "object", + "properties": { + "failures": { "type": "string" }, + "type": { "type": "string" } + } + } + }, + "properties": { + "tests": { "type": "integer" }, + "failures": { "type": "integer" }, + "disabled": { "type": "integer" }, + "errors": { "type": "integer" }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "time": { "type": "string" }, + "name": { "type": "string" }, + "testsuites": { + "type": "array", + "items": { + "$ref": "#/definitions/TestCase" + } + } + } +} +``` + +The report uses the format that conforms to the following Proto3 using the +[JSON encoding](https://developers.google.com/protocol-buffers/docs/proto3#json): + +```proto +syntax = "proto3"; + +package googletest; + +import "google/protobuf/timestamp.proto"; +import "google/protobuf/duration.proto"; + +message UnitTest { + int32 tests = 1; + int32 failures = 2; + int32 disabled = 3; + int32 errors = 4; + google.protobuf.Timestamp timestamp = 5; + google.protobuf.Duration time = 6; + string name = 7; + repeated TestCase testsuites = 8; +} + +message TestCase { + string name = 1; + int32 tests = 2; + int32 failures = 3; + int32 disabled = 4; + int32 errors = 5; + google.protobuf.Duration time = 6; + repeated TestInfo testsuite = 7; +} + +message TestInfo { + string name = 1; + string file = 6; + int32 line = 7; + enum Status { + RUN = 0; + NOTRUN = 1; + } + Status status = 2; + google.protobuf.Duration time = 3; + string classname = 4; + message Failure { + string failures = 1; + string type = 2; + } + repeated Failure failures = 5; +} +``` + +For instance, the following program + +```c++ +TEST(MathTest, Addition) { ... } +TEST(MathTest, Subtraction) { ... } +TEST(LogicTest, NonContradiction) { ... } +``` + +could generate this report: + +```json +{ + "tests": 3, + "failures": 1, + "errors": 0, + "time": "0.035s", + "timestamp": "2011-10-31T18:52:42Z", + "name": "AllTests", + "testsuites": [ + { + "name": "MathTest", + "tests": 2, + "failures": 1, + "errors": 0, + "time": "0.015s", + "testsuite": [ + { + "name": "Addition", + "file": "test.cpp", + "line": 1, + "status": "RUN", + "time": "0.007s", + "classname": "", + "failures": [ + { + "message": "Value of: add(1, 1)\n Actual: 3\nExpected: 2", + "type": "" + }, + { + "message": "Value of: add(1, -1)\n Actual: 1\nExpected: 0", + "type": "" + } + ] + }, + { + "name": "Subtraction", + "file": "test.cpp", + "line": 2, + "status": "RUN", + "time": "0.005s", + "classname": "" + } + ] + }, + { + "name": "LogicTest", + "tests": 1, + "failures": 0, + "errors": 0, + "time": "0.005s", + "testsuite": [ + { + "name": "NonContradiction", + "file": "test.cpp", + "line": 3, + "status": "RUN", + "time": "0.005s", + "classname": "" + } + ] + } + ] +} +``` + +{: .callout .important} +IMPORTANT: The exact format of the JSON document is subject to change. + +### Controlling How Failures Are Reported + +#### Detecting Test Premature Exit + +Google Test implements the _premature-exit-file_ protocol for test runners to +catch any kind of unexpected exits of test programs. Upon start, Google Test +creates the file which will be automatically deleted after all work has been +finished. Then, the test runner can check if this file exists. In case the file +remains undeleted, the inspected test has exited prematurely. + +This feature is enabled only if the `TEST_PREMATURE_EXIT_FILE` environment +variable has been set. + +#### Turning Assertion Failures into Break-Points + +When running test programs under a debugger, it's very convenient if the +debugger can catch an assertion failure and automatically drop into interactive +mode. GoogleTest's *break-on-failure* mode supports this behavior. + +To enable it, set the `GTEST_BREAK_ON_FAILURE` environment variable to a value +other than `0`. Alternatively, you can use the `--gtest_break_on_failure` +command line flag. + +#### Disabling Catching Test-Thrown Exceptions + +GoogleTest can be used either with or without exceptions enabled. If a test +throws a C++ exception or (on Windows) a structured exception (SEH), by default +GoogleTest catches it, reports it as a test failure, and continues with the next +test method. This maximizes the coverage of a test run. Also, on Windows an +uncaught exception will cause a pop-up window, so catching the exceptions allows +you to run the tests automatically. + +When debugging the test failures, however, you may instead want the exceptions +to be handled by the debugger, such that you can examine the call stack when an +exception is thrown. To achieve that, set the `GTEST_CATCH_EXCEPTIONS` +environment variable to `0`, or use the `--gtest_catch_exceptions=0` flag when +running the tests. + +### Sanitizer Integration + +The +[Undefined Behavior Sanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html), +[Address Sanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizer), +and +[Thread Sanitizer](https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual) +all provide weak functions that you can override to trigger explicit failures +when they detect sanitizer errors, such as creating a reference from `nullptr`. +To override these functions, place definitions for them in a source file that +you compile as part of your main binary: + +``` +extern "C" { +void __ubsan_on_report() { + FAIL() << "Encountered an undefined behavior sanitizer error"; +} +void __asan_on_error() { + FAIL() << "Encountered an address sanitizer error"; +} +void __tsan_on_report() { + FAIL() << "Encountered a thread sanitizer error"; +} +} // extern "C" +``` + +After compiling your project with one of the sanitizers enabled, if a particular +test triggers a sanitizer error, GoogleTest will report that it failed. diff --git a/vendor/googletest-1.14.0/docs/assets/css/style.scss b/vendor/googletest-1.14.0/docs/assets/css/style.scss new file mode 100644 index 00000000..bb30f418 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/assets/css/style.scss @@ -0,0 +1,5 @@ +--- +--- + +@import "jekyll-theme-primer"; +@import "main"; diff --git a/vendor/googletest-1.14.0/docs/community_created_documentation.md b/vendor/googletest-1.14.0/docs/community_created_documentation.md new file mode 100644 index 00000000..4569075f --- /dev/null +++ b/vendor/googletest-1.14.0/docs/community_created_documentation.md @@ -0,0 +1,7 @@ +# Community-Created Documentation + +The following is a list, in no particular order, of links to documentation +created by the Googletest community. + +* [Googlemock Insights](https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/googletest/insights.md), + by [ElectricRCAircraftGuy](https://github.com/ElectricRCAircraftGuy) diff --git a/vendor/googletest-1.14.0/docs/faq.md b/vendor/googletest-1.14.0/docs/faq.md new file mode 100644 index 00000000..19280972 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/faq.md @@ -0,0 +1,692 @@ +# GoogleTest FAQ + +## Why should test suite names and test names not contain underscore? + +{: .callout .note} +Note: GoogleTest reserves underscore (`_`) for special purpose keywords, such as +[the `DISABLED_` prefix](advanced.md#temporarily-disabling-tests), in addition +to the following rationale. + +Underscore (`_`) is special, as C++ reserves the following to be used by the +compiler and the standard library: + +1. any identifier that starts with an `_` followed by an upper-case letter, and +2. any identifier that contains two consecutive underscores (i.e. `__`) + *anywhere* in its name. + +User code is *prohibited* from using such identifiers. + +Now let's look at what this means for `TEST` and `TEST_F`. + +Currently `TEST(TestSuiteName, TestName)` generates a class named +`TestSuiteName_TestName_Test`. What happens if `TestSuiteName` or `TestName` +contains `_`? + +1. If `TestSuiteName` starts with an `_` followed by an upper-case letter (say, + `_Foo`), we end up with `_Foo_TestName_Test`, which is reserved and thus + invalid. +2. If `TestSuiteName` ends with an `_` (say, `Foo_`), we get + `Foo__TestName_Test`, which is invalid. +3. If `TestName` starts with an `_` (say, `_Bar`), we get + `TestSuiteName__Bar_Test`, which is invalid. +4. If `TestName` ends with an `_` (say, `Bar_`), we get + `TestSuiteName_Bar__Test`, which is invalid. + +So clearly `TestSuiteName` and `TestName` cannot start or end with `_` +(Actually, `TestSuiteName` can start with `_` -- as long as the `_` isn't +followed by an upper-case letter. But that's getting complicated. So for +simplicity we just say that it cannot start with `_`.). + +It may seem fine for `TestSuiteName` and `TestName` to contain `_` in the +middle. However, consider this: + +```c++ +TEST(Time, Flies_Like_An_Arrow) { ... } +TEST(Time_Flies, Like_An_Arrow) { ... } +``` + +Now, the two `TEST`s will both generate the same class +(`Time_Flies_Like_An_Arrow_Test`). That's not good. + +So for simplicity, we just ask the users to avoid `_` in `TestSuiteName` and +`TestName`. The rule is more constraining than necessary, but it's simple and +easy to remember. It also gives GoogleTest some wiggle room in case its +implementation needs to change in the future. + +If you violate the rule, there may not be immediate consequences, but your test +may (just may) break with a new compiler (or a new version of the compiler you +are using) or with a new version of GoogleTest. Therefore it's best to follow +the rule. + +## Why does GoogleTest support `EXPECT_EQ(NULL, ptr)` and `ASSERT_EQ(NULL, ptr)` but not `EXPECT_NE(NULL, ptr)` and `ASSERT_NE(NULL, ptr)`? + +First of all, you can use `nullptr` with each of these macros, e.g. +`EXPECT_EQ(ptr, nullptr)`, `EXPECT_NE(ptr, nullptr)`, `ASSERT_EQ(ptr, nullptr)`, +`ASSERT_NE(ptr, nullptr)`. This is the preferred syntax in the style guide +because `nullptr` does not have the type problems that `NULL` does. + +Due to some peculiarity of C++, it requires some non-trivial template meta +programming tricks to support using `NULL` as an argument of the `EXPECT_XX()` +and `ASSERT_XX()` macros. Therefore we only do it where it's most needed +(otherwise we make the implementation of GoogleTest harder to maintain and more +error-prone than necessary). + +Historically, the `EXPECT_EQ()` macro took the *expected* value as its first +argument and the *actual* value as the second, though this argument order is now +discouraged. It was reasonable that someone wanted +to write `EXPECT_EQ(NULL, some_expression)`, and this indeed was requested +several times. Therefore we implemented it. + +The need for `EXPECT_NE(NULL, ptr)` wasn't nearly as strong. When the assertion +fails, you already know that `ptr` must be `NULL`, so it doesn't add any +information to print `ptr` in this case. That means `EXPECT_TRUE(ptr != NULL)` +works just as well. + +If we were to support `EXPECT_NE(NULL, ptr)`, for consistency we'd have to +support `EXPECT_NE(ptr, NULL)` as well. This means using the template meta +programming tricks twice in the implementation, making it even harder to +understand and maintain. We believe the benefit doesn't justify the cost. + +Finally, with the growth of the gMock matcher library, we are encouraging people +to use the unified `EXPECT_THAT(value, matcher)` syntax more often in tests. One +significant advantage of the matcher approach is that matchers can be easily +combined to form new matchers, while the `EXPECT_NE`, etc, macros cannot be +easily combined. Therefore we want to invest more in the matchers than in the +`EXPECT_XX()` macros. + +## I need to test that different implementations of an interface satisfy some common requirements. Should I use typed tests or value-parameterized tests? + +For testing various implementations of the same interface, either typed tests or +value-parameterized tests can get it done. It's really up to you the user to +decide which is more convenient for you, depending on your particular case. Some +rough guidelines: + +* Typed tests can be easier to write if instances of the different + implementations can be created the same way, modulo the type. For example, + if all these implementations have a public default constructor (such that + you can write `new TypeParam`), or if their factory functions have the same + form (e.g. `CreateInstance()`). +* Value-parameterized tests can be easier to write if you need different code + patterns to create different implementations' instances, e.g. `new Foo` vs + `new Bar(5)`. To accommodate for the differences, you can write factory + function wrappers and pass these function pointers to the tests as their + parameters. +* When a typed test fails, the default output includes the name of the type, + which can help you quickly identify which implementation is wrong. + Value-parameterized tests only show the number of the failed iteration by + default. You will need to define a function that returns the iteration name + and pass it as the third parameter to INSTANTIATE_TEST_SUITE_P to have more + useful output. +* When using typed tests, you need to make sure you are testing against the + interface type, not the concrete types (in other words, you want to make + sure `implicit_cast(my_concrete_impl)` works, not just that + `my_concrete_impl` works). It's less likely to make mistakes in this area + when using value-parameterized tests. + +I hope I didn't confuse you more. :-) If you don't mind, I'd suggest you to give +both approaches a try. Practice is a much better way to grasp the subtle +differences between the two tools. Once you have some concrete experience, you +can much more easily decide which one to use the next time. + +## I got some run-time errors about invalid proto descriptors when using `ProtocolMessageEquals`. Help! + +{: .callout .note} +**Note:** `ProtocolMessageEquals` and `ProtocolMessageEquiv` are *deprecated* +now. Please use `EqualsProto`, etc instead. + +`ProtocolMessageEquals` and `ProtocolMessageEquiv` were redefined recently and +are now less tolerant of invalid protocol buffer definitions. In particular, if +you have a `foo.proto` that doesn't fully qualify the type of a protocol message +it references (e.g. `message` where it should be `message`), you +will now get run-time errors like: + +``` +... descriptor.cc:...] Invalid proto descriptor for file "path/to/foo.proto": +... descriptor.cc:...] blah.MyMessage.my_field: ".Bar" is not defined. +``` + +If you see this, your `.proto` file is broken and needs to be fixed by making +the types fully qualified. The new definition of `ProtocolMessageEquals` and +`ProtocolMessageEquiv` just happen to reveal your bug. + +## My death test modifies some state, but the change seems lost after the death test finishes. Why? + +Death tests (`EXPECT_DEATH`, etc) are executed in a sub-process s.t. the +expected crash won't kill the test program (i.e. the parent process). As a +result, any in-memory side effects they incur are observable in their respective +sub-processes, but not in the parent process. You can think of them as running +in a parallel universe, more or less. + +In particular, if you use mocking and the death test statement invokes some mock +methods, the parent process will think the calls have never occurred. Therefore, +you may want to move your `EXPECT_CALL` statements inside the `EXPECT_DEATH` +macro. + +## EXPECT_EQ(htonl(blah), blah_blah) generates weird compiler errors in opt mode. Is this a GoogleTest bug? + +Actually, the bug is in `htonl()`. + +According to `'man htonl'`, `htonl()` is a *function*, which means it's valid to +use `htonl` as a function pointer. However, in opt mode `htonl()` is defined as +a *macro*, which breaks this usage. + +Worse, the macro definition of `htonl()` uses a `gcc` extension and is *not* +standard C++. That hacky implementation has some ad hoc limitations. In +particular, it prevents you from writing `Foo()`, where `Foo` +is a template that has an integral argument. + +The implementation of `EXPECT_EQ(a, b)` uses `sizeof(... a ...)` inside a +template argument, and thus doesn't compile in opt mode when `a` contains a call +to `htonl()`. It is difficult to make `EXPECT_EQ` bypass the `htonl()` bug, as +the solution must work with different compilers on various platforms. + +## The compiler complains about "undefined references" to some static const member variables, but I did define them in the class body. What's wrong? + +If your class has a static data member: + +```c++ +// foo.h +class Foo { + ... + static const int kBar = 100; +}; +``` + +You also need to define it *outside* of the class body in `foo.cc`: + +```c++ +const int Foo::kBar; // No initializer here. +``` + +Otherwise your code is **invalid C++**, and may break in unexpected ways. In +particular, using it in GoogleTest comparison assertions (`EXPECT_EQ`, etc) will +generate an "undefined reference" linker error. The fact that "it used to work" +doesn't mean it's valid. It just means that you were lucky. :-) + +If the declaration of the static data member is `constexpr` then it is +implicitly an `inline` definition, and a separate definition in `foo.cc` is not +needed: + +```c++ +// foo.h +class Foo { + ... + static constexpr int kBar = 100; // Defines kBar, no need to do it in foo.cc. +}; +``` + +## Can I derive a test fixture from another? + +Yes. + +Each test fixture has a corresponding and same named test suite. This means only +one test suite can use a particular fixture. Sometimes, however, multiple test +cases may want to use the same or slightly different fixtures. For example, you +may want to make sure that all of a GUI library's test suites don't leak +important system resources like fonts and brushes. + +In GoogleTest, you share a fixture among test suites by putting the shared logic +in a base test fixture, then deriving from that base a separate fixture for each +test suite that wants to use this common logic. You then use `TEST_F()` to write +tests using each derived fixture. + +Typically, your code looks like this: + +```c++ +// Defines a base test fixture. +class BaseTest : public ::testing::Test { + protected: + ... +}; + +// Derives a fixture FooTest from BaseTest. +class FooTest : public BaseTest { + protected: + void SetUp() override { + BaseTest::SetUp(); // Sets up the base fixture first. + ... additional set-up work ... + } + + void TearDown() override { + ... clean-up work for FooTest ... + BaseTest::TearDown(); // Remember to tear down the base fixture + // after cleaning up FooTest! + } + + ... functions and variables for FooTest ... +}; + +// Tests that use the fixture FooTest. +TEST_F(FooTest, Bar) { ... } +TEST_F(FooTest, Baz) { ... } + +... additional fixtures derived from BaseTest ... +``` + +If necessary, you can continue to derive test fixtures from a derived fixture. +GoogleTest has no limit on how deep the hierarchy can be. + +For a complete example using derived test fixtures, see +[sample5_unittest.cc](https://github.com/google/googletest/blob/main/googletest/samples/sample5_unittest.cc). + +## My compiler complains "void value not ignored as it ought to be." What does this mean? + +You're probably using an `ASSERT_*()` in a function that doesn't return `void`. +`ASSERT_*()` can only be used in `void` functions, due to exceptions being +disabled by our build system. Please see more details +[here](advanced.md#assertion-placement). + +## My death test hangs (or seg-faults). How do I fix it? + +In GoogleTest, death tests are run in a child process and the way they work is +delicate. To write death tests you really need to understand how they work—see +the details at [Death Assertions](reference/assertions.md#death) in the +Assertions Reference. + +In particular, death tests don't like having multiple threads in the parent +process. So the first thing you can try is to eliminate creating threads outside +of `EXPECT_DEATH()`. For example, you may want to use mocks or fake objects +instead of real ones in your tests. + +Sometimes this is impossible as some library you must use may be creating +threads before `main()` is even reached. In this case, you can try to minimize +the chance of conflicts by either moving as many activities as possible inside +`EXPECT_DEATH()` (in the extreme case, you want to move everything inside), or +leaving as few things as possible in it. Also, you can try to set the death test +style to `"threadsafe"`, which is safer but slower, and see if it helps. + +If you go with thread-safe death tests, remember that they rerun the test +program from the beginning in the child process. Therefore make sure your +program can run side-by-side with itself and is deterministic. + +In the end, this boils down to good concurrent programming. You have to make +sure that there are no race conditions or deadlocks in your program. No silver +bullet - sorry! + +## Should I use the constructor/destructor of the test fixture or SetUp()/TearDown()? {#CtorVsSetUp} + +The first thing to remember is that GoogleTest does **not** reuse the same test +fixture object across multiple tests. For each `TEST_F`, GoogleTest will create +a **fresh** test fixture object, immediately call `SetUp()`, run the test body, +call `TearDown()`, and then delete the test fixture object. + +When you need to write per-test set-up and tear-down logic, you have the choice +between using the test fixture constructor/destructor or `SetUp()/TearDown()`. +The former is usually preferred, as it has the following benefits: + +* By initializing a member variable in the constructor, we have the option to + make it `const`, which helps prevent accidental changes to its value and + makes the tests more obviously correct. +* In case we need to subclass the test fixture class, the subclass' + constructor is guaranteed to call the base class' constructor *first*, and + the subclass' destructor is guaranteed to call the base class' destructor + *afterward*. With `SetUp()/TearDown()`, a subclass may make the mistake of + forgetting to call the base class' `SetUp()/TearDown()` or call them at the + wrong time. + +You may still want to use `SetUp()/TearDown()` in the following cases: + +* C++ does not allow virtual function calls in constructors and destructors. + You can call a method declared as virtual, but it will not use dynamic + dispatch. It will use the definition from the class the constructor of which + is currently executing. This is because calling a virtual method before the + derived class constructor has a chance to run is very dangerous - the + virtual method might operate on uninitialized data. Therefore, if you need + to call a method that will be overridden in a derived class, you have to use + `SetUp()/TearDown()`. +* In the body of a constructor (or destructor), it's not possible to use the + `ASSERT_xx` macros. Therefore, if the set-up operation could cause a fatal + test failure that should prevent the test from running, it's necessary to + use `abort` and abort the whole test + executable, or to use `SetUp()` instead of a constructor. +* If the tear-down operation could throw an exception, you must use + `TearDown()` as opposed to the destructor, as throwing in a destructor leads + to undefined behavior and usually will kill your program right away. Note + that many standard libraries (like STL) may throw when exceptions are + enabled in the compiler. Therefore you should prefer `TearDown()` if you + want to write portable tests that work with or without exceptions. +* The GoogleTest team is considering making the assertion macros throw on + platforms where exceptions are enabled (e.g. Windows, Mac OS, and Linux + client-side), which will eliminate the need for the user to propagate + failures from a subroutine to its caller. Therefore, you shouldn't use + GoogleTest assertions in a destructor if your code could run on such a + platform. + +## The compiler complains "no matching function to call" when I use ASSERT_PRED*. How do I fix it? + +See details for [`EXPECT_PRED*`](reference/assertions.md#EXPECT_PRED) in the +Assertions Reference. + +## My compiler complains about "ignoring return value" when I call RUN_ALL_TESTS(). Why? + +Some people had been ignoring the return value of `RUN_ALL_TESTS()`. That is, +instead of + +```c++ + return RUN_ALL_TESTS(); +``` + +they write + +```c++ + RUN_ALL_TESTS(); +``` + +This is **wrong and dangerous**. The testing services needs to see the return +value of `RUN_ALL_TESTS()` in order to determine if a test has passed. If your +`main()` function ignores it, your test will be considered successful even if it +has a GoogleTest assertion failure. Very bad. + +We have decided to fix this (thanks to Michael Chastain for the idea). Now, your +code will no longer be able to ignore `RUN_ALL_TESTS()` when compiled with +`gcc`. If you do so, you'll get a compiler error. + +If you see the compiler complaining about you ignoring the return value of +`RUN_ALL_TESTS()`, the fix is simple: just make sure its value is used as the +return value of `main()`. + +But how could we introduce a change that breaks existing tests? Well, in this +case, the code was already broken in the first place, so we didn't break it. :-) + +## My compiler complains that a constructor (or destructor) cannot return a value. What's going on? + +Due to a peculiarity of C++, in order to support the syntax for streaming +messages to an `ASSERT_*`, e.g. + +```c++ + ASSERT_EQ(1, Foo()) << "blah blah" << foo; +``` + +we had to give up using `ASSERT*` and `FAIL*` (but not `EXPECT*` and +`ADD_FAILURE*`) in constructors and destructors. The workaround is to move the +content of your constructor/destructor to a private void member function, or +switch to `EXPECT_*()` if that works. This +[section](advanced.md#assertion-placement) in the user's guide explains it. + +## My SetUp() function is not called. Why? + +C++ is case-sensitive. Did you spell it as `Setup()`? + +Similarly, sometimes people spell `SetUpTestSuite()` as `SetupTestSuite()` and +wonder why it's never called. + +## I have several test suites which share the same test fixture logic, do I have to define a new test fixture class for each of them? This seems pretty tedious. + +You don't have to. Instead of + +```c++ +class FooTest : public BaseTest {}; + +TEST_F(FooTest, Abc) { ... } +TEST_F(FooTest, Def) { ... } + +class BarTest : public BaseTest {}; + +TEST_F(BarTest, Abc) { ... } +TEST_F(BarTest, Def) { ... } +``` + +you can simply `typedef` the test fixtures: + +```c++ +typedef BaseTest FooTest; + +TEST_F(FooTest, Abc) { ... } +TEST_F(FooTest, Def) { ... } + +typedef BaseTest BarTest; + +TEST_F(BarTest, Abc) { ... } +TEST_F(BarTest, Def) { ... } +``` + +## GoogleTest output is buried in a whole bunch of LOG messages. What do I do? + +The GoogleTest output is meant to be a concise and human-friendly report. If +your test generates textual output itself, it will mix with the GoogleTest +output, making it hard to read. However, there is an easy solution to this +problem. + +Since `LOG` messages go to stderr, we decided to let GoogleTest output go to +stdout. This way, you can easily separate the two using redirection. For +example: + +```shell +$ ./my_test > gtest_output.txt +``` + +## Why should I prefer test fixtures over global variables? + +There are several good reasons: + +1. It's likely your test needs to change the states of its global variables. + This makes it difficult to keep side effects from escaping one test and + contaminating others, making debugging difficult. By using fixtures, each + test has a fresh set of variables that's different (but with the same + names). Thus, tests are kept independent of each other. +2. Global variables pollute the global namespace. +3. Test fixtures can be reused via subclassing, which cannot be done easily + with global variables. This is useful if many test suites have something in + common. + +## What can the statement argument in ASSERT_DEATH() be? + +`ASSERT_DEATH(statement, matcher)` (or any death assertion macro) can be used +wherever *`statement`* is valid. So basically *`statement`* can be any C++ +statement that makes sense in the current context. In particular, it can +reference global and/or local variables, and can be: + +* a simple function call (often the case), +* a complex expression, or +* a compound statement. + +Some examples are shown here: + +```c++ +// A death test can be a simple function call. +TEST(MyDeathTest, FunctionCall) { + ASSERT_DEATH(Xyz(5), "Xyz failed"); +} + +// Or a complex expression that references variables and functions. +TEST(MyDeathTest, ComplexExpression) { + const bool c = Condition(); + ASSERT_DEATH((c ? Func1(0) : object2.Method("test")), + "(Func1|Method) failed"); +} + +// Death assertions can be used anywhere in a function. In +// particular, they can be inside a loop. +TEST(MyDeathTest, InsideLoop) { + // Verifies that Foo(0), Foo(1), ..., and Foo(4) all die. + for (int i = 0; i < 5; i++) { + EXPECT_DEATH_M(Foo(i), "Foo has \\d+ errors", + ::testing::Message() << "where i is " << i); + } +} + +// A death assertion can contain a compound statement. +TEST(MyDeathTest, CompoundStatement) { + // Verifies that at lease one of Bar(0), Bar(1), ..., and + // Bar(4) dies. + ASSERT_DEATH({ + for (int i = 0; i < 5; i++) { + Bar(i); + } + }, + "Bar has \\d+ errors"); +} +``` + +## I have a fixture class `FooTest`, but `TEST_F(FooTest, Bar)` gives me error ``"no matching function for call to `FooTest::FooTest()'"``. Why? + +GoogleTest needs to be able to create objects of your test fixture class, so it +must have a default constructor. Normally the compiler will define one for you. +However, there are cases where you have to define your own: + +* If you explicitly declare a non-default constructor for class `FooTest` + (`DISALLOW_EVIL_CONSTRUCTORS()` does this), then you need to define a + default constructor, even if it would be empty. +* If `FooTest` has a const non-static data member, then you have to define the + default constructor *and* initialize the const member in the initializer + list of the constructor. (Early versions of `gcc` doesn't force you to + initialize the const member. It's a bug that has been fixed in `gcc 4`.) + +## Why does ASSERT_DEATH complain about previous threads that were already joined? + +With the Linux pthread library, there is no turning back once you cross the line +from a single thread to multiple threads. The first time you create a thread, a +manager thread is created in addition, so you get 3, not 2, threads. Later when +the thread you create joins the main thread, the thread count decrements by 1, +but the manager thread will never be killed, so you still have 2 threads, which +means you cannot safely run a death test. + +The new NPTL thread library doesn't suffer from this problem, as it doesn't +create a manager thread. However, if you don't control which machine your test +runs on, you shouldn't depend on this. + +## Why does GoogleTest require the entire test suite, instead of individual tests, to be named *DeathTest when it uses ASSERT_DEATH? + +GoogleTest does not interleave tests from different test suites. That is, it +runs all tests in one test suite first, and then runs all tests in the next test +suite, and so on. GoogleTest does this because it needs to set up a test suite +before the first test in it is run, and tear it down afterwards. Splitting up +the test case would require multiple set-up and tear-down processes, which is +inefficient and makes the semantics unclean. + +If we were to determine the order of tests based on test name instead of test +case name, then we would have a problem with the following situation: + +```c++ +TEST_F(FooTest, AbcDeathTest) { ... } +TEST_F(FooTest, Uvw) { ... } + +TEST_F(BarTest, DefDeathTest) { ... } +TEST_F(BarTest, Xyz) { ... } +``` + +Since `FooTest.AbcDeathTest` needs to run before `BarTest.Xyz`, and we don't +interleave tests from different test suites, we need to run all tests in the +`FooTest` case before running any test in the `BarTest` case. This contradicts +with the requirement to run `BarTest.DefDeathTest` before `FooTest.Uvw`. + +## But I don't like calling my entire test suite \*DeathTest when it contains both death tests and non-death tests. What do I do? + +You don't have to, but if you like, you may split up the test suite into +`FooTest` and `FooDeathTest`, where the names make it clear that they are +related: + +```c++ +class FooTest : public ::testing::Test { ... }; + +TEST_F(FooTest, Abc) { ... } +TEST_F(FooTest, Def) { ... } + +using FooDeathTest = FooTest; + +TEST_F(FooDeathTest, Uvw) { ... EXPECT_DEATH(...) ... } +TEST_F(FooDeathTest, Xyz) { ... ASSERT_DEATH(...) ... } +``` + +## GoogleTest prints the LOG messages in a death test's child process only when the test fails. How can I see the LOG messages when the death test succeeds? + +Printing the LOG messages generated by the statement inside `EXPECT_DEATH()` +makes it harder to search for real problems in the parent's log. Therefore, +GoogleTest only prints them when the death test has failed. + +If you really need to see such LOG messages, a workaround is to temporarily +break the death test (e.g. by changing the regex pattern it is expected to +match). Admittedly, this is a hack. We'll consider a more permanent solution +after the fork-and-exec-style death tests are implemented. + +## The compiler complains about `no match for 'operator<<'` when I use an assertion. What gives? + +If you use a user-defined type `FooType` in an assertion, you must make sure +there is an `std::ostream& operator<<(std::ostream&, const FooType&)` function +defined such that we can print a value of `FooType`. + +In addition, if `FooType` is declared in a name space, the `<<` operator also +needs to be defined in the *same* name space. See +[Tip of the Week #49](http://abseil.io/tips/49) for details. + +## How do I suppress the memory leak messages on Windows? + +Since the statically initialized GoogleTest singleton requires allocations on +the heap, the Visual C++ memory leak detector will report memory leaks at the +end of the program run. The easiest way to avoid this is to use the +`_CrtMemCheckpoint` and `_CrtMemDumpAllObjectsSince` calls to not report any +statically initialized heap objects. See MSDN for more details and additional +heap check/debug routines. + +## How can my code detect if it is running in a test? + +If you write code that sniffs whether it's running in a test and does different +things accordingly, you are leaking test-only logic into production code and +there is no easy way to ensure that the test-only code paths aren't run by +mistake in production. Such cleverness also leads to +[Heisenbugs](https://en.wikipedia.org/wiki/Heisenbug). Therefore we strongly +advise against the practice, and GoogleTest doesn't provide a way to do it. + +In general, the recommended way to cause the code to behave differently under +test is [Dependency Injection](http://en.wikipedia.org/wiki/Dependency_injection). You can inject +different functionality from the test and from the production code. Since your +production code doesn't link in the for-test logic at all (the +[`testonly`](http://docs.bazel.build/versions/master/be/common-definitions.html#common.testonly) attribute for BUILD targets helps to ensure +that), there is no danger in accidentally running it. + +However, if you *really*, *really*, *really* have no choice, and if you follow +the rule of ending your test program names with `_test`, you can use the +*horrible* hack of sniffing your executable name (`argv[0]` in `main()`) to know +whether the code is under test. + +## How do I temporarily disable a test? + +If you have a broken test that you cannot fix right away, you can add the +`DISABLED_` prefix to its name. This will exclude it from execution. This is +better than commenting out the code or using `#if 0`, as disabled tests are +still compiled (and thus won't rot). + +To include disabled tests in test execution, just invoke the test program with +the `--gtest_also_run_disabled_tests` flag. + +## Is it OK if I have two separate `TEST(Foo, Bar)` test methods defined in different namespaces? + +Yes. + +The rule is **all test methods in the same test suite must use the same fixture +class.** This means that the following is **allowed** because both tests use the +same fixture class (`::testing::Test`). + +```c++ +namespace foo { +TEST(CoolTest, DoSomething) { + SUCCEED(); +} +} // namespace foo + +namespace bar { +TEST(CoolTest, DoSomething) { + SUCCEED(); +} +} // namespace bar +``` + +However, the following code is **not allowed** and will produce a runtime error +from GoogleTest because the test methods are using different test fixture +classes with the same test suite name. + +```c++ +namespace foo { +class CoolTest : public ::testing::Test {}; // Fixture foo::CoolTest +TEST_F(CoolTest, DoSomething) { + SUCCEED(); +} +} // namespace foo + +namespace bar { +class CoolTest : public ::testing::Test {}; // Fixture: bar::CoolTest +TEST_F(CoolTest, DoSomething) { + SUCCEED(); +} +} // namespace bar +``` diff --git a/vendor/googletest-1.14.0/docs/gmock_cheat_sheet.md b/vendor/googletest-1.14.0/docs/gmock_cheat_sheet.md new file mode 100644 index 00000000..ddafaaa2 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/gmock_cheat_sheet.md @@ -0,0 +1,241 @@ +# gMock Cheat Sheet + +## Defining a Mock Class + +### Mocking a Normal Class {#MockClass} + +Given + +```cpp +class Foo { + public: + virtual ~Foo(); + virtual int GetSize() const = 0; + virtual string Describe(const char* name) = 0; + virtual string Describe(int type) = 0; + virtual bool Process(Bar elem, int count) = 0; +}; +``` + +(note that `~Foo()` **must** be virtual) we can define its mock as + +```cpp +#include + +class MockFoo : public Foo { + public: + MOCK_METHOD(int, GetSize, (), (const, override)); + MOCK_METHOD(string, Describe, (const char* name), (override)); + MOCK_METHOD(string, Describe, (int type), (override)); + MOCK_METHOD(bool, Process, (Bar elem, int count), (override)); +}; +``` + +To create a "nice" mock, which ignores all uninteresting calls, a "naggy" mock, +which warns on all uninteresting calls, or a "strict" mock, which treats them as +failures: + +```cpp +using ::testing::NiceMock; +using ::testing::NaggyMock; +using ::testing::StrictMock; + +NiceMock nice_foo; // The type is a subclass of MockFoo. +NaggyMock naggy_foo; // The type is a subclass of MockFoo. +StrictMock strict_foo; // The type is a subclass of MockFoo. +``` + +{: .callout .note} +**Note:** A mock object is currently naggy by default. We may make it nice by +default in the future. + +### Mocking a Class Template {#MockTemplate} + +Class templates can be mocked just like any class. + +To mock + +```cpp +template +class StackInterface { + public: + virtual ~StackInterface(); + virtual int GetSize() const = 0; + virtual void Push(const Elem& x) = 0; +}; +``` + +(note that all member functions that are mocked, including `~StackInterface()` +**must** be virtual). + +```cpp +template +class MockStack : public StackInterface { + public: + MOCK_METHOD(int, GetSize, (), (const, override)); + MOCK_METHOD(void, Push, (const Elem& x), (override)); +}; +``` + +### Specifying Calling Conventions for Mock Functions + +If your mock function doesn't use the default calling convention, you can +specify it by adding `Calltype(convention)` to `MOCK_METHOD`'s 4th parameter. +For example, + +```cpp + MOCK_METHOD(bool, Foo, (int n), (Calltype(STDMETHODCALLTYPE))); + MOCK_METHOD(int, Bar, (double x, double y), + (const, Calltype(STDMETHODCALLTYPE))); +``` + +where `STDMETHODCALLTYPE` is defined by `` on Windows. + +## Using Mocks in Tests {#UsingMocks} + +The typical work flow is: + +1. Import the gMock names you need to use. All gMock symbols are in the + `testing` namespace unless they are macros or otherwise noted. +2. Create the mock objects. +3. Optionally, set the default actions of the mock objects. +4. Set your expectations on the mock objects (How will they be called? What + will they do?). +5. Exercise code that uses the mock objects; if necessary, check the result + using googletest assertions. +6. When a mock object is destructed, gMock automatically verifies that all + expectations on it have been satisfied. + +Here's an example: + +```cpp +using ::testing::Return; // #1 + +TEST(BarTest, DoesThis) { + MockFoo foo; // #2 + + ON_CALL(foo, GetSize()) // #3 + .WillByDefault(Return(1)); + // ... other default actions ... + + EXPECT_CALL(foo, Describe(5)) // #4 + .Times(3) + .WillRepeatedly(Return("Category 5")); + // ... other expectations ... + + EXPECT_EQ(MyProductionFunction(&foo), "good"); // #5 +} // #6 +``` + +## Setting Default Actions {#OnCall} + +gMock has a **built-in default action** for any function that returns `void`, +`bool`, a numeric value, or a pointer. In C++11, it will additionally returns +the default-constructed value, if one exists for the given type. + +To customize the default action for functions with return type `T`, use +[`DefaultValue`](reference/mocking.md#DefaultValue). For example: + +```cpp + // Sets the default action for return type std::unique_ptr to + // creating a new Buzz every time. + DefaultValue>::SetFactory( + [] { return std::make_unique(AccessLevel::kInternal); }); + + // When this fires, the default action of MakeBuzz() will run, which + // will return a new Buzz object. + EXPECT_CALL(mock_buzzer_, MakeBuzz("hello")).Times(AnyNumber()); + + auto buzz1 = mock_buzzer_.MakeBuzz("hello"); + auto buzz2 = mock_buzzer_.MakeBuzz("hello"); + EXPECT_NE(buzz1, nullptr); + EXPECT_NE(buzz2, nullptr); + EXPECT_NE(buzz1, buzz2); + + // Resets the default action for return type std::unique_ptr, + // to avoid interfere with other tests. + DefaultValue>::Clear(); +``` + +To customize the default action for a particular method of a specific mock +object, use [`ON_CALL`](reference/mocking.md#ON_CALL). `ON_CALL` has a similar +syntax to `EXPECT_CALL`, but it is used for setting default behaviors when you +do not require that the mock method is called. See +[Knowing When to Expect](gmock_cook_book.md#UseOnCall) for a more detailed +discussion. + +## Setting Expectations {#ExpectCall} + +See [`EXPECT_CALL`](reference/mocking.md#EXPECT_CALL) in the Mocking Reference. + +## Matchers {#MatcherList} + +See the [Matchers Reference](reference/matchers.md). + +## Actions {#ActionList} + +See the [Actions Reference](reference/actions.md). + +## Cardinalities {#CardinalityList} + +See the [`Times` clause](reference/mocking.md#EXPECT_CALL.Times) of +`EXPECT_CALL` in the Mocking Reference. + +## Expectation Order + +By default, expectations can be matched in *any* order. If some or all +expectations must be matched in a given order, you can use the +[`After` clause](reference/mocking.md#EXPECT_CALL.After) or +[`InSequence` clause](reference/mocking.md#EXPECT_CALL.InSequence) of +`EXPECT_CALL`, or use an [`InSequence` object](reference/mocking.md#InSequence). + +## Verifying and Resetting a Mock + +gMock will verify the expectations on a mock object when it is destructed, or +you can do it earlier: + +```cpp +using ::testing::Mock; +... +// Verifies and removes the expectations on mock_obj; +// returns true if and only if successful. +Mock::VerifyAndClearExpectations(&mock_obj); +... +// Verifies and removes the expectations on mock_obj; +// also removes the default actions set by ON_CALL(); +// returns true if and only if successful. +Mock::VerifyAndClear(&mock_obj); +``` + +Do not set new expectations after verifying and clearing a mock after its use. +Setting expectations after code that exercises the mock has undefined behavior. +See [Using Mocks in Tests](gmock_for_dummies.md#using-mocks-in-tests) for more +information. + +You can also tell gMock that a mock object can be leaked and doesn't need to be +verified: + +```cpp +Mock::AllowLeak(&mock_obj); +``` + +## Mock Classes + +gMock defines a convenient mock class template + +```cpp +class MockFunction { + public: + MOCK_METHOD(R, Call, (A1, ..., An)); +}; +``` + +See this [recipe](gmock_cook_book.md#UsingCheckPoints) for one application of +it. + +## Flags + +| Flag | Description | +| :----------------------------- | :---------------------------------------- | +| `--gmock_catch_leaked_mocks=0` | Don't report leaked mock objects as failures. | +| `--gmock_verbose=LEVEL` | Sets the default verbosity level (`info`, `warning`, or `error`) of Google Mock messages. | diff --git a/vendor/googletest-1.14.0/docs/gmock_cook_book.md b/vendor/googletest-1.14.0/docs/gmock_cook_book.md new file mode 100644 index 00000000..da10918c --- /dev/null +++ b/vendor/googletest-1.14.0/docs/gmock_cook_book.md @@ -0,0 +1,4344 @@ +# gMock Cookbook + +You can find recipes for using gMock here. If you haven't yet, please read +[the dummy guide](gmock_for_dummies.md) first to make sure you understand the +basics. + +{: .callout .note} +**Note:** gMock lives in the `testing` name space. For readability, it is +recommended to write `using ::testing::Foo;` once in your file before using the +name `Foo` defined by gMock. We omit such `using` statements in this section for +brevity, but you should do it in your own code. + +## Creating Mock Classes + +Mock classes are defined as normal classes, using the `MOCK_METHOD` macro to +generate mocked methods. The macro gets 3 or 4 parameters: + +```cpp +class MyMock { + public: + MOCK_METHOD(ReturnType, MethodName, (Args...)); + MOCK_METHOD(ReturnType, MethodName, (Args...), (Specs...)); +}; +``` + +The first 3 parameters are simply the method declaration, split into 3 parts. +The 4th parameter accepts a closed list of qualifiers, which affect the +generated method: + +* **`const`** - Makes the mocked method a `const` method. Required if + overriding a `const` method. +* **`override`** - Marks the method with `override`. Recommended if overriding + a `virtual` method. +* **`noexcept`** - Marks the method with `noexcept`. Required if overriding a + `noexcept` method. +* **`Calltype(...)`** - Sets the call type for the method (e.g. to + `STDMETHODCALLTYPE`), useful in Windows. +* **`ref(...)`** - Marks the method with the reference qualification + specified. Required if overriding a method that has reference + qualifications. Eg `ref(&)` or `ref(&&)`. + +### Dealing with unprotected commas + +Unprotected commas, i.e. commas which are not surrounded by parentheses, prevent +`MOCK_METHOD` from parsing its arguments correctly: + +{: .bad} +```cpp +class MockFoo { + public: + MOCK_METHOD(std::pair, GetPair, ()); // Won't compile! + MOCK_METHOD(bool, CheckMap, (std::map, bool)); // Won't compile! +}; +``` + +Solution 1 - wrap with parentheses: + +{: .good} +```cpp +class MockFoo { + public: + MOCK_METHOD((std::pair), GetPair, ()); + MOCK_METHOD(bool, CheckMap, ((std::map), bool)); +}; +``` + +Note that wrapping a return or argument type with parentheses is, in general, +invalid C++. `MOCK_METHOD` removes the parentheses. + +Solution 2 - define an alias: + +{: .good} +```cpp +class MockFoo { + public: + using BoolAndInt = std::pair; + MOCK_METHOD(BoolAndInt, GetPair, ()); + using MapIntDouble = std::map; + MOCK_METHOD(bool, CheckMap, (MapIntDouble, bool)); +}; +``` + +### Mocking Private or Protected Methods + +You must always put a mock method definition (`MOCK_METHOD`) in a `public:` +section of the mock class, regardless of the method being mocked being `public`, +`protected`, or `private` in the base class. This allows `ON_CALL` and +`EXPECT_CALL` to reference the mock function from outside of the mock class. +(Yes, C++ allows a subclass to change the access level of a virtual function in +the base class.) Example: + +```cpp +class Foo { + public: + ... + virtual bool Transform(Gadget* g) = 0; + + protected: + virtual void Resume(); + + private: + virtual int GetTimeOut(); +}; + +class MockFoo : public Foo { + public: + ... + MOCK_METHOD(bool, Transform, (Gadget* g), (override)); + + // The following must be in the public section, even though the + // methods are protected or private in the base class. + MOCK_METHOD(void, Resume, (), (override)); + MOCK_METHOD(int, GetTimeOut, (), (override)); +}; +``` + +### Mocking Overloaded Methods + +You can mock overloaded functions as usual. No special attention is required: + +```cpp +class Foo { + ... + + // Must be virtual as we'll inherit from Foo. + virtual ~Foo(); + + // Overloaded on the types and/or numbers of arguments. + virtual int Add(Element x); + virtual int Add(int times, Element x); + + // Overloaded on the const-ness of this object. + virtual Bar& GetBar(); + virtual const Bar& GetBar() const; +}; + +class MockFoo : public Foo { + ... + MOCK_METHOD(int, Add, (Element x), (override)); + MOCK_METHOD(int, Add, (int times, Element x), (override)); + + MOCK_METHOD(Bar&, GetBar, (), (override)); + MOCK_METHOD(const Bar&, GetBar, (), (const, override)); +}; +``` + +{: .callout .note} +**Note:** if you don't mock all versions of the overloaded method, the compiler +will give you a warning about some methods in the base class being hidden. To +fix that, use `using` to bring them in scope: + +```cpp +class MockFoo : public Foo { + ... + using Foo::Add; + MOCK_METHOD(int, Add, (Element x), (override)); + // We don't want to mock int Add(int times, Element x); + ... +}; +``` + +### Mocking Class Templates + +You can mock class templates just like any class. + +```cpp +template +class StackInterface { + ... + // Must be virtual as we'll inherit from StackInterface. + virtual ~StackInterface(); + + virtual int GetSize() const = 0; + virtual void Push(const Elem& x) = 0; +}; + +template +class MockStack : public StackInterface { + ... + MOCK_METHOD(int, GetSize, (), (override)); + MOCK_METHOD(void, Push, (const Elem& x), (override)); +}; +``` + +### Mocking Non-virtual Methods {#MockingNonVirtualMethods} + +gMock can mock non-virtual functions to be used in Hi-perf dependency injection. + +In this case, instead of sharing a common base class with the real class, your +mock class will be *unrelated* to the real class, but contain methods with the +same signatures. The syntax for mocking non-virtual methods is the *same* as +mocking virtual methods (just don't add `override`): + +```cpp +// A simple packet stream class. None of its members is virtual. +class ConcretePacketStream { + public: + void AppendPacket(Packet* new_packet); + const Packet* GetPacket(size_t packet_number) const; + size_t NumberOfPackets() const; + ... +}; + +// A mock packet stream class. It inherits from no other, but defines +// GetPacket() and NumberOfPackets(). +class MockPacketStream { + public: + MOCK_METHOD(const Packet*, GetPacket, (size_t packet_number), (const)); + MOCK_METHOD(size_t, NumberOfPackets, (), (const)); + ... +}; +``` + +Note that the mock class doesn't define `AppendPacket()`, unlike the real class. +That's fine as long as the test doesn't need to call it. + +Next, you need a way to say that you want to use `ConcretePacketStream` in +production code, and use `MockPacketStream` in tests. Since the functions are +not virtual and the two classes are unrelated, you must specify your choice at +*compile time* (as opposed to run time). + +One way to do it is to templatize your code that needs to use a packet stream. +More specifically, you will give your code a template type argument for the type +of the packet stream. In production, you will instantiate your template with +`ConcretePacketStream` as the type argument. In tests, you will instantiate the +same template with `MockPacketStream`. For example, you may write: + +```cpp +template +void CreateConnection(PacketStream* stream) { ... } + +template +class PacketReader { + public: + void ReadPackets(PacketStream* stream, size_t packet_num); +}; +``` + +Then you can use `CreateConnection()` and +`PacketReader` in production code, and use +`CreateConnection()` and `PacketReader` in +tests. + +```cpp + MockPacketStream mock_stream; + EXPECT_CALL(mock_stream, ...)...; + .. set more expectations on mock_stream ... + PacketReader reader(&mock_stream); + ... exercise reader ... +``` + +### Mocking Free Functions + +It is not possible to directly mock a free function (i.e. a C-style function or +a static method). If you need to, you can rewrite your code to use an interface +(abstract class). + +Instead of calling a free function (say, `OpenFile`) directly, introduce an +interface for it and have a concrete subclass that calls the free function: + +```cpp +class FileInterface { + public: + ... + virtual bool Open(const char* path, const char* mode) = 0; +}; + +class File : public FileInterface { + public: + ... + bool Open(const char* path, const char* mode) override { + return OpenFile(path, mode); + } +}; +``` + +Your code should talk to `FileInterface` to open a file. Now it's easy to mock +out the function. + +This may seem like a lot of hassle, but in practice you often have multiple +related functions that you can put in the same interface, so the per-function +syntactic overhead will be much lower. + +If you are concerned about the performance overhead incurred by virtual +functions, and profiling confirms your concern, you can combine this with the +recipe for [mocking non-virtual methods](#MockingNonVirtualMethods). + +Alternatively, instead of introducing a new interface, you can rewrite your code +to accept a std::function instead of the free function, and then use +[MockFunction](#MockFunction) to mock the std::function. + +### Old-Style `MOCK_METHODn` Macros + +Before the generic `MOCK_METHOD` macro +[was introduced in 2018](https://github.com/google/googletest/commit/c5f08bf91944ce1b19bcf414fa1760e69d20afc2), +mocks where created using a family of macros collectively called `MOCK_METHODn`. +These macros are still supported, though migration to the new `MOCK_METHOD` is +recommended. + +The macros in the `MOCK_METHODn` family differ from `MOCK_METHOD`: + +* The general structure is `MOCK_METHODn(MethodName, ReturnType(Args))`, + instead of `MOCK_METHOD(ReturnType, MethodName, (Args))`. +* The number `n` must equal the number of arguments. +* When mocking a const method, one must use `MOCK_CONST_METHODn`. +* When mocking a class template, the macro name must be suffixed with `_T`. +* In order to specify the call type, the macro name must be suffixed with + `_WITH_CALLTYPE`, and the call type is the first macro argument. + +Old macros and their new equivalents: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Simple
        OldMOCK_METHOD1(Foo, bool(int))
        NewMOCK_METHOD(bool, Foo, (int))
        Const Method
        OldMOCK_CONST_METHOD1(Foo, bool(int))
        NewMOCK_METHOD(bool, Foo, (int), (const))
        Method in a Class Template
        OldMOCK_METHOD1_T(Foo, bool(int))
        NewMOCK_METHOD(bool, Foo, (int))
        Const Method in a Class Template
        OldMOCK_CONST_METHOD1_T(Foo, bool(int))
        NewMOCK_METHOD(bool, Foo, (int), (const))
        Method with Call Type
        OldMOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int))
        NewMOCK_METHOD(bool, Foo, (int), (Calltype(STDMETHODCALLTYPE)))
        Const Method with Call Type
        OldMOCK_CONST_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int))
        NewMOCK_METHOD(bool, Foo, (int), (const, Calltype(STDMETHODCALLTYPE)))
        Method with Call Type in a Class Template
        OldMOCK_METHOD1_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int))
        NewMOCK_METHOD(bool, Foo, (int), (Calltype(STDMETHODCALLTYPE)))
        Const Method with Call Type in a Class Template
        OldMOCK_CONST_METHOD1_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int))
        NewMOCK_METHOD(bool, Foo, (int), (const, Calltype(STDMETHODCALLTYPE)))
        + +### The Nice, the Strict, and the Naggy {#NiceStrictNaggy} + +If a mock method has no `EXPECT_CALL` spec but is called, we say that it's an +"uninteresting call", and the default action (which can be specified using +`ON_CALL()`) of the method will be taken. Currently, an uninteresting call will +also by default cause gMock to print a warning. + +However, sometimes you may want to ignore these uninteresting calls, and +sometimes you may want to treat them as errors. gMock lets you make the decision +on a per-mock-object basis. + +Suppose your test uses a mock class `MockFoo`: + +```cpp +TEST(...) { + MockFoo mock_foo; + EXPECT_CALL(mock_foo, DoThis()); + ... code that uses mock_foo ... +} +``` + +If a method of `mock_foo` other than `DoThis()` is called, you will get a +warning. However, if you rewrite your test to use `NiceMock` instead, +you can suppress the warning: + +```cpp +using ::testing::NiceMock; + +TEST(...) { + NiceMock mock_foo; + EXPECT_CALL(mock_foo, DoThis()); + ... code that uses mock_foo ... +} +``` + +`NiceMock` is a subclass of `MockFoo`, so it can be used wherever +`MockFoo` is accepted. + +It also works if `MockFoo`'s constructor takes some arguments, as +`NiceMock` "inherits" `MockFoo`'s constructors: + +```cpp +using ::testing::NiceMock; + +TEST(...) { + NiceMock mock_foo(5, "hi"); // Calls MockFoo(5, "hi"). + EXPECT_CALL(mock_foo, DoThis()); + ... code that uses mock_foo ... +} +``` + +The usage of `StrictMock` is similar, except that it makes all uninteresting +calls failures: + +```cpp +using ::testing::StrictMock; + +TEST(...) { + StrictMock mock_foo; + EXPECT_CALL(mock_foo, DoThis()); + ... code that uses mock_foo ... + + // The test will fail if a method of mock_foo other than DoThis() + // is called. +} +``` + +{: .callout .note} +NOTE: `NiceMock` and `StrictMock` only affects *uninteresting* calls (calls of +*methods* with no expectations); they do not affect *unexpected* calls (calls of +methods with expectations, but they don't match). See +[Understanding Uninteresting vs Unexpected Calls](#uninteresting-vs-unexpected). + +There are some caveats though (sadly they are side effects of C++'s +limitations): + +1. `NiceMock` and `StrictMock` only work for mock methods + defined using the `MOCK_METHOD` macro **directly** in the `MockFoo` class. + If a mock method is defined in a **base class** of `MockFoo`, the "nice" or + "strict" modifier may not affect it, depending on the compiler. In + particular, nesting `NiceMock` and `StrictMock` (e.g. + `NiceMock >`) is **not** supported. +2. `NiceMock` and `StrictMock` may not work correctly if the + destructor of `MockFoo` is not virtual. We would like to fix this, but it + requires cleaning up existing tests. + +Finally, you should be **very cautious** about when to use naggy or strict +mocks, as they tend to make tests more brittle and harder to maintain. When you +refactor your code without changing its externally visible behavior, ideally you +shouldn't need to update any tests. If your code interacts with a naggy mock, +however, you may start to get spammed with warnings as the result of your +change. Worse, if your code interacts with a strict mock, your tests may start +to fail and you'll be forced to fix them. Our general recommendation is to use +nice mocks (not yet the default) most of the time, use naggy mocks (the current +default) when developing or debugging tests, and use strict mocks only as the +last resort. + +### Simplifying the Interface without Breaking Existing Code {#SimplerInterfaces} + +Sometimes a method has a long list of arguments that is mostly uninteresting. +For example: + +```cpp +class LogSink { + public: + ... + virtual void send(LogSeverity severity, const char* full_filename, + const char* base_filename, int line, + const struct tm* tm_time, + const char* message, size_t message_len) = 0; +}; +``` + +This method's argument list is lengthy and hard to work with (the `message` +argument is not even 0-terminated). If we mock it as is, using the mock will be +awkward. If, however, we try to simplify this interface, we'll need to fix all +clients depending on it, which is often infeasible. + +The trick is to redispatch the method in the mock class: + +```cpp +class ScopedMockLog : public LogSink { + public: + ... + void send(LogSeverity severity, const char* full_filename, + const char* base_filename, int line, const tm* tm_time, + const char* message, size_t message_len) override { + // We are only interested in the log severity, full file name, and + // log message. + Log(severity, full_filename, std::string(message, message_len)); + } + + // Implements the mock method: + // + // void Log(LogSeverity severity, + // const string& file_path, + // const string& message); + MOCK_METHOD(void, Log, + (LogSeverity severity, const string& file_path, + const string& message)); +}; +``` + +By defining a new mock method with a trimmed argument list, we make the mock +class more user-friendly. + +This technique may also be applied to make overloaded methods more amenable to +mocking. For example, when overloads have been used to implement default +arguments: + +```cpp +class MockTurtleFactory : public TurtleFactory { + public: + Turtle* MakeTurtle(int length, int weight) override { ... } + Turtle* MakeTurtle(int length, int weight, int speed) override { ... } + + // the above methods delegate to this one: + MOCK_METHOD(Turtle*, DoMakeTurtle, ()); +}; +``` + +This allows tests that don't care which overload was invoked to avoid specifying +argument matchers: + +```cpp +ON_CALL(factory, DoMakeTurtle) + .WillByDefault(Return(MakeMockTurtle())); +``` + +### Alternative to Mocking Concrete Classes + +Often you may find yourself using classes that don't implement interfaces. In +order to test your code that uses such a class (let's call it `Concrete`), you +may be tempted to make the methods of `Concrete` virtual and then mock it. + +Try not to do that. + +Making a non-virtual function virtual is a big decision. It creates an extension +point where subclasses can tweak your class' behavior. This weakens your control +on the class because now it's harder to maintain the class invariants. You +should make a function virtual only when there is a valid reason for a subclass +to override it. + +Mocking concrete classes directly is problematic as it creates a tight coupling +between the class and the tests - any small change in the class may invalidate +your tests and make test maintenance a pain. + +To avoid such problems, many programmers have been practicing "coding to +interfaces": instead of talking to the `Concrete` class, your code would define +an interface and talk to it. Then you implement that interface as an adaptor on +top of `Concrete`. In tests, you can easily mock that interface to observe how +your code is doing. + +This technique incurs some overhead: + +* You pay the cost of virtual function calls (usually not a problem). +* There is more abstraction for the programmers to learn. + +However, it can also bring significant benefits in addition to better +testability: + +* `Concrete`'s API may not fit your problem domain very well, as you may not + be the only client it tries to serve. By designing your own interface, you + have a chance to tailor it to your need - you may add higher-level + functionalities, rename stuff, etc instead of just trimming the class. This + allows you to write your code (user of the interface) in a more natural way, + which means it will be more readable, more maintainable, and you'll be more + productive. +* If `Concrete`'s implementation ever has to change, you don't have to rewrite + everywhere it is used. Instead, you can absorb the change in your + implementation of the interface, and your other code and tests will be + insulated from this change. + +Some people worry that if everyone is practicing this technique, they will end +up writing lots of redundant code. This concern is totally understandable. +However, there are two reasons why it may not be the case: + +* Different projects may need to use `Concrete` in different ways, so the best + interfaces for them will be different. Therefore, each of them will have its + own domain-specific interface on top of `Concrete`, and they will not be the + same code. +* If enough projects want to use the same interface, they can always share it, + just like they have been sharing `Concrete`. You can check in the interface + and the adaptor somewhere near `Concrete` (perhaps in a `contrib` + sub-directory) and let many projects use it. + +You need to weigh the pros and cons carefully for your particular problem, but +I'd like to assure you that the Java community has been practicing this for a +long time and it's a proven effective technique applicable in a wide variety of +situations. :-) + +### Delegating Calls to a Fake {#DelegatingToFake} + +Some times you have a non-trivial fake implementation of an interface. For +example: + +```cpp +class Foo { + public: + virtual ~Foo() {} + virtual char DoThis(int n) = 0; + virtual void DoThat(const char* s, int* p) = 0; +}; + +class FakeFoo : public Foo { + public: + char DoThis(int n) override { + return (n > 0) ? '+' : + (n < 0) ? '-' : '0'; + } + + void DoThat(const char* s, int* p) override { + *p = strlen(s); + } +}; +``` + +Now you want to mock this interface such that you can set expectations on it. +However, you also want to use `FakeFoo` for the default behavior, as duplicating +it in the mock object is, well, a lot of work. + +When you define the mock class using gMock, you can have it delegate its default +action to a fake class you already have, using this pattern: + +```cpp +class MockFoo : public Foo { + public: + // Normal mock method definitions using gMock. + MOCK_METHOD(char, DoThis, (int n), (override)); + MOCK_METHOD(void, DoThat, (const char* s, int* p), (override)); + + // Delegates the default actions of the methods to a FakeFoo object. + // This must be called *before* the custom ON_CALL() statements. + void DelegateToFake() { + ON_CALL(*this, DoThis).WillByDefault([this](int n) { + return fake_.DoThis(n); + }); + ON_CALL(*this, DoThat).WillByDefault([this](const char* s, int* p) { + fake_.DoThat(s, p); + }); + } + + private: + FakeFoo fake_; // Keeps an instance of the fake in the mock. +}; +``` + +With that, you can use `MockFoo` in your tests as usual. Just remember that if +you don't explicitly set an action in an `ON_CALL()` or `EXPECT_CALL()`, the +fake will be called upon to do it.: + +```cpp +using ::testing::_; + +TEST(AbcTest, Xyz) { + MockFoo foo; + + foo.DelegateToFake(); // Enables the fake for delegation. + + // Put your ON_CALL(foo, ...)s here, if any. + + // No action specified, meaning to use the default action. + EXPECT_CALL(foo, DoThis(5)); + EXPECT_CALL(foo, DoThat(_, _)); + + int n = 0; + EXPECT_EQ(foo.DoThis(5), '+'); // FakeFoo::DoThis() is invoked. + foo.DoThat("Hi", &n); // FakeFoo::DoThat() is invoked. + EXPECT_EQ(n, 2); +} +``` + +**Some tips:** + +* If you want, you can still override the default action by providing your own + `ON_CALL()` or using `.WillOnce()` / `.WillRepeatedly()` in `EXPECT_CALL()`. +* In `DelegateToFake()`, you only need to delegate the methods whose fake + implementation you intend to use. + +* The general technique discussed here works for overloaded methods, but + you'll need to tell the compiler which version you mean. To disambiguate a + mock function (the one you specify inside the parentheses of `ON_CALL()`), + use [this technique](#SelectOverload); to disambiguate a fake function (the + one you place inside `Invoke()`), use a `static_cast` to specify the + function's type. For instance, if class `Foo` has methods `char DoThis(int + n)` and `bool DoThis(double x) const`, and you want to invoke the latter, + you need to write `Invoke(&fake_, static_cast(&FakeFoo::DoThis))` instead of `Invoke(&fake_, &FakeFoo::DoThis)` + (The strange-looking thing inside the angled brackets of `static_cast` is + the type of a function pointer to the second `DoThis()` method.). + +* Having to mix a mock and a fake is often a sign of something gone wrong. + Perhaps you haven't got used to the interaction-based way of testing yet. Or + perhaps your interface is taking on too many roles and should be split up. + Therefore, **don't abuse this**. We would only recommend to do it as an + intermediate step when you are refactoring your code. + +Regarding the tip on mixing a mock and a fake, here's an example on why it may +be a bad sign: Suppose you have a class `System` for low-level system +operations. In particular, it does file and I/O operations. And suppose you want +to test how your code uses `System` to do I/O, and you just want the file +operations to work normally. If you mock out the entire `System` class, you'll +have to provide a fake implementation for the file operation part, which +suggests that `System` is taking on too many roles. + +Instead, you can define a `FileOps` interface and an `IOOps` interface and split +`System`'s functionalities into the two. Then you can mock `IOOps` without +mocking `FileOps`. + +### Delegating Calls to a Real Object + +When using testing doubles (mocks, fakes, stubs, and etc), sometimes their +behaviors will differ from those of the real objects. This difference could be +either intentional (as in simulating an error such that you can test the error +handling code) or unintentional. If your mocks have different behaviors than the +real objects by mistake, you could end up with code that passes the tests but +fails in production. + +You can use the *delegating-to-real* technique to ensure that your mock has the +same behavior as the real object while retaining the ability to validate calls. +This technique is very similar to the [delegating-to-fake](#DelegatingToFake) +technique, the difference being that we use a real object instead of a fake. +Here's an example: + +```cpp +using ::testing::AtLeast; + +class MockFoo : public Foo { + public: + MockFoo() { + // By default, all calls are delegated to the real object. + ON_CALL(*this, DoThis).WillByDefault([this](int n) { + return real_.DoThis(n); + }); + ON_CALL(*this, DoThat).WillByDefault([this](const char* s, int* p) { + real_.DoThat(s, p); + }); + ... + } + MOCK_METHOD(char, DoThis, ...); + MOCK_METHOD(void, DoThat, ...); + ... + private: + Foo real_; +}; + +... + MockFoo mock; + EXPECT_CALL(mock, DoThis()) + .Times(3); + EXPECT_CALL(mock, DoThat("Hi")) + .Times(AtLeast(1)); + ... use mock in test ... +``` + +With this, gMock will verify that your code made the right calls (with the right +arguments, in the right order, called the right number of times, etc), and a +real object will answer the calls (so the behavior will be the same as in +production). This gives you the best of both worlds. + +### Delegating Calls to a Parent Class + +Ideally, you should code to interfaces, whose methods are all pure virtual. In +reality, sometimes you do need to mock a virtual method that is not pure (i.e, +it already has an implementation). For example: + +```cpp +class Foo { + public: + virtual ~Foo(); + + virtual void Pure(int n) = 0; + virtual int Concrete(const char* str) { ... } +}; + +class MockFoo : public Foo { + public: + // Mocking a pure method. + MOCK_METHOD(void, Pure, (int n), (override)); + // Mocking a concrete method. Foo::Concrete() is shadowed. + MOCK_METHOD(int, Concrete, (const char* str), (override)); +}; +``` + +Sometimes you may want to call `Foo::Concrete()` instead of +`MockFoo::Concrete()`. Perhaps you want to do it as part of a stub action, or +perhaps your test doesn't need to mock `Concrete()` at all (but it would be +oh-so painful to have to define a new mock class whenever you don't need to mock +one of its methods). + +You can call `Foo::Concrete()` inside an action by: + +```cpp +... + EXPECT_CALL(foo, Concrete).WillOnce([&foo](const char* str) { + return foo.Foo::Concrete(str); + }); +``` + +or tell the mock object that you don't want to mock `Concrete()`: + +```cpp +... + ON_CALL(foo, Concrete).WillByDefault([&foo](const char* str) { + return foo.Foo::Concrete(str); + }); +``` + +(Why don't we just write `{ return foo.Concrete(str); }`? If you do that, +`MockFoo::Concrete()` will be called (and cause an infinite recursion) since +`Foo::Concrete()` is virtual. That's just how C++ works.) + +## Using Matchers + +### Matching Argument Values Exactly + +You can specify exactly which arguments a mock method is expecting: + +```cpp +using ::testing::Return; +... + EXPECT_CALL(foo, DoThis(5)) + .WillOnce(Return('a')); + EXPECT_CALL(foo, DoThat("Hello", bar)); +``` + +### Using Simple Matchers + +You can use matchers to match arguments that have a certain property: + +```cpp +using ::testing::NotNull; +using ::testing::Return; +... + EXPECT_CALL(foo, DoThis(Ge(5))) // The argument must be >= 5. + .WillOnce(Return('a')); + EXPECT_CALL(foo, DoThat("Hello", NotNull())); + // The second argument must not be NULL. +``` + +A frequently used matcher is `_`, which matches anything: + +```cpp + EXPECT_CALL(foo, DoThat(_, NotNull())); +``` + +### Combining Matchers {#CombiningMatchers} + +You can build complex matchers from existing ones using `AllOf()`, +`AllOfArray()`, `AnyOf()`, `AnyOfArray()` and `Not()`: + +```cpp +using ::testing::AllOf; +using ::testing::Gt; +using ::testing::HasSubstr; +using ::testing::Ne; +using ::testing::Not; +... + // The argument must be > 5 and != 10. + EXPECT_CALL(foo, DoThis(AllOf(Gt(5), + Ne(10)))); + + // The first argument must not contain sub-string "blah". + EXPECT_CALL(foo, DoThat(Not(HasSubstr("blah")), + NULL)); +``` + +Matchers are function objects, and parametrized matchers can be composed just +like any other function. However because their types can be long and rarely +provide meaningful information, it can be easier to express them with C++14 +generic lambdas to avoid specifying types. For example, + +```cpp +using ::testing::Contains; +using ::testing::Property; + +inline constexpr auto HasFoo = [](const auto& f) { + return Property("foo", &MyClass::foo, Contains(f)); +}; +... + EXPECT_THAT(x, HasFoo("blah")); +``` + +### Casting Matchers {#SafeMatcherCast} + +gMock matchers are statically typed, meaning that the compiler can catch your +mistake if you use a matcher of the wrong type (for example, if you use `Eq(5)` +to match a `string` argument). Good for you! + +Sometimes, however, you know what you're doing and want the compiler to give you +some slack. One example is that you have a matcher for `long` and the argument +you want to match is `int`. While the two types aren't exactly the same, there +is nothing really wrong with using a `Matcher` to match an `int` - after +all, we can first convert the `int` argument to a `long` losslessly before +giving it to the matcher. + +To support this need, gMock gives you the `SafeMatcherCast(m)` function. It +casts a matcher `m` to type `Matcher`. To ensure safety, gMock checks that +(let `U` be the type `m` accepts : + +1. Type `T` can be *implicitly* cast to type `U`; +2. When both `T` and `U` are built-in arithmetic types (`bool`, integers, and + floating-point numbers), the conversion from `T` to `U` is not lossy (in + other words, any value representable by `T` can also be represented by `U`); + and +3. When `U` is a reference, `T` must also be a reference (as the underlying + matcher may be interested in the address of the `U` value). + +The code won't compile if any of these conditions isn't met. + +Here's one example: + +```cpp +using ::testing::SafeMatcherCast; + +// A base class and a child class. +class Base { ... }; +class Derived : public Base { ... }; + +class MockFoo : public Foo { + public: + MOCK_METHOD(void, DoThis, (Derived* derived), (override)); +}; + +... + MockFoo foo; + // m is a Matcher we got from somewhere. + EXPECT_CALL(foo, DoThis(SafeMatcherCast(m))); +``` + +If you find `SafeMatcherCast(m)` too limiting, you can use a similar function +`MatcherCast(m)`. The difference is that `MatcherCast` works as long as you +can `static_cast` type `T` to type `U`. + +`MatcherCast` essentially lets you bypass C++'s type system (`static_cast` isn't +always safe as it could throw away information, for example), so be careful not +to misuse/abuse it. + +### Selecting Between Overloaded Functions {#SelectOverload} + +If you expect an overloaded function to be called, the compiler may need some +help on which overloaded version it is. + +To disambiguate functions overloaded on the const-ness of this object, use the +`Const()` argument wrapper. + +```cpp +using ::testing::ReturnRef; + +class MockFoo : public Foo { + ... + MOCK_METHOD(Bar&, GetBar, (), (override)); + MOCK_METHOD(const Bar&, GetBar, (), (const, override)); +}; + +... + MockFoo foo; + Bar bar1, bar2; + EXPECT_CALL(foo, GetBar()) // The non-const GetBar(). + .WillOnce(ReturnRef(bar1)); + EXPECT_CALL(Const(foo), GetBar()) // The const GetBar(). + .WillOnce(ReturnRef(bar2)); +``` + +(`Const()` is defined by gMock and returns a `const` reference to its argument.) + +To disambiguate overloaded functions with the same number of arguments but +different argument types, you may need to specify the exact type of a matcher, +either by wrapping your matcher in `Matcher()`, or using a matcher whose +type is fixed (`TypedEq`, `An()`, etc): + +```cpp +using ::testing::An; +using ::testing::Matcher; +using ::testing::TypedEq; + +class MockPrinter : public Printer { + public: + MOCK_METHOD(void, Print, (int n), (override)); + MOCK_METHOD(void, Print, (char c), (override)); +}; + +TEST(PrinterTest, Print) { + MockPrinter printer; + + EXPECT_CALL(printer, Print(An())); // void Print(int); + EXPECT_CALL(printer, Print(Matcher(Lt(5)))); // void Print(int); + EXPECT_CALL(printer, Print(TypedEq('a'))); // void Print(char); + + printer.Print(3); + printer.Print(6); + printer.Print('a'); +} +``` + +### Performing Different Actions Based on the Arguments + +When a mock method is called, the *last* matching expectation that's still +active will be selected (think "newer overrides older"). So, you can make a +method do different things depending on its argument values like this: + +```cpp +using ::testing::_; +using ::testing::Lt; +using ::testing::Return; +... + // The default case. + EXPECT_CALL(foo, DoThis(_)) + .WillRepeatedly(Return('b')); + // The more specific case. + EXPECT_CALL(foo, DoThis(Lt(5))) + .WillRepeatedly(Return('a')); +``` + +Now, if `foo.DoThis()` is called with a value less than 5, `'a'` will be +returned; otherwise `'b'` will be returned. + +### Matching Multiple Arguments as a Whole + +Sometimes it's not enough to match the arguments individually. For example, we +may want to say that the first argument must be less than the second argument. +The `With()` clause allows us to match all arguments of a mock function as a +whole. For example, + +```cpp +using ::testing::_; +using ::testing::Ne; +using ::testing::Lt; +... + EXPECT_CALL(foo, InRange(Ne(0), _)) + .With(Lt()); +``` + +says that the first argument of `InRange()` must not be 0, and must be less than +the second argument. + +The expression inside `With()` must be a matcher of type `Matcher>`, where `A1`, ..., `An` are the types of the function arguments. + +You can also write `AllArgs(m)` instead of `m` inside `.With()`. The two forms +are equivalent, but `.With(AllArgs(Lt()))` is more readable than `.With(Lt())`. + +You can use `Args(m)` to match the `n` selected arguments (as a +tuple) against `m`. For example, + +```cpp +using ::testing::_; +using ::testing::AllOf; +using ::testing::Args; +using ::testing::Lt; +... + EXPECT_CALL(foo, Blah) + .With(AllOf(Args<0, 1>(Lt()), Args<1, 2>(Lt()))); +``` + +says that `Blah` will be called with arguments `x`, `y`, and `z` where `x < y < +z`. Note that in this example, it wasn't necessary to specify the positional +matchers. + +As a convenience and example, gMock provides some matchers for 2-tuples, +including the `Lt()` matcher above. See +[Multi-argument Matchers](reference/matchers.md#MultiArgMatchers) for the +complete list. + +Note that if you want to pass the arguments to a predicate of your own (e.g. +`.With(Args<0, 1>(Truly(&MyPredicate)))`), that predicate MUST be written to +take a `std::tuple` as its argument; gMock will pass the `n` selected arguments +as *one* single tuple to the predicate. + +### Using Matchers as Predicates + +Have you noticed that a matcher is just a fancy predicate that also knows how to +describe itself? Many existing algorithms take predicates as arguments (e.g. +those defined in STL's `` header), and it would be a shame if gMock +matchers were not allowed to participate. + +Luckily, you can use a matcher where a unary predicate functor is expected by +wrapping it inside the `Matches()` function. For example, + +```cpp +#include +#include + +using ::testing::Matches; +using ::testing::Ge; + +vector v; +... +// How many elements in v are >= 10? +const int count = count_if(v.begin(), v.end(), Matches(Ge(10))); +``` + +Since you can build complex matchers from simpler ones easily using gMock, this +gives you a way to conveniently construct composite predicates (doing the same +using STL's `` header is just painful). For example, here's a +predicate that's satisfied by any number that is >= 0, <= 100, and != 50: + +```cpp +using ::testing::AllOf; +using ::testing::Ge; +using ::testing::Le; +using ::testing::Matches; +using ::testing::Ne; +... +Matches(AllOf(Ge(0), Le(100), Ne(50))) +``` + +### Using Matchers in googletest Assertions + +See [`EXPECT_THAT`](reference/assertions.md#EXPECT_THAT) in the Assertions +Reference. + +### Using Predicates as Matchers + +gMock provides a set of built-in matchers for matching arguments with expected +values—see the [Matchers Reference](reference/matchers.md) for more information. +In case you find the built-in set lacking, you can use an arbitrary unary +predicate function or functor as a matcher - as long as the predicate accepts a +value of the type you want. You do this by wrapping the predicate inside the +`Truly()` function, for example: + +```cpp +using ::testing::Truly; + +int IsEven(int n) { return (n % 2) == 0 ? 1 : 0; } +... + // Bar() must be called with an even number. + EXPECT_CALL(foo, Bar(Truly(IsEven))); +``` + +Note that the predicate function / functor doesn't have to return `bool`. It +works as long as the return value can be used as the condition in the statement +`if (condition) ...`. + +### Matching Arguments that Are Not Copyable + +When you do an `EXPECT_CALL(mock_obj, Foo(bar))`, gMock saves away a copy of +`bar`. When `Foo()` is called later, gMock compares the argument to `Foo()` with +the saved copy of `bar`. This way, you don't need to worry about `bar` being +modified or destroyed after the `EXPECT_CALL()` is executed. The same is true +when you use matchers like `Eq(bar)`, `Le(bar)`, and so on. + +But what if `bar` cannot be copied (i.e. has no copy constructor)? You could +define your own matcher function or callback and use it with `Truly()`, as the +previous couple of recipes have shown. Or, you may be able to get away from it +if you can guarantee that `bar` won't be changed after the `EXPECT_CALL()` is +executed. Just tell gMock that it should save a reference to `bar`, instead of a +copy of it. Here's how: + +```cpp +using ::testing::Eq; +using ::testing::Lt; +... + // Expects that Foo()'s argument == bar. + EXPECT_CALL(mock_obj, Foo(Eq(std::ref(bar)))); + + // Expects that Foo()'s argument < bar. + EXPECT_CALL(mock_obj, Foo(Lt(std::ref(bar)))); +``` + +Remember: if you do this, don't change `bar` after the `EXPECT_CALL()`, or the +result is undefined. + +### Validating a Member of an Object + +Often a mock function takes a reference to object as an argument. When matching +the argument, you may not want to compare the entire object against a fixed +object, as that may be over-specification. Instead, you may need to validate a +certain member variable or the result of a certain getter method of the object. +You can do this with `Field()` and `Property()`. More specifically, + +```cpp +Field(&Foo::bar, m) +``` + +is a matcher that matches a `Foo` object whose `bar` member variable satisfies +matcher `m`. + +```cpp +Property(&Foo::baz, m) +``` + +is a matcher that matches a `Foo` object whose `baz()` method returns a value +that satisfies matcher `m`. + +For example: + +| Expression | Description | +| :--------------------------- | :--------------------------------------- | +| `Field(&Foo::number, Ge(3))` | Matches `x` where `x.number >= 3`. | +| `Property(&Foo::name, StartsWith("John "))` | Matches `x` where `x.name()` starts with `"John "`. | + +Note that in `Property(&Foo::baz, ...)`, method `baz()` must take no argument +and be declared as `const`. Don't use `Property()` against member functions that +you do not own, because taking addresses of functions is fragile and generally +not part of the contract of the function. + +`Field()` and `Property()` can also match plain pointers to objects. For +instance, + +```cpp +using ::testing::Field; +using ::testing::Ge; +... +Field(&Foo::number, Ge(3)) +``` + +matches a plain pointer `p` where `p->number >= 3`. If `p` is `NULL`, the match +will always fail regardless of the inner matcher. + +What if you want to validate more than one members at the same time? Remember +that there are [`AllOf()` and `AllOfArray()`](#CombiningMatchers). + +Finally `Field()` and `Property()` provide overloads that take the field or +property names as the first argument to include it in the error message. This +can be useful when creating combined matchers. + +```cpp +using ::testing::AllOf; +using ::testing::Field; +using ::testing::Matcher; +using ::testing::SafeMatcherCast; + +Matcher IsFoo(const Foo& foo) { + return AllOf(Field("some_field", &Foo::some_field, foo.some_field), + Field("other_field", &Foo::other_field, foo.other_field), + Field("last_field", &Foo::last_field, foo.last_field)); +} +``` + +### Validating the Value Pointed to by a Pointer Argument + +C++ functions often take pointers as arguments. You can use matchers like +`IsNull()`, `NotNull()`, and other comparison matchers to match a pointer, but +what if you want to make sure the value *pointed to* by the pointer, instead of +the pointer itself, has a certain property? Well, you can use the `Pointee(m)` +matcher. + +`Pointee(m)` matches a pointer if and only if `m` matches the value the pointer +points to. For example: + +```cpp +using ::testing::Ge; +using ::testing::Pointee; +... + EXPECT_CALL(foo, Bar(Pointee(Ge(3)))); +``` + +expects `foo.Bar()` to be called with a pointer that points to a value greater +than or equal to 3. + +One nice thing about `Pointee()` is that it treats a `NULL` pointer as a match +failure, so you can write `Pointee(m)` instead of + +```cpp +using ::testing::AllOf; +using ::testing::NotNull; +using ::testing::Pointee; +... + AllOf(NotNull(), Pointee(m)) +``` + +without worrying that a `NULL` pointer will crash your test. + +Also, did we tell you that `Pointee()` works with both raw pointers **and** +smart pointers (`std::unique_ptr`, `std::shared_ptr`, etc)? + +What if you have a pointer to pointer? You guessed it - you can use nested +`Pointee()` to probe deeper inside the value. For example, +`Pointee(Pointee(Lt(3)))` matches a pointer that points to a pointer that points +to a number less than 3 (what a mouthful...). + +### Defining a Custom Matcher Class {#CustomMatcherClass} + +Most matchers can be simply defined using [the MATCHER* macros](#NewMatchers), +which are terse and flexible, and produce good error messages. However, these +macros are not very explicit about the interfaces they create and are not always +suitable, especially for matchers that will be widely reused. + +For more advanced cases, you may need to define your own matcher class. A custom +matcher allows you to test a specific invariant property of that object. Let's +take a look at how to do so. + +Imagine you have a mock function that takes an object of type `Foo`, which has +an `int bar()` method and an `int baz()` method. You want to constrain that the +argument's `bar()` value plus its `baz()` value is a given number. (This is an +invariant.) Here's how we can write and use a matcher class to do so: + +```cpp +class BarPlusBazEqMatcher { + public: + using is_gtest_matcher = void; + + explicit BarPlusBazEqMatcher(int expected_sum) + : expected_sum_(expected_sum) {} + + bool MatchAndExplain(const Foo& foo, + std::ostream* /* listener */) const { + return (foo.bar() + foo.baz()) == expected_sum_; + } + + void DescribeTo(std::ostream* os) const { + *os << "bar() + baz() equals " << expected_sum_; + } + + void DescribeNegationTo(std::ostream* os) const { + *os << "bar() + baz() does not equal " << expected_sum_; + } + private: + const int expected_sum_; +}; + +::testing::Matcher BarPlusBazEq(int expected_sum) { + return BarPlusBazEqMatcher(expected_sum); +} + +... + Foo foo; + EXPECT_THAT(foo, BarPlusBazEq(5))...; +``` + +### Matching Containers + +Sometimes an STL container (e.g. list, vector, map, ...) is passed to a mock +function and you may want to validate it. Since most STL containers support the +`==` operator, you can write `Eq(expected_container)` or simply +`expected_container` to match a container exactly. + +Sometimes, though, you may want to be more flexible (for example, the first +element must be an exact match, but the second element can be any positive +number, and so on). Also, containers used in tests often have a small number of +elements, and having to define the expected container out-of-line is a bit of a +hassle. + +You can use the `ElementsAre()` or `UnorderedElementsAre()` matcher in such +cases: + +```cpp +using ::testing::_; +using ::testing::ElementsAre; +using ::testing::Gt; +... + MOCK_METHOD(void, Foo, (const vector& numbers), (override)); +... + EXPECT_CALL(mock, Foo(ElementsAre(1, Gt(0), _, 5))); +``` + +The above matcher says that the container must have 4 elements, which must be 1, +greater than 0, anything, and 5 respectively. + +If you instead write: + +```cpp +using ::testing::_; +using ::testing::Gt; +using ::testing::UnorderedElementsAre; +... + MOCK_METHOD(void, Foo, (const vector& numbers), (override)); +... + EXPECT_CALL(mock, Foo(UnorderedElementsAre(1, Gt(0), _, 5))); +``` + +It means that the container must have 4 elements, which (under some permutation) +must be 1, greater than 0, anything, and 5 respectively. + +As an alternative you can place the arguments in a C-style array and use +`ElementsAreArray()` or `UnorderedElementsAreArray()` instead: + +```cpp +using ::testing::ElementsAreArray; +... + // ElementsAreArray accepts an array of element values. + const int expected_vector1[] = {1, 5, 2, 4, ...}; + EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector1))); + + // Or, an array of element matchers. + Matcher expected_vector2[] = {1, Gt(2), _, 3, ...}; + EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector2))); +``` + +In case the array needs to be dynamically created (and therefore the array size +cannot be inferred by the compiler), you can give `ElementsAreArray()` an +additional argument to specify the array size: + +```cpp +using ::testing::ElementsAreArray; +... + int* const expected_vector3 = new int[count]; + ... fill expected_vector3 with values ... + EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector3, count))); +``` + +Use `Pair` when comparing maps or other associative containers. + +{% raw %} + +```cpp +using ::testing::UnorderedElementsAre; +using ::testing::Pair; +... + absl::flat_hash_map m = {{"a", 1}, {"b", 2}, {"c", 3}}; + EXPECT_THAT(m, UnorderedElementsAre( + Pair("a", 1), Pair("b", 2), Pair("c", 3))); +``` + +{% endraw %} + +**Tips:** + +* `ElementsAre*()` can be used to match *any* container that implements the + STL iterator pattern (i.e. it has a `const_iterator` type and supports + `begin()/end()`), not just the ones defined in STL. It will even work with + container types yet to be written - as long as they follows the above + pattern. +* You can use nested `ElementsAre*()` to match nested (multi-dimensional) + containers. +* If the container is passed by pointer instead of by reference, just write + `Pointee(ElementsAre*(...))`. +* The order of elements *matters* for `ElementsAre*()`. If you are using it + with containers whose element order are undefined (such as a + `std::unordered_map`) you should use `UnorderedElementsAre`. + +### Sharing Matchers + +Under the hood, a gMock matcher object consists of a pointer to a ref-counted +implementation object. Copying matchers is allowed and very efficient, as only +the pointer is copied. When the last matcher that references the implementation +object dies, the implementation object will be deleted. + +Therefore, if you have some complex matcher that you want to use again and +again, there is no need to build it every time. Just assign it to a matcher +variable and use that variable repeatedly! For example, + +```cpp +using ::testing::AllOf; +using ::testing::Gt; +using ::testing::Le; +using ::testing::Matcher; +... + Matcher in_range = AllOf(Gt(5), Le(10)); + ... use in_range as a matcher in multiple EXPECT_CALLs ... +``` + +### Matchers must have no side-effects {#PureMatchers} + +{: .callout .warning} +WARNING: gMock does not guarantee when or how many times a matcher will be +invoked. Therefore, all matchers must be *purely functional*: they cannot have +any side effects, and the match result must not depend on anything other than +the matcher's parameters and the value being matched. + +This requirement must be satisfied no matter how a matcher is defined (e.g., if +it is one of the standard matchers, or a custom matcher). In particular, a +matcher can never call a mock function, as that will affect the state of the +mock object and gMock. + +## Setting Expectations + +### Knowing When to Expect {#UseOnCall} + +**`ON_CALL`** is likely the *single most under-utilized construct* in gMock. + +There are basically two constructs for defining the behavior of a mock object: +`ON_CALL` and `EXPECT_CALL`. The difference? `ON_CALL` defines what happens when +a mock method is called, but doesn't imply any expectation on the method +being called. `EXPECT_CALL` not only defines the behavior, but also sets an +expectation that the method will be called with the given arguments, for the +given number of times (and *in the given order* when you specify the order +too). + +Since `EXPECT_CALL` does more, isn't it better than `ON_CALL`? Not really. Every +`EXPECT_CALL` adds a constraint on the behavior of the code under test. Having +more constraints than necessary is *baaad* - even worse than not having enough +constraints. + +This may be counter-intuitive. How could tests that verify more be worse than +tests that verify less? Isn't verification the whole point of tests? + +The answer lies in *what* a test should verify. **A good test verifies the +contract of the code.** If a test over-specifies, it doesn't leave enough +freedom to the implementation. As a result, changing the implementation without +breaking the contract (e.g. refactoring and optimization), which should be +perfectly fine to do, can break such tests. Then you have to spend time fixing +them, only to see them broken again the next time the implementation is changed. + +Keep in mind that one doesn't have to verify more than one property in one test. +In fact, **it's a good style to verify only one thing in one test.** If you do +that, a bug will likely break only one or two tests instead of dozens (which +case would you rather debug?). If you are also in the habit of giving tests +descriptive names that tell what they verify, you can often easily guess what's +wrong just from the test log itself. + +So use `ON_CALL` by default, and only use `EXPECT_CALL` when you actually intend +to verify that the call is made. For example, you may have a bunch of `ON_CALL`s +in your test fixture to set the common mock behavior shared by all tests in the +same group, and write (scarcely) different `EXPECT_CALL`s in different `TEST_F`s +to verify different aspects of the code's behavior. Compared with the style +where each `TEST` has many `EXPECT_CALL`s, this leads to tests that are more +resilient to implementational changes (and thus less likely to require +maintenance) and makes the intent of the tests more obvious (so they are easier +to maintain when you do need to maintain them). + +If you are bothered by the "Uninteresting mock function call" message printed +when a mock method without an `EXPECT_CALL` is called, you may use a `NiceMock` +instead to suppress all such messages for the mock object, or suppress the +message for specific methods by adding `EXPECT_CALL(...).Times(AnyNumber())`. DO +NOT suppress it by blindly adding an `EXPECT_CALL(...)`, or you'll have a test +that's a pain to maintain. + +### Ignoring Uninteresting Calls + +If you are not interested in how a mock method is called, just don't say +anything about it. In this case, if the method is ever called, gMock will +perform its default action to allow the test program to continue. If you are not +happy with the default action taken by gMock, you can override it using +`DefaultValue::Set()` (described [here](#DefaultValue)) or `ON_CALL()`. + +Please note that once you expressed interest in a particular mock method (via +`EXPECT_CALL()`), all invocations to it must match some expectation. If this +function is called but the arguments don't match any `EXPECT_CALL()` statement, +it will be an error. + +### Disallowing Unexpected Calls + +If a mock method shouldn't be called at all, explicitly say so: + +```cpp +using ::testing::_; +... + EXPECT_CALL(foo, Bar(_)) + .Times(0); +``` + +If some calls to the method are allowed, but the rest are not, just list all the +expected calls: + +```cpp +using ::testing::AnyNumber; +using ::testing::Gt; +... + EXPECT_CALL(foo, Bar(5)); + EXPECT_CALL(foo, Bar(Gt(10))) + .Times(AnyNumber()); +``` + +A call to `foo.Bar()` that doesn't match any of the `EXPECT_CALL()` statements +will be an error. + +### Understanding Uninteresting vs Unexpected Calls {#uninteresting-vs-unexpected} + +*Uninteresting* calls and *unexpected* calls are different concepts in gMock. +*Very* different. + +A call `x.Y(...)` is **uninteresting** if there's *not even a single* +`EXPECT_CALL(x, Y(...))` set. In other words, the test isn't interested in the +`x.Y()` method at all, as evident in that the test doesn't care to say anything +about it. + +A call `x.Y(...)` is **unexpected** if there are *some* `EXPECT_CALL(x, +Y(...))`s set, but none of them matches the call. Put another way, the test is +interested in the `x.Y()` method (therefore it explicitly sets some +`EXPECT_CALL` to verify how it's called); however, the verification fails as the +test doesn't expect this particular call to happen. + +**An unexpected call is always an error,** as the code under test doesn't behave +the way the test expects it to behave. + +**By default, an uninteresting call is not an error,** as it violates no +constraint specified by the test. (gMock's philosophy is that saying nothing +means there is no constraint.) However, it leads to a warning, as it *might* +indicate a problem (e.g. the test author might have forgotten to specify a +constraint). + +In gMock, `NiceMock` and `StrictMock` can be used to make a mock class "nice" or +"strict". How does this affect uninteresting calls and unexpected calls? + +A **nice mock** suppresses uninteresting call *warnings*. It is less chatty than +the default mock, but otherwise is the same. If a test fails with a default +mock, it will also fail using a nice mock instead. And vice versa. Don't expect +making a mock nice to change the test's result. + +A **strict mock** turns uninteresting call warnings into errors. So making a +mock strict may change the test's result. + +Let's look at an example: + +```cpp +TEST(...) { + NiceMock mock_registry; + EXPECT_CALL(mock_registry, GetDomainOwner("google.com")) + .WillRepeatedly(Return("Larry Page")); + + // Use mock_registry in code under test. + ... &mock_registry ... +} +``` + +The sole `EXPECT_CALL` here says that all calls to `GetDomainOwner()` must have +`"google.com"` as the argument. If `GetDomainOwner("yahoo.com")` is called, it +will be an unexpected call, and thus an error. *Having a nice mock doesn't +change the severity of an unexpected call.* + +So how do we tell gMock that `GetDomainOwner()` can be called with some other +arguments as well? The standard technique is to add a "catch all" `EXPECT_CALL`: + +```cpp + EXPECT_CALL(mock_registry, GetDomainOwner(_)) + .Times(AnyNumber()); // catches all other calls to this method. + EXPECT_CALL(mock_registry, GetDomainOwner("google.com")) + .WillRepeatedly(Return("Larry Page")); +``` + +Remember that `_` is the wildcard matcher that matches anything. With this, if +`GetDomainOwner("google.com")` is called, it will do what the second +`EXPECT_CALL` says; if it is called with a different argument, it will do what +the first `EXPECT_CALL` says. + +Note that the order of the two `EXPECT_CALL`s is important, as a newer +`EXPECT_CALL` takes precedence over an older one. + +For more on uninteresting calls, nice mocks, and strict mocks, read +["The Nice, the Strict, and the Naggy"](#NiceStrictNaggy). + +### Ignoring Uninteresting Arguments {#ParameterlessExpectations} + +If your test doesn't care about the parameters (it only cares about the number +or order of calls), you can often simply omit the parameter list: + +```cpp + // Expect foo.Bar( ... ) twice with any arguments. + EXPECT_CALL(foo, Bar).Times(2); + + // Delegate to the given method whenever the factory is invoked. + ON_CALL(foo_factory, MakeFoo) + .WillByDefault(&BuildFooForTest); +``` + +This functionality is only available when a method is not overloaded; to prevent +unexpected behavior it is a compilation error to try to set an expectation on a +method where the specific overload is ambiguous. You can work around this by +supplying a [simpler mock interface](#SimplerInterfaces) than the mocked class +provides. + +This pattern is also useful when the arguments are interesting, but match logic +is substantially complex. You can leave the argument list unspecified and use +SaveArg actions to [save the values for later verification](#SaveArgVerify). If +you do that, you can easily differentiate calling the method the wrong number of +times from calling it with the wrong arguments. + +### Expecting Ordered Calls {#OrderedCalls} + +Although an `EXPECT_CALL()` statement defined later takes precedence when gMock +tries to match a function call with an expectation, by default calls don't have +to happen in the order `EXPECT_CALL()` statements are written. For example, if +the arguments match the matchers in the second `EXPECT_CALL()`, but not those in +the first and third, then the second expectation will be used. + +If you would rather have all calls occur in the order of the expectations, put +the `EXPECT_CALL()` statements in a block where you define a variable of type +`InSequence`: + +```cpp +using ::testing::_; +using ::testing::InSequence; + + { + InSequence s; + + EXPECT_CALL(foo, DoThis(5)); + EXPECT_CALL(bar, DoThat(_)) + .Times(2); + EXPECT_CALL(foo, DoThis(6)); + } +``` + +In this example, we expect a call to `foo.DoThis(5)`, followed by two calls to +`bar.DoThat()` where the argument can be anything, which are in turn followed by +a call to `foo.DoThis(6)`. If a call occurred out-of-order, gMock will report an +error. + +### Expecting Partially Ordered Calls {#PartialOrder} + +Sometimes requiring everything to occur in a predetermined order can lead to +brittle tests. For example, we may care about `A` occurring before both `B` and +`C`, but aren't interested in the relative order of `B` and `C`. In this case, +the test should reflect our real intent, instead of being overly constraining. + +gMock allows you to impose an arbitrary DAG (directed acyclic graph) on the +calls. One way to express the DAG is to use the +[`After` clause](reference/mocking.md#EXPECT_CALL.After) of `EXPECT_CALL`. + +Another way is via the `InSequence()` clause (not the same as the `InSequence` +class), which we borrowed from jMock 2. It's less flexible than `After()`, but +more convenient when you have long chains of sequential calls, as it doesn't +require you to come up with different names for the expectations in the chains. +Here's how it works: + +If we view `EXPECT_CALL()` statements as nodes in a graph, and add an edge from +node A to node B wherever A must occur before B, we can get a DAG. We use the +term "sequence" to mean a directed path in this DAG. Now, if we decompose the +DAG into sequences, we just need to know which sequences each `EXPECT_CALL()` +belongs to in order to be able to reconstruct the original DAG. + +So, to specify the partial order on the expectations we need to do two things: +first to define some `Sequence` objects, and then for each `EXPECT_CALL()` say +which `Sequence` objects it is part of. + +Expectations in the same sequence must occur in the order they are written. For +example, + +```cpp +using ::testing::Sequence; +... + Sequence s1, s2; + + EXPECT_CALL(foo, A()) + .InSequence(s1, s2); + EXPECT_CALL(bar, B()) + .InSequence(s1); + EXPECT_CALL(bar, C()) + .InSequence(s2); + EXPECT_CALL(foo, D()) + .InSequence(s2); +``` + +specifies the following DAG (where `s1` is `A -> B`, and `s2` is `A -> C -> D`): + +```text + +---> B + | + A ---| + | + +---> C ---> D +``` + +This means that A must occur before B and C, and C must occur before D. There's +no restriction about the order other than these. + +### Controlling When an Expectation Retires + +When a mock method is called, gMock only considers expectations that are still +active. An expectation is active when created, and becomes inactive (aka +*retires*) when a call that has to occur later has occurred. For example, in + +```cpp +using ::testing::_; +using ::testing::Sequence; +... + Sequence s1, s2; + + EXPECT_CALL(log, Log(WARNING, _, "File too large.")) // #1 + .Times(AnyNumber()) + .InSequence(s1, s2); + EXPECT_CALL(log, Log(WARNING, _, "Data set is empty.")) // #2 + .InSequence(s1); + EXPECT_CALL(log, Log(WARNING, _, "User not found.")) // #3 + .InSequence(s2); +``` + +as soon as either #2 or #3 is matched, #1 will retire. If a warning `"File too +large."` is logged after this, it will be an error. + +Note that an expectation doesn't retire automatically when it's saturated. For +example, + +```cpp +using ::testing::_; +... + EXPECT_CALL(log, Log(WARNING, _, _)); // #1 + EXPECT_CALL(log, Log(WARNING, _, "File too large.")); // #2 +``` + +says that there will be exactly one warning with the message `"File too +large."`. If the second warning contains this message too, #2 will match again +and result in an upper-bound-violated error. + +If this is not what you want, you can ask an expectation to retire as soon as it +becomes saturated: + +```cpp +using ::testing::_; +... + EXPECT_CALL(log, Log(WARNING, _, _)); // #1 + EXPECT_CALL(log, Log(WARNING, _, "File too large.")) // #2 + .RetiresOnSaturation(); +``` + +Here #2 can be used only once, so if you have two warnings with the message +`"File too large."`, the first will match #2 and the second will match #1 - +there will be no error. + +## Using Actions + +### Returning References from Mock Methods + +If a mock function's return type is a reference, you need to use `ReturnRef()` +instead of `Return()` to return a result: + +```cpp +using ::testing::ReturnRef; + +class MockFoo : public Foo { + public: + MOCK_METHOD(Bar&, GetBar, (), (override)); +}; +... + MockFoo foo; + Bar bar; + EXPECT_CALL(foo, GetBar()) + .WillOnce(ReturnRef(bar)); +... +``` + +### Returning Live Values from Mock Methods + +The `Return(x)` action saves a copy of `x` when the action is created, and +always returns the same value whenever it's executed. Sometimes you may want to +instead return the *live* value of `x` (i.e. its value at the time when the +action is *executed*.). Use either `ReturnRef()` or `ReturnPointee()` for this +purpose. + +If the mock function's return type is a reference, you can do it using +`ReturnRef(x)`, as shown in the previous recipe ("Returning References from Mock +Methods"). However, gMock doesn't let you use `ReturnRef()` in a mock function +whose return type is not a reference, as doing that usually indicates a user +error. So, what shall you do? + +Though you may be tempted, DO NOT use `std::ref()`: + +```cpp +using ::testing::Return; + +class MockFoo : public Foo { + public: + MOCK_METHOD(int, GetValue, (), (override)); +}; +... + int x = 0; + MockFoo foo; + EXPECT_CALL(foo, GetValue()) + .WillRepeatedly(Return(std::ref(x))); // Wrong! + x = 42; + EXPECT_EQ(foo.GetValue(), 42); +``` + +Unfortunately, it doesn't work here. The above code will fail with error: + +```text +Value of: foo.GetValue() + Actual: 0 +Expected: 42 +``` + +The reason is that `Return(*value*)` converts `value` to the actual return type +of the mock function at the time when the action is *created*, not when it is +*executed*. (This behavior was chosen for the action to be safe when `value` is +a proxy object that references some temporary objects.) As a result, +`std::ref(x)` is converted to an `int` value (instead of a `const int&`) when +the expectation is set, and `Return(std::ref(x))` will always return 0. + +`ReturnPointee(pointer)` was provided to solve this problem specifically. It +returns the value pointed to by `pointer` at the time the action is *executed*: + +```cpp +using ::testing::ReturnPointee; +... + int x = 0; + MockFoo foo; + EXPECT_CALL(foo, GetValue()) + .WillRepeatedly(ReturnPointee(&x)); // Note the & here. + x = 42; + EXPECT_EQ(foo.GetValue(), 42); // This will succeed now. +``` + +### Combining Actions + +Want to do more than one thing when a function is called? That's fine. `DoAll()` +allows you to do a sequence of actions every time. Only the return value of the +last action in the sequence will be used. + +```cpp +using ::testing::_; +using ::testing::DoAll; + +class MockFoo : public Foo { + public: + MOCK_METHOD(bool, Bar, (int n), (override)); +}; +... + EXPECT_CALL(foo, Bar(_)) + .WillOnce(DoAll(action_1, + action_2, + ... + action_n)); +``` + +### Verifying Complex Arguments {#SaveArgVerify} + +If you want to verify that a method is called with a particular argument but the +match criteria is complex, it can be difficult to distinguish between +cardinality failures (calling the method the wrong number of times) and argument +match failures. Similarly, if you are matching multiple parameters, it may not +be easy to distinguishing which argument failed to match. For example: + +```cpp + // Not ideal: this could fail because of a problem with arg1 or arg2, or maybe + // just the method wasn't called. + EXPECT_CALL(foo, SendValues(_, ElementsAre(1, 4, 4, 7), EqualsProto( ... ))); +``` + +You can instead save the arguments and test them individually: + +```cpp + EXPECT_CALL(foo, SendValues) + .WillOnce(DoAll(SaveArg<1>(&actual_array), SaveArg<2>(&actual_proto))); + ... run the test + EXPECT_THAT(actual_array, ElementsAre(1, 4, 4, 7)); + EXPECT_THAT(actual_proto, EqualsProto( ... )); +``` + +### Mocking Side Effects {#MockingSideEffects} + +Sometimes a method exhibits its effect not via returning a value but via side +effects. For example, it may change some global state or modify an output +argument. To mock side effects, in general you can define your own action by +implementing `::testing::ActionInterface`. + +If all you need to do is to change an output argument, the built-in +`SetArgPointee()` action is convenient: + +```cpp +using ::testing::_; +using ::testing::SetArgPointee; + +class MockMutator : public Mutator { + public: + MOCK_METHOD(void, Mutate, (bool mutate, int* value), (override)); + ... +} +... + MockMutator mutator; + EXPECT_CALL(mutator, Mutate(true, _)) + .WillOnce(SetArgPointee<1>(5)); +``` + +In this example, when `mutator.Mutate()` is called, we will assign 5 to the +`int` variable pointed to by argument #1 (0-based). + +`SetArgPointee()` conveniently makes an internal copy of the value you pass to +it, removing the need to keep the value in scope and alive. The implication +however is that the value must have a copy constructor and assignment operator. + +If the mock method also needs to return a value as well, you can chain +`SetArgPointee()` with `Return()` using `DoAll()`, remembering to put the +`Return()` statement last: + +```cpp +using ::testing::_; +using ::testing::DoAll; +using ::testing::Return; +using ::testing::SetArgPointee; + +class MockMutator : public Mutator { + public: + ... + MOCK_METHOD(bool, MutateInt, (int* value), (override)); +} +... + MockMutator mutator; + EXPECT_CALL(mutator, MutateInt(_)) + .WillOnce(DoAll(SetArgPointee<0>(5), + Return(true))); +``` + +Note, however, that if you use the `ReturnOKWith()` method, it will override the +values provided by `SetArgPointee()` in the response parameters of your function +call. + +If the output argument is an array, use the `SetArrayArgument(first, last)` +action instead. It copies the elements in source range `[first, last)` to the +array pointed to by the `N`-th (0-based) argument: + +```cpp +using ::testing::NotNull; +using ::testing::SetArrayArgument; + +class MockArrayMutator : public ArrayMutator { + public: + MOCK_METHOD(void, Mutate, (int* values, int num_values), (override)); + ... +} +... + MockArrayMutator mutator; + int values[5] = {1, 2, 3, 4, 5}; + EXPECT_CALL(mutator, Mutate(NotNull(), 5)) + .WillOnce(SetArrayArgument<0>(values, values + 5)); +``` + +This also works when the argument is an output iterator: + +```cpp +using ::testing::_; +using ::testing::SetArrayArgument; + +class MockRolodex : public Rolodex { + public: + MOCK_METHOD(void, GetNames, (std::back_insert_iterator>), + (override)); + ... +} +... + MockRolodex rolodex; + vector names = {"George", "John", "Thomas"}; + EXPECT_CALL(rolodex, GetNames(_)) + .WillOnce(SetArrayArgument<0>(names.begin(), names.end())); +``` + +### Changing a Mock Object's Behavior Based on the State + +If you expect a call to change the behavior of a mock object, you can use +`::testing::InSequence` to specify different behaviors before and after the +call: + +```cpp +using ::testing::InSequence; +using ::testing::Return; + +... + { + InSequence seq; + EXPECT_CALL(my_mock, IsDirty()) + .WillRepeatedly(Return(true)); + EXPECT_CALL(my_mock, Flush()); + EXPECT_CALL(my_mock, IsDirty()) + .WillRepeatedly(Return(false)); + } + my_mock.FlushIfDirty(); +``` + +This makes `my_mock.IsDirty()` return `true` before `my_mock.Flush()` is called +and return `false` afterwards. + +If the behavior change is more complex, you can store the effects in a variable +and make a mock method get its return value from that variable: + +```cpp +using ::testing::_; +using ::testing::SaveArg; +using ::testing::Return; + +ACTION_P(ReturnPointee, p) { return *p; } +... + int previous_value = 0; + EXPECT_CALL(my_mock, GetPrevValue) + .WillRepeatedly(ReturnPointee(&previous_value)); + EXPECT_CALL(my_mock, UpdateValue) + .WillRepeatedly(SaveArg<0>(&previous_value)); + my_mock.DoSomethingToUpdateValue(); +``` + +Here `my_mock.GetPrevValue()` will always return the argument of the last +`UpdateValue()` call. + +### Setting the Default Value for a Return Type {#DefaultValue} + +If a mock method's return type is a built-in C++ type or pointer, by default it +will return 0 when invoked. Also, in C++ 11 and above, a mock method whose +return type has a default constructor will return a default-constructed value by +default. You only need to specify an action if this default value doesn't work +for you. + +Sometimes, you may want to change this default value, or you may want to specify +a default value for types gMock doesn't know about. You can do this using the +`::testing::DefaultValue` class template: + +```cpp +using ::testing::DefaultValue; + +class MockFoo : public Foo { + public: + MOCK_METHOD(Bar, CalculateBar, (), (override)); +}; + + +... + Bar default_bar; + // Sets the default return value for type Bar. + DefaultValue::Set(default_bar); + + MockFoo foo; + + // We don't need to specify an action here, as the default + // return value works for us. + EXPECT_CALL(foo, CalculateBar()); + + foo.CalculateBar(); // This should return default_bar. + + // Unsets the default return value. + DefaultValue::Clear(); +``` + +Please note that changing the default value for a type can make your tests hard +to understand. We recommend you to use this feature judiciously. For example, +you may want to make sure the `Set()` and `Clear()` calls are right next to the +code that uses your mock. + +### Setting the Default Actions for a Mock Method + +You've learned how to change the default value of a given type. However, this +may be too coarse for your purpose: perhaps you have two mock methods with the +same return type and you want them to have different behaviors. The `ON_CALL()` +macro allows you to customize your mock's behavior at the method level: + +```cpp +using ::testing::_; +using ::testing::AnyNumber; +using ::testing::Gt; +using ::testing::Return; +... + ON_CALL(foo, Sign(_)) + .WillByDefault(Return(-1)); + ON_CALL(foo, Sign(0)) + .WillByDefault(Return(0)); + ON_CALL(foo, Sign(Gt(0))) + .WillByDefault(Return(1)); + + EXPECT_CALL(foo, Sign(_)) + .Times(AnyNumber()); + + foo.Sign(5); // This should return 1. + foo.Sign(-9); // This should return -1. + foo.Sign(0); // This should return 0. +``` + +As you may have guessed, when there are more than one `ON_CALL()` statements, +the newer ones in the order take precedence over the older ones. In other words, +the **last** one that matches the function arguments will be used. This matching +order allows you to set up the common behavior in a mock object's constructor or +the test fixture's set-up phase and specialize the mock's behavior later. + +Note that both `ON_CALL` and `EXPECT_CALL` have the same "later statements take +precedence" rule, but they don't interact. That is, `EXPECT_CALL`s have their +own precedence order distinct from the `ON_CALL` precedence order. + +### Using Functions/Methods/Functors/Lambdas as Actions {#FunctionsAsActions} + +If the built-in actions don't suit you, you can use an existing callable +(function, `std::function`, method, functor, lambda) as an action. + +```cpp +using ::testing::_; using ::testing::Invoke; + +class MockFoo : public Foo { + public: + MOCK_METHOD(int, Sum, (int x, int y), (override)); + MOCK_METHOD(bool, ComplexJob, (int x), (override)); +}; + +int CalculateSum(int x, int y) { return x + y; } +int Sum3(int x, int y, int z) { return x + y + z; } + +class Helper { + public: + bool ComplexJob(int x); +}; + +... + MockFoo foo; + Helper helper; + EXPECT_CALL(foo, Sum(_, _)) + .WillOnce(&CalculateSum) + .WillRepeatedly(Invoke(NewPermanentCallback(Sum3, 1))); + EXPECT_CALL(foo, ComplexJob(_)) + .WillOnce(Invoke(&helper, &Helper::ComplexJob)) + .WillOnce([] { return true; }) + .WillRepeatedly([](int x) { return x > 0; }); + + foo.Sum(5, 6); // Invokes CalculateSum(5, 6). + foo.Sum(2, 3); // Invokes Sum3(1, 2, 3). + foo.ComplexJob(10); // Invokes helper.ComplexJob(10). + foo.ComplexJob(-1); // Invokes the inline lambda. +``` + +The only requirement is that the type of the function, etc must be *compatible* +with the signature of the mock function, meaning that the latter's arguments (if +it takes any) can be implicitly converted to the corresponding arguments of the +former, and the former's return type can be implicitly converted to that of the +latter. So, you can invoke something whose type is *not* exactly the same as the +mock function, as long as it's safe to do so - nice, huh? + +Note that: + +* The action takes ownership of the callback and will delete it when the + action itself is destructed. +* If the type of a callback is derived from a base callback type `C`, you need + to implicitly cast it to `C` to resolve the overloading, e.g. + + ```cpp + using ::testing::Invoke; + ... + ResultCallback* is_ok = ...; + ... Invoke(is_ok) ...; // This works. + + BlockingClosure* done = new BlockingClosure; + ... Invoke(implicit_cast(done)) ...; // The cast is necessary. + ``` + +### Using Functions with Extra Info as Actions + +The function or functor you call using `Invoke()` must have the same number of +arguments as the mock function you use it for. Sometimes you may have a function +that takes more arguments, and you are willing to pass in the extra arguments +yourself to fill the gap. You can do this in gMock using callbacks with +pre-bound arguments. Here's an example: + +```cpp +using ::testing::Invoke; + +class MockFoo : public Foo { + public: + MOCK_METHOD(char, DoThis, (int n), (override)); +}; + +char SignOfSum(int x, int y) { + const int sum = x + y; + return (sum > 0) ? '+' : (sum < 0) ? '-' : '0'; +} + +TEST_F(FooTest, Test) { + MockFoo foo; + + EXPECT_CALL(foo, DoThis(2)) + .WillOnce(Invoke(NewPermanentCallback(SignOfSum, 5))); + EXPECT_EQ(foo.DoThis(2), '+'); // Invokes SignOfSum(5, 2). +} +``` + +### Invoking a Function/Method/Functor/Lambda/Callback Without Arguments + +`Invoke()` passes the mock function's arguments to the function, etc being +invoked such that the callee has the full context of the call to work with. If +the invoked function is not interested in some or all of the arguments, it can +simply ignore them. + +Yet, a common pattern is that a test author wants to invoke a function without +the arguments of the mock function. She could do that using a wrapper function +that throws away the arguments before invoking an underlining nullary function. +Needless to say, this can be tedious and obscures the intent of the test. + +There are two solutions to this problem. First, you can pass any callable of +zero args as an action. Alternatively, use `InvokeWithoutArgs()`, which is like +`Invoke()` except that it doesn't pass the mock function's arguments to the +callee. Here's an example of each: + +```cpp +using ::testing::_; +using ::testing::InvokeWithoutArgs; + +class MockFoo : public Foo { + public: + MOCK_METHOD(bool, ComplexJob, (int n), (override)); +}; + +bool Job1() { ... } +bool Job2(int n, char c) { ... } + +... + MockFoo foo; + EXPECT_CALL(foo, ComplexJob(_)) + .WillOnce([] { Job1(); }); + .WillOnce(InvokeWithoutArgs(NewPermanentCallback(Job2, 5, 'a'))); + + foo.ComplexJob(10); // Invokes Job1(). + foo.ComplexJob(20); // Invokes Job2(5, 'a'). +``` + +Note that: + +* The action takes ownership of the callback and will delete it when the + action itself is destructed. +* If the type of a callback is derived from a base callback type `C`, you need + to implicitly cast it to `C` to resolve the overloading, e.g. + + ```cpp + using ::testing::InvokeWithoutArgs; + ... + ResultCallback* is_ok = ...; + ... InvokeWithoutArgs(is_ok) ...; // This works. + + BlockingClosure* done = ...; + ... InvokeWithoutArgs(implicit_cast(done)) ...; + // The cast is necessary. + ``` + +### Invoking an Argument of the Mock Function + +Sometimes a mock function will receive a function pointer, a functor (in other +words, a "callable") as an argument, e.g. + +```cpp +class MockFoo : public Foo { + public: + MOCK_METHOD(bool, DoThis, (int n, (ResultCallback1* callback)), + (override)); +}; +``` + +and you may want to invoke this callable argument: + +```cpp +using ::testing::_; +... + MockFoo foo; + EXPECT_CALL(foo, DoThis(_, _)) + .WillOnce(...); + // Will execute callback->Run(5), where callback is the + // second argument DoThis() receives. +``` + +{: .callout .note} +NOTE: The section below is legacy documentation from before C++ had lambdas: + +Arghh, you need to refer to a mock function argument but C++ has no lambda +(yet), so you have to define your own action. :-( Or do you really? + +Well, gMock has an action to solve *exactly* this problem: + +```cpp +InvokeArgument(arg_1, arg_2, ..., arg_m) +``` + +will invoke the `N`-th (0-based) argument the mock function receives, with +`arg_1`, `arg_2`, ..., and `arg_m`. No matter if the argument is a function +pointer, a functor, or a callback. gMock handles them all. + +With that, you could write: + +```cpp +using ::testing::_; +using ::testing::InvokeArgument; +... + EXPECT_CALL(foo, DoThis(_, _)) + .WillOnce(InvokeArgument<1>(5)); + // Will execute callback->Run(5), where callback is the + // second argument DoThis() receives. +``` + +What if the callable takes an argument by reference? No problem - just wrap it +inside `std::ref()`: + +```cpp + ... + MOCK_METHOD(bool, Bar, + ((ResultCallback2* callback)), + (override)); + ... + using ::testing::_; + using ::testing::InvokeArgument; + ... + MockFoo foo; + Helper helper; + ... + EXPECT_CALL(foo, Bar(_)) + .WillOnce(InvokeArgument<0>(5, std::ref(helper))); + // std::ref(helper) guarantees that a reference to helper, not a copy of + // it, will be passed to the callback. +``` + +What if the callable takes an argument by reference and we do **not** wrap the +argument in `std::ref()`? Then `InvokeArgument()` will *make a copy* of the +argument, and pass a *reference to the copy*, instead of a reference to the +original value, to the callable. This is especially handy when the argument is a +temporary value: + +```cpp + ... + MOCK_METHOD(bool, DoThat, (bool (*f)(const double& x, const string& s)), + (override)); + ... + using ::testing::_; + using ::testing::InvokeArgument; + ... + MockFoo foo; + ... + EXPECT_CALL(foo, DoThat(_)) + .WillOnce(InvokeArgument<0>(5.0, string("Hi"))); + // Will execute (*f)(5.0, string("Hi")), where f is the function pointer + // DoThat() receives. Note that the values 5.0 and string("Hi") are + // temporary and dead once the EXPECT_CALL() statement finishes. Yet + // it's fine to perform this action later, since a copy of the values + // are kept inside the InvokeArgument action. +``` + +### Ignoring an Action's Result + +Sometimes you have an action that returns *something*, but you need an action +that returns `void` (perhaps you want to use it in a mock function that returns +`void`, or perhaps it needs to be used in `DoAll()` and it's not the last in the +list). `IgnoreResult()` lets you do that. For example: + +```cpp +using ::testing::_; +using ::testing::DoAll; +using ::testing::IgnoreResult; +using ::testing::Return; + +int Process(const MyData& data); +string DoSomething(); + +class MockFoo : public Foo { + public: + MOCK_METHOD(void, Abc, (const MyData& data), (override)); + MOCK_METHOD(bool, Xyz, (), (override)); +}; + + ... + MockFoo foo; + EXPECT_CALL(foo, Abc(_)) + // .WillOnce(Invoke(Process)); + // The above line won't compile as Process() returns int but Abc() needs + // to return void. + .WillOnce(IgnoreResult(Process)); + EXPECT_CALL(foo, Xyz()) + .WillOnce(DoAll(IgnoreResult(DoSomething), + // Ignores the string DoSomething() returns. + Return(true))); +``` + +Note that you **cannot** use `IgnoreResult()` on an action that already returns +`void`. Doing so will lead to ugly compiler errors. + +### Selecting an Action's Arguments {#SelectingArgs} + +Say you have a mock function `Foo()` that takes seven arguments, and you have a +custom action that you want to invoke when `Foo()` is called. Trouble is, the +custom action only wants three arguments: + +```cpp +using ::testing::_; +using ::testing::Invoke; +... + MOCK_METHOD(bool, Foo, + (bool visible, const string& name, int x, int y, + (const map>), double& weight, double min_weight, + double max_wight)); +... +bool IsVisibleInQuadrant1(bool visible, int x, int y) { + return visible && x >= 0 && y >= 0; +} +... + EXPECT_CALL(mock, Foo) + .WillOnce(Invoke(IsVisibleInQuadrant1)); // Uh, won't compile. :-( +``` + +To please the compiler God, you need to define an "adaptor" that has the same +signature as `Foo()` and calls the custom action with the right arguments: + +```cpp +using ::testing::_; +using ::testing::Invoke; +... +bool MyIsVisibleInQuadrant1(bool visible, const string& name, int x, int y, + const map, double>& weight, + double min_weight, double max_wight) { + return IsVisibleInQuadrant1(visible, x, y); +} +... + EXPECT_CALL(mock, Foo) + .WillOnce(Invoke(MyIsVisibleInQuadrant1)); // Now it works. +``` + +But isn't this awkward? + +gMock provides a generic *action adaptor*, so you can spend your time minding +more important business than writing your own adaptors. Here's the syntax: + +```cpp +WithArgs(action) +``` + +creates an action that passes the arguments of the mock function at the given +indices (0-based) to the inner `action` and performs it. Using `WithArgs`, our +original example can be written as: + +```cpp +using ::testing::_; +using ::testing::Invoke; +using ::testing::WithArgs; +... + EXPECT_CALL(mock, Foo) + .WillOnce(WithArgs<0, 2, 3>(Invoke(IsVisibleInQuadrant1))); // No need to define your own adaptor. +``` + +For better readability, gMock also gives you: + +* `WithoutArgs(action)` when the inner `action` takes *no* argument, and +* `WithArg(action)` (no `s` after `Arg`) when the inner `action` takes + *one* argument. + +As you may have realized, `InvokeWithoutArgs(...)` is just syntactic sugar for +`WithoutArgs(Invoke(...))`. + +Here are more tips: + +* The inner action used in `WithArgs` and friends does not have to be + `Invoke()` -- it can be anything. +* You can repeat an argument in the argument list if necessary, e.g. + `WithArgs<2, 3, 3, 5>(...)`. +* You can change the order of the arguments, e.g. `WithArgs<3, 2, 1>(...)`. +* The types of the selected arguments do *not* have to match the signature of + the inner action exactly. It works as long as they can be implicitly + converted to the corresponding arguments of the inner action. For example, + if the 4-th argument of the mock function is an `int` and `my_action` takes + a `double`, `WithArg<4>(my_action)` will work. + +### Ignoring Arguments in Action Functions + +The [selecting-an-action's-arguments](#SelectingArgs) recipe showed us one way +to make a mock function and an action with incompatible argument lists fit +together. The downside is that wrapping the action in `WithArgs<...>()` can get +tedious for people writing the tests. + +If you are defining a function (or method, functor, lambda, callback) to be used +with `Invoke*()`, and you are not interested in some of its arguments, an +alternative to `WithArgs` is to declare the uninteresting arguments as `Unused`. +This makes the definition less cluttered and less fragile in case the types of +the uninteresting arguments change. It could also increase the chance the action +function can be reused. For example, given + +```cpp + public: + MOCK_METHOD(double, Foo, double(const string& label, double x, double y), + (override)); + MOCK_METHOD(double, Bar, (int index, double x, double y), (override)); +``` + +instead of + +```cpp +using ::testing::_; +using ::testing::Invoke; + +double DistanceToOriginWithLabel(const string& label, double x, double y) { + return sqrt(x*x + y*y); +} +double DistanceToOriginWithIndex(int index, double x, double y) { + return sqrt(x*x + y*y); +} +... + EXPECT_CALL(mock, Foo("abc", _, _)) + .WillOnce(Invoke(DistanceToOriginWithLabel)); + EXPECT_CALL(mock, Bar(5, _, _)) + .WillOnce(Invoke(DistanceToOriginWithIndex)); +``` + +you could write + +```cpp +using ::testing::_; +using ::testing::Invoke; +using ::testing::Unused; + +double DistanceToOrigin(Unused, double x, double y) { + return sqrt(x*x + y*y); +} +... + EXPECT_CALL(mock, Foo("abc", _, _)) + .WillOnce(Invoke(DistanceToOrigin)); + EXPECT_CALL(mock, Bar(5, _, _)) + .WillOnce(Invoke(DistanceToOrigin)); +``` + +### Sharing Actions + +Just like matchers, a gMock action object consists of a pointer to a ref-counted +implementation object. Therefore copying actions is also allowed and very +efficient. When the last action that references the implementation object dies, +the implementation object will be deleted. + +If you have some complex action that you want to use again and again, you may +not have to build it from scratch every time. If the action doesn't have an +internal state (i.e. if it always does the same thing no matter how many times +it has been called), you can assign it to an action variable and use that +variable repeatedly. For example: + +```cpp +using ::testing::Action; +using ::testing::DoAll; +using ::testing::Return; +using ::testing::SetArgPointee; +... + Action set_flag = DoAll(SetArgPointee<0>(5), + Return(true)); + ... use set_flag in .WillOnce() and .WillRepeatedly() ... +``` + +However, if the action has its own state, you may be surprised if you share the +action object. Suppose you have an action factory `IncrementCounter(init)` which +creates an action that increments and returns a counter whose initial value is +`init`, using two actions created from the same expression and using a shared +action will exhibit different behaviors. Example: + +```cpp + EXPECT_CALL(foo, DoThis()) + .WillRepeatedly(IncrementCounter(0)); + EXPECT_CALL(foo, DoThat()) + .WillRepeatedly(IncrementCounter(0)); + foo.DoThis(); // Returns 1. + foo.DoThis(); // Returns 2. + foo.DoThat(); // Returns 1 - DoThat() uses a different + // counter than DoThis()'s. +``` + +versus + +```cpp +using ::testing::Action; +... + Action increment = IncrementCounter(0); + EXPECT_CALL(foo, DoThis()) + .WillRepeatedly(increment); + EXPECT_CALL(foo, DoThat()) + .WillRepeatedly(increment); + foo.DoThis(); // Returns 1. + foo.DoThis(); // Returns 2. + foo.DoThat(); // Returns 3 - the counter is shared. +``` + +### Testing Asynchronous Behavior + +One oft-encountered problem with gMock is that it can be hard to test +asynchronous behavior. Suppose you had a `EventQueue` class that you wanted to +test, and you created a separate `EventDispatcher` interface so that you could +easily mock it out. However, the implementation of the class fired all the +events on a background thread, which made test timings difficult. You could just +insert `sleep()` statements and hope for the best, but that makes your test +behavior nondeterministic. A better way is to use gMock actions and +`Notification` objects to force your asynchronous test to behave synchronously. + +```cpp +class MockEventDispatcher : public EventDispatcher { + MOCK_METHOD(bool, DispatchEvent, (int32), (override)); +}; + +TEST(EventQueueTest, EnqueueEventTest) { + MockEventDispatcher mock_event_dispatcher; + EventQueue event_queue(&mock_event_dispatcher); + + const int32 kEventId = 321; + absl::Notification done; + EXPECT_CALL(mock_event_dispatcher, DispatchEvent(kEventId)) + .WillOnce([&done] { done.Notify(); }); + + event_queue.EnqueueEvent(kEventId); + done.WaitForNotification(); +} +``` + +In the example above, we set our normal gMock expectations, but then add an +additional action to notify the `Notification` object. Now we can just call +`Notification::WaitForNotification()` in the main thread to wait for the +asynchronous call to finish. After that, our test suite is complete and we can +safely exit. + +{: .callout .note} +Note: this example has a downside: namely, if the expectation is not satisfied, +our test will run forever. It will eventually time-out and fail, but it will +take longer and be slightly harder to debug. To alleviate this problem, you can +use `WaitForNotificationWithTimeout(ms)` instead of `WaitForNotification()`. + +## Misc Recipes on Using gMock + +### Mocking Methods That Use Move-Only Types + +C++11 introduced *move-only types*. A move-only-typed value can be moved from +one object to another, but cannot be copied. `std::unique_ptr` is probably +the most commonly used move-only type. + +Mocking a method that takes and/or returns move-only types presents some +challenges, but nothing insurmountable. This recipe shows you how you can do it. +Note that the support for move-only method arguments was only introduced to +gMock in April 2017; in older code, you may find more complex +[workarounds](#LegacyMoveOnly) for lack of this feature. + +Let’s say we are working on a fictional project that lets one post and share +snippets called “buzzes”. Your code uses these types: + +```cpp +enum class AccessLevel { kInternal, kPublic }; + +class Buzz { + public: + explicit Buzz(AccessLevel access) { ... } + ... +}; + +class Buzzer { + public: + virtual ~Buzzer() {} + virtual std::unique_ptr MakeBuzz(StringPiece text) = 0; + virtual bool ShareBuzz(std::unique_ptr buzz, int64_t timestamp) = 0; + ... +}; +``` + +A `Buzz` object represents a snippet being posted. A class that implements the +`Buzzer` interface is capable of creating and sharing `Buzz`es. Methods in +`Buzzer` may return a `unique_ptr` or take a `unique_ptr`. Now we +need to mock `Buzzer` in our tests. + +To mock a method that accepts or returns move-only types, you just use the +familiar `MOCK_METHOD` syntax as usual: + +```cpp +class MockBuzzer : public Buzzer { + public: + MOCK_METHOD(std::unique_ptr, MakeBuzz, (StringPiece text), (override)); + MOCK_METHOD(bool, ShareBuzz, (std::unique_ptr buzz, int64_t timestamp), + (override)); +}; +``` + +Now that we have the mock class defined, we can use it in tests. In the +following code examples, we assume that we have defined a `MockBuzzer` object +named `mock_buzzer_`: + +```cpp + MockBuzzer mock_buzzer_; +``` + +First let’s see how we can set expectations on the `MakeBuzz()` method, which +returns a `unique_ptr`. + +As usual, if you set an expectation without an action (i.e. the `.WillOnce()` or +`.WillRepeatedly()` clause), when that expectation fires, the default action for +that method will be taken. Since `unique_ptr<>` has a default constructor that +returns a null `unique_ptr`, that’s what you’ll get if you don’t specify an +action: + +```cpp +using ::testing::IsNull; +... + // Use the default action. + EXPECT_CALL(mock_buzzer_, MakeBuzz("hello")); + + // Triggers the previous EXPECT_CALL. + EXPECT_THAT(mock_buzzer_.MakeBuzz("hello"), IsNull()); +``` + +If you are not happy with the default action, you can tweak it as usual; see +[Setting Default Actions](#OnCall). + +If you just need to return a move-only value, you can use it in combination with +`WillOnce`. For example: + +```cpp + EXPECT_CALL(mock_buzzer_, MakeBuzz("hello")) + .WillOnce(Return(std::make_unique(AccessLevel::kInternal))); + EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("hello")); +``` + +Quiz time! What do you think will happen if a `Return` action is performed more +than once (e.g. you write `... .WillRepeatedly(Return(std::move(...)));`)? Come +think of it, after the first time the action runs, the source value will be +consumed (since it’s a move-only value), so the next time around, there’s no +value to move from -- you’ll get a run-time error that `Return(std::move(...))` +can only be run once. + +If you need your mock method to do more than just moving a pre-defined value, +remember that you can always use a lambda or a callable object, which can do +pretty much anything you want: + +```cpp + EXPECT_CALL(mock_buzzer_, MakeBuzz("x")) + .WillRepeatedly([](StringPiece text) { + return std::make_unique(AccessLevel::kInternal); + }); + + EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("x")); + EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("x")); +``` + +Every time this `EXPECT_CALL` fires, a new `unique_ptr` will be created +and returned. You cannot do this with `Return(std::make_unique<...>(...))`. + +That covers returning move-only values; but how do we work with methods +accepting move-only arguments? The answer is that they work normally, although +some actions will not compile when any of method's arguments are move-only. You +can always use `Return`, or a [lambda or functor](#FunctionsAsActions): + +```cpp + using ::testing::Unused; + + EXPECT_CALL(mock_buzzer_, ShareBuzz(NotNull(), _)).WillOnce(Return(true)); + EXPECT_TRUE(mock_buzzer_.ShareBuzz(std::make_unique(AccessLevel::kInternal)), + 0); + + EXPECT_CALL(mock_buzzer_, ShareBuzz(_, _)).WillOnce( + [](std::unique_ptr buzz, Unused) { return buzz != nullptr; }); + EXPECT_FALSE(mock_buzzer_.ShareBuzz(nullptr, 0)); +``` + +Many built-in actions (`WithArgs`, `WithoutArgs`,`DeleteArg`, `SaveArg`, ...) +could in principle support move-only arguments, but the support for this is not +implemented yet. If this is blocking you, please file a bug. + +A few actions (e.g. `DoAll`) copy their arguments internally, so they can never +work with non-copyable objects; you'll have to use functors instead. + +#### Legacy workarounds for move-only types {#LegacyMoveOnly} + +Support for move-only function arguments was only introduced to gMock in April +of 2017. In older code, you may encounter the following workaround for the lack +of this feature (it is no longer necessary - we're including it just for +reference): + +```cpp +class MockBuzzer : public Buzzer { + public: + MOCK_METHOD(bool, DoShareBuzz, (Buzz* buzz, Time timestamp)); + bool ShareBuzz(std::unique_ptr buzz, Time timestamp) override { + return DoShareBuzz(buzz.get(), timestamp); + } +}; +``` + +The trick is to delegate the `ShareBuzz()` method to a mock method (let’s call +it `DoShareBuzz()`) that does not take move-only parameters. Then, instead of +setting expectations on `ShareBuzz()`, you set them on the `DoShareBuzz()` mock +method: + +```cpp + MockBuzzer mock_buzzer_; + EXPECT_CALL(mock_buzzer_, DoShareBuzz(NotNull(), _)); + + // When one calls ShareBuzz() on the MockBuzzer like this, the call is + // forwarded to DoShareBuzz(), which is mocked. Therefore this statement + // will trigger the above EXPECT_CALL. + mock_buzzer_.ShareBuzz(std::make_unique(AccessLevel::kInternal), 0); +``` + +### Making the Compilation Faster + +Believe it or not, the *vast majority* of the time spent on compiling a mock +class is in generating its constructor and destructor, as they perform +non-trivial tasks (e.g. verification of the expectations). What's more, mock +methods with different signatures have different types and thus their +constructors/destructors need to be generated by the compiler separately. As a +result, if you mock many different types of methods, compiling your mock class +can get really slow. + +If you are experiencing slow compilation, you can move the definition of your +mock class' constructor and destructor out of the class body and into a `.cc` +file. This way, even if you `#include` your mock class in N files, the compiler +only needs to generate its constructor and destructor once, resulting in a much +faster compilation. + +Let's illustrate the idea using an example. Here's the definition of a mock +class before applying this recipe: + +```cpp +// File mock_foo.h. +... +class MockFoo : public Foo { + public: + // Since we don't declare the constructor or the destructor, + // the compiler will generate them in every translation unit + // where this mock class is used. + + MOCK_METHOD(int, DoThis, (), (override)); + MOCK_METHOD(bool, DoThat, (const char* str), (override)); + ... more mock methods ... +}; +``` + +After the change, it would look like: + +```cpp +// File mock_foo.h. +... +class MockFoo : public Foo { + public: + // The constructor and destructor are declared, but not defined, here. + MockFoo(); + virtual ~MockFoo(); + + MOCK_METHOD(int, DoThis, (), (override)); + MOCK_METHOD(bool, DoThat, (const char* str), (override)); + ... more mock methods ... +}; +``` + +and + +```cpp +// File mock_foo.cc. +#include "path/to/mock_foo.h" + +// The definitions may appear trivial, but the functions actually do a +// lot of things through the constructors/destructors of the member +// variables used to implement the mock methods. +MockFoo::MockFoo() {} +MockFoo::~MockFoo() {} +``` + +### Forcing a Verification + +When it's being destroyed, your friendly mock object will automatically verify +that all expectations on it have been satisfied, and will generate googletest +failures if not. This is convenient as it leaves you with one less thing to +worry about. That is, unless you are not sure if your mock object will be +destroyed. + +How could it be that your mock object won't eventually be destroyed? Well, it +might be created on the heap and owned by the code you are testing. Suppose +there's a bug in that code and it doesn't delete the mock object properly - you +could end up with a passing test when there's actually a bug. + +Using a heap checker is a good idea and can alleviate the concern, but its +implementation is not 100% reliable. So, sometimes you do want to *force* gMock +to verify a mock object before it is (hopefully) destructed. You can do this +with `Mock::VerifyAndClearExpectations(&mock_object)`: + +```cpp +TEST(MyServerTest, ProcessesRequest) { + using ::testing::Mock; + + MockFoo* const foo = new MockFoo; + EXPECT_CALL(*foo, ...)...; + // ... other expectations ... + + // server now owns foo. + MyServer server(foo); + server.ProcessRequest(...); + + // In case that server's destructor will forget to delete foo, + // this will verify the expectations anyway. + Mock::VerifyAndClearExpectations(foo); +} // server is destroyed when it goes out of scope here. +``` + +{: .callout .tip} +**Tip:** The `Mock::VerifyAndClearExpectations()` function returns a `bool` to +indicate whether the verification was successful (`true` for yes), so you can +wrap that function call inside a `ASSERT_TRUE()` if there is no point going +further when the verification has failed. + +Do not set new expectations after verifying and clearing a mock after its use. +Setting expectations after code that exercises the mock has undefined behavior. +See [Using Mocks in Tests](gmock_for_dummies.md#using-mocks-in-tests) for more +information. + +### Using Checkpoints {#UsingCheckPoints} + +Sometimes you might want to test a mock object's behavior in phases whose sizes +are each manageable, or you might want to set more detailed expectations about +which API calls invoke which mock functions. + +A technique you can use is to put the expectations in a sequence and insert +calls to a dummy "checkpoint" function at specific places. Then you can verify +that the mock function calls do happen at the right time. For example, if you +are exercising the code: + +```cpp + Foo(1); + Foo(2); + Foo(3); +``` + +and want to verify that `Foo(1)` and `Foo(3)` both invoke `mock.Bar("a")`, but +`Foo(2)` doesn't invoke anything, you can write: + +```cpp +using ::testing::MockFunction; + +TEST(FooTest, InvokesBarCorrectly) { + MyMock mock; + // Class MockFunction has exactly one mock method. It is named + // Call() and has type F. + MockFunction check; + { + InSequence s; + + EXPECT_CALL(mock, Bar("a")); + EXPECT_CALL(check, Call("1")); + EXPECT_CALL(check, Call("2")); + EXPECT_CALL(mock, Bar("a")); + } + Foo(1); + check.Call("1"); + Foo(2); + check.Call("2"); + Foo(3); +} +``` + +The expectation spec says that the first `Bar("a")` call must happen before +checkpoint "1", the second `Bar("a")` call must happen after checkpoint "2", and +nothing should happen between the two checkpoints. The explicit checkpoints make +it clear which `Bar("a")` is called by which call to `Foo()`. + +### Mocking Destructors + +Sometimes you want to make sure a mock object is destructed at the right time, +e.g. after `bar->A()` is called but before `bar->B()` is called. We already know +that you can specify constraints on the [order](#OrderedCalls) of mock function +calls, so all we need to do is to mock the destructor of the mock function. + +This sounds simple, except for one problem: a destructor is a special function +with special syntax and special semantics, and the `MOCK_METHOD` macro doesn't +work for it: + +```cpp +MOCK_METHOD(void, ~MockFoo, ()); // Won't compile! +``` + +The good news is that you can use a simple pattern to achieve the same effect. +First, add a mock function `Die()` to your mock class and call it in the +destructor, like this: + +```cpp +class MockFoo : public Foo { + ... + // Add the following two lines to the mock class. + MOCK_METHOD(void, Die, ()); + ~MockFoo() override { Die(); } +}; +``` + +(If the name `Die()` clashes with an existing symbol, choose another name.) Now, +we have translated the problem of testing when a `MockFoo` object dies to +testing when its `Die()` method is called: + +```cpp + MockFoo* foo = new MockFoo; + MockBar* bar = new MockBar; + ... + { + InSequence s; + + // Expects *foo to die after bar->A() and before bar->B(). + EXPECT_CALL(*bar, A()); + EXPECT_CALL(*foo, Die()); + EXPECT_CALL(*bar, B()); + } +``` + +And that's that. + +### Using gMock and Threads {#UsingThreads} + +In a **unit** test, it's best if you could isolate and test a piece of code in a +single-threaded context. That avoids race conditions and dead locks, and makes +debugging your test much easier. + +Yet most programs are multi-threaded, and sometimes to test something we need to +pound on it from more than one thread. gMock works for this purpose too. + +Remember the steps for using a mock: + +1. Create a mock object `foo`. +2. Set its default actions and expectations using `ON_CALL()` and + `EXPECT_CALL()`. +3. The code under test calls methods of `foo`. +4. Optionally, verify and reset the mock. +5. Destroy the mock yourself, or let the code under test destroy it. The + destructor will automatically verify it. + +If you follow the following simple rules, your mocks and threads can live +happily together: + +* Execute your *test code* (as opposed to the code being tested) in *one* + thread. This makes your test easy to follow. +* Obviously, you can do step #1 without locking. +* When doing step #2 and #5, make sure no other thread is accessing `foo`. + Obvious too, huh? +* #3 and #4 can be done either in one thread or in multiple threads - anyway + you want. gMock takes care of the locking, so you don't have to do any - + unless required by your test logic. + +If you violate the rules (for example, if you set expectations on a mock while +another thread is calling its methods), you get undefined behavior. That's not +fun, so don't do it. + +gMock guarantees that the action for a mock function is done in the same thread +that called the mock function. For example, in + +```cpp + EXPECT_CALL(mock, Foo(1)) + .WillOnce(action1); + EXPECT_CALL(mock, Foo(2)) + .WillOnce(action2); +``` + +if `Foo(1)` is called in thread 1 and `Foo(2)` is called in thread 2, gMock will +execute `action1` in thread 1 and `action2` in thread 2. + +gMock does *not* impose a sequence on actions performed in different threads +(doing so may create deadlocks as the actions may need to cooperate). This means +that the execution of `action1` and `action2` in the above example *may* +interleave. If this is a problem, you should add proper synchronization logic to +`action1` and `action2` to make the test thread-safe. + +Also, remember that `DefaultValue` is a global resource that potentially +affects *all* living mock objects in your program. Naturally, you won't want to +mess with it from multiple threads or when there still are mocks in action. + +### Controlling How Much Information gMock Prints + +When gMock sees something that has the potential of being an error (e.g. a mock +function with no expectation is called, a.k.a. an uninteresting call, which is +allowed but perhaps you forgot to explicitly ban the call), it prints some +warning messages, including the arguments of the function, the return value, and +the stack trace. Hopefully this will remind you to take a look and see if there +is indeed a problem. + +Sometimes you are confident that your tests are correct and may not appreciate +such friendly messages. Some other times, you are debugging your tests or +learning about the behavior of the code you are testing, and wish you could +observe every mock call that happens (including argument values, the return +value, and the stack trace). Clearly, one size doesn't fit all. + +You can control how much gMock tells you using the `--gmock_verbose=LEVEL` +command-line flag, where `LEVEL` is a string with three possible values: + +* `info`: gMock will print all informational messages, warnings, and errors + (most verbose). At this setting, gMock will also log any calls to the + `ON_CALL/EXPECT_CALL` macros. It will include a stack trace in + "uninteresting call" warnings. +* `warning`: gMock will print both warnings and errors (less verbose); it will + omit the stack traces in "uninteresting call" warnings. This is the default. +* `error`: gMock will print errors only (least verbose). + +Alternatively, you can adjust the value of that flag from within your tests like +so: + +```cpp + ::testing::FLAGS_gmock_verbose = "error"; +``` + +If you find gMock printing too many stack frames with its informational or +warning messages, remember that you can control their amount with the +`--gtest_stack_trace_depth=max_depth` flag. + +Now, judiciously use the right flag to enable gMock serve you better! + +### Gaining Super Vision into Mock Calls + +You have a test using gMock. It fails: gMock tells you some expectations aren't +satisfied. However, you aren't sure why: Is there a typo somewhere in the +matchers? Did you mess up the order of the `EXPECT_CALL`s? Or is the code under +test doing something wrong? How can you find out the cause? + +Won't it be nice if you have X-ray vision and can actually see the trace of all +`EXPECT_CALL`s and mock method calls as they are made? For each call, would you +like to see its actual argument values and which `EXPECT_CALL` gMock thinks it +matches? If you still need some help to figure out who made these calls, how +about being able to see the complete stack trace at each mock call? + +You can unlock this power by running your test with the `--gmock_verbose=info` +flag. For example, given the test program: + +```cpp +#include + +using ::testing::_; +using ::testing::HasSubstr; +using ::testing::Return; + +class MockFoo { + public: + MOCK_METHOD(void, F, (const string& x, const string& y)); +}; + +TEST(Foo, Bar) { + MockFoo mock; + EXPECT_CALL(mock, F(_, _)).WillRepeatedly(Return()); + EXPECT_CALL(mock, F("a", "b")); + EXPECT_CALL(mock, F("c", HasSubstr("d"))); + + mock.F("a", "good"); + mock.F("a", "b"); +} +``` + +if you run it with `--gmock_verbose=info`, you will see this output: + +```shell +[ RUN ] Foo.Bar + +foo_test.cc:14: EXPECT_CALL(mock, F(_, _)) invoked +Stack trace: ... + +foo_test.cc:15: EXPECT_CALL(mock, F("a", "b")) invoked +Stack trace: ... + +foo_test.cc:16: EXPECT_CALL(mock, F("c", HasSubstr("d"))) invoked +Stack trace: ... + +foo_test.cc:14: Mock function call matches EXPECT_CALL(mock, F(_, _))... + Function call: F(@0x7fff7c8dad40"a",@0x7fff7c8dad10"good") +Stack trace: ... + +foo_test.cc:15: Mock function call matches EXPECT_CALL(mock, F("a", "b"))... + Function call: F(@0x7fff7c8dada0"a",@0x7fff7c8dad70"b") +Stack trace: ... + +foo_test.cc:16: Failure +Actual function call count doesn't match EXPECT_CALL(mock, F("c", HasSubstr("d")))... + Expected: to be called once + Actual: never called - unsatisfied and active +[ FAILED ] Foo.Bar +``` + +Suppose the bug is that the `"c"` in the third `EXPECT_CALL` is a typo and +should actually be `"a"`. With the above message, you should see that the actual +`F("a", "good")` call is matched by the first `EXPECT_CALL`, not the third as +you thought. From that it should be obvious that the third `EXPECT_CALL` is +written wrong. Case solved. + +If you are interested in the mock call trace but not the stack traces, you can +combine `--gmock_verbose=info` with `--gtest_stack_trace_depth=0` on the test +command line. + +### Running Tests in Emacs + +If you build and run your tests in Emacs using the `M-x google-compile` command +(as many googletest users do), the source file locations of gMock and googletest +errors will be highlighted. Just press `` on one of them and you'll be +taken to the offending line. Or, you can just type `C-x`` to jump to the next +error. + +To make it even easier, you can add the following lines to your `~/.emacs` file: + +```text +(global-set-key "\M-m" 'google-compile) ; m is for make +(global-set-key [M-down] 'next-error) +(global-set-key [M-up] '(lambda () (interactive) (next-error -1))) +``` + +Then you can type `M-m` to start a build (if you want to run the test as well, +just make sure `foo_test.run` or `runtests` is in the build command you supply +after typing `M-m`), or `M-up`/`M-down` to move back and forth between errors. + +## Extending gMock + +### Writing New Matchers Quickly {#NewMatchers} + +{: .callout .warning} +WARNING: gMock does not guarantee when or how many times a matcher will be +invoked. Therefore, all matchers must be functionally pure. See +[this section](#PureMatchers) for more details. + +The `MATCHER*` family of macros can be used to define custom matchers easily. +The syntax: + +```cpp +MATCHER(name, description_string_expression) { statements; } +``` + +will define a matcher with the given name that executes the statements, which +must return a `bool` to indicate if the match succeeds. Inside the statements, +you can refer to the value being matched by `arg`, and refer to its type by +`arg_type`. + +The *description string* is a `string`-typed expression that documents what the +matcher does, and is used to generate the failure message when the match fails. +It can (and should) reference the special `bool` variable `negation`, and should +evaluate to the description of the matcher when `negation` is `false`, or that +of the matcher's negation when `negation` is `true`. + +For convenience, we allow the description string to be empty (`""`), in which +case gMock will use the sequence of words in the matcher name as the +description. + +For example: + +```cpp +MATCHER(IsDivisibleBy7, "") { return (arg % 7) == 0; } +``` + +allows you to write + +```cpp + // Expects mock_foo.Bar(n) to be called where n is divisible by 7. + EXPECT_CALL(mock_foo, Bar(IsDivisibleBy7())); +``` + +or, + +```cpp + using ::testing::Not; + ... + // Verifies that a value is divisible by 7 and the other is not. + EXPECT_THAT(some_expression, IsDivisibleBy7()); + EXPECT_THAT(some_other_expression, Not(IsDivisibleBy7())); +``` + +If the above assertions fail, they will print something like: + +```shell + Value of: some_expression + Expected: is divisible by 7 + Actual: 27 + ... + Value of: some_other_expression + Expected: not (is divisible by 7) + Actual: 21 +``` + +where the descriptions `"is divisible by 7"` and `"not (is divisible by 7)"` are +automatically calculated from the matcher name `IsDivisibleBy7`. + +As you may have noticed, the auto-generated descriptions (especially those for +the negation) may not be so great. You can always override them with a `string` +expression of your own: + +```cpp +MATCHER(IsDivisibleBy7, + absl::StrCat(negation ? "isn't" : "is", " divisible by 7")) { + return (arg % 7) == 0; +} +``` + +Optionally, you can stream additional information to a hidden argument named +`result_listener` to explain the match result. For example, a better definition +of `IsDivisibleBy7` is: + +```cpp +MATCHER(IsDivisibleBy7, "") { + if ((arg % 7) == 0) + return true; + + *result_listener << "the remainder is " << (arg % 7); + return false; +} +``` + +With this definition, the above assertion will give a better message: + +```shell + Value of: some_expression + Expected: is divisible by 7 + Actual: 27 (the remainder is 6) +``` + +You should let `MatchAndExplain()` print *any additional information* that can +help a user understand the match result. Note that it should explain why the +match succeeds in case of a success (unless it's obvious) - this is useful when +the matcher is used inside `Not()`. There is no need to print the argument value +itself, as gMock already prints it for you. + +{: .callout .note} +NOTE: The type of the value being matched (`arg_type`) is determined by the +context in which you use the matcher and is supplied to you by the compiler, so +you don't need to worry about declaring it (nor can you). This allows the +matcher to be polymorphic. For example, `IsDivisibleBy7()` can be used to match +any type where the value of `(arg % 7) == 0` can be implicitly converted to a +`bool`. In the `Bar(IsDivisibleBy7())` example above, if method `Bar()` takes an +`int`, `arg_type` will be `int`; if it takes an `unsigned long`, `arg_type` will +be `unsigned long`; and so on. + +### Writing New Parameterized Matchers Quickly + +Sometimes you'll want to define a matcher that has parameters. For that you can +use the macro: + +```cpp +MATCHER_P(name, param_name, description_string) { statements; } +``` + +where the description string can be either `""` or a `string` expression that +references `negation` and `param_name`. + +For example: + +```cpp +MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } +``` + +will allow you to write: + +```cpp + EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); +``` + +which may lead to this message (assuming `n` is 10): + +```shell + Value of: Blah("a") + Expected: has absolute value 10 + Actual: -9 +``` + +Note that both the matcher description and its parameter are printed, making the +message human-friendly. + +In the matcher definition body, you can write `foo_type` to reference the type +of a parameter named `foo`. For example, in the body of +`MATCHER_P(HasAbsoluteValue, value)` above, you can write `value_type` to refer +to the type of `value`. + +gMock also provides `MATCHER_P2`, `MATCHER_P3`, ..., up to `MATCHER_P10` to +support multi-parameter matchers: + +```cpp +MATCHER_Pk(name, param_1, ..., param_k, description_string) { statements; } +``` + +Please note that the custom description string is for a particular *instance* of +the matcher, where the parameters have been bound to actual values. Therefore +usually you'll want the parameter values to be part of the description. gMock +lets you do that by referencing the matcher parameters in the description string +expression. + +For example, + +```cpp +using ::testing::PrintToString; +MATCHER_P2(InClosedRange, low, hi, + absl::StrFormat("%s in range [%s, %s]", negation ? "isn't" : "is", + PrintToString(low), PrintToString(hi))) { + return low <= arg && arg <= hi; +} +... +EXPECT_THAT(3, InClosedRange(4, 6)); +``` + +would generate a failure that contains the message: + +```shell + Expected: is in range [4, 6] +``` + +If you specify `""` as the description, the failure message will contain the +sequence of words in the matcher name followed by the parameter values printed +as a tuple. For example, + +```cpp + MATCHER_P2(InClosedRange, low, hi, "") { ... } + ... + EXPECT_THAT(3, InClosedRange(4, 6)); +``` + +would generate a failure that contains the text: + +```shell + Expected: in closed range (4, 6) +``` + +For the purpose of typing, you can view + +```cpp +MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } +``` + +as shorthand for + +```cpp +template +FooMatcherPk +Foo(p1_type p1, ..., pk_type pk) { ... } +``` + +When you write `Foo(v1, ..., vk)`, the compiler infers the types of the +parameters `v1`, ..., and `vk` for you. If you are not happy with the result of +the type inference, you can specify the types by explicitly instantiating the +template, as in `Foo(5, false)`. As said earlier, you don't get to +(or need to) specify `arg_type` as that's determined by the context in which the +matcher is used. + +You can assign the result of expression `Foo(p1, ..., pk)` to a variable of type +`FooMatcherPk`. This can be useful when composing +matchers. Matchers that don't have a parameter or have only one parameter have +special types: you can assign `Foo()` to a `FooMatcher`-typed variable, and +assign `Foo(p)` to a `FooMatcherP`-typed variable. + +While you can instantiate a matcher template with reference types, passing the +parameters by pointer usually makes your code more readable. If, however, you +still want to pass a parameter by reference, be aware that in the failure +message generated by the matcher you will see the value of the referenced object +but not its address. + +You can overload matchers with different numbers of parameters: + +```cpp +MATCHER_P(Blah, a, description_string_1) { ... } +MATCHER_P2(Blah, a, b, description_string_2) { ... } +``` + +While it's tempting to always use the `MATCHER*` macros when defining a new +matcher, you should also consider implementing the matcher interface directly +instead (see the recipes that follow), especially if you need to use the matcher +a lot. While these approaches require more work, they give you more control on +the types of the value being matched and the matcher parameters, which in +general leads to better compiler error messages that pay off in the long run. +They also allow overloading matchers based on parameter types (as opposed to +just based on the number of parameters). + +### Writing New Monomorphic Matchers + +A matcher of argument type `T` implements the matcher interface for `T` and does +two things: it tests whether a value of type `T` matches the matcher, and can +describe what kind of values it matches. The latter ability is used for +generating readable error messages when expectations are violated. + +A matcher of `T` must declare a typedef like: + +```cpp +using is_gtest_matcher = void; +``` + +and supports the following operations: + +```cpp +// Match a value and optionally explain into an ostream. +bool matched = matcher.MatchAndExplain(value, maybe_os); +// where `value` is of type `T` and +// `maybe_os` is of type `std::ostream*`, where it can be null if the caller +// is not interested in there textual explanation. + +matcher.DescribeTo(os); +matcher.DescribeNegationTo(os); +// where `os` is of type `std::ostream*`. +``` + +If you need a custom matcher but `Truly()` is not a good option (for example, +you may not be happy with the way `Truly(predicate)` describes itself, or you +may want your matcher to be polymorphic as `Eq(value)` is), you can define a +matcher to do whatever you want in two steps: first implement the matcher +interface, and then define a factory function to create a matcher instance. The +second step is not strictly needed but it makes the syntax of using the matcher +nicer. + +For example, you can define a matcher to test whether an `int` is divisible by 7 +and then use it like this: + +```cpp +using ::testing::Matcher; + +class DivisibleBy7Matcher { + public: + using is_gtest_matcher = void; + + bool MatchAndExplain(int n, std::ostream*) const { + return (n % 7) == 0; + } + + void DescribeTo(std::ostream* os) const { + *os << "is divisible by 7"; + } + + void DescribeNegationTo(std::ostream* os) const { + *os << "is not divisible by 7"; + } +}; + +Matcher DivisibleBy7() { + return DivisibleBy7Matcher(); +} + +... + EXPECT_CALL(foo, Bar(DivisibleBy7())); +``` + +You may improve the matcher message by streaming additional information to the +`os` argument in `MatchAndExplain()`: + +```cpp +class DivisibleBy7Matcher { + public: + bool MatchAndExplain(int n, std::ostream* os) const { + const int remainder = n % 7; + if (remainder != 0 && os != nullptr) { + *os << "the remainder is " << remainder; + } + return remainder == 0; + } + ... +}; +``` + +Then, `EXPECT_THAT(x, DivisibleBy7());` may generate a message like this: + +```shell +Value of: x +Expected: is divisible by 7 + Actual: 23 (the remainder is 2) +``` + +{: .callout .tip} +Tip: for convenience, `MatchAndExplain()` can take a `MatchResultListener*` +instead of `std::ostream*`. + +### Writing New Polymorphic Matchers + +Expanding what we learned above to *polymorphic* matchers is now just as simple +as adding templates in the right place. + +```cpp + +class NotNullMatcher { + public: + using is_gtest_matcher = void; + + // To implement a polymorphic matcher, we just need to make MatchAndExplain a + // template on its first argument. + + // In this example, we want to use NotNull() with any pointer, so + // MatchAndExplain() accepts a pointer of any type as its first argument. + // In general, you can define MatchAndExplain() as an ordinary method or + // a method template, or even overload it. + template + bool MatchAndExplain(T* p, std::ostream*) const { + return p != nullptr; + } + + // Describes the property of a value matching this matcher. + void DescribeTo(std::ostream* os) const { *os << "is not NULL"; } + + // Describes the property of a value NOT matching this matcher. + void DescribeNegationTo(std::ostream* os) const { *os << "is NULL"; } +}; + +NotNullMatcher NotNull() { + return NotNullMatcher(); +} + +... + + EXPECT_CALL(foo, Bar(NotNull())); // The argument must be a non-NULL pointer. +``` + +### Legacy Matcher Implementation + +Defining matchers used to be somewhat more complicated, in which it required +several supporting classes and virtual functions. To implement a matcher for +type `T` using the legacy API you have to derive from `MatcherInterface` and +call `MakeMatcher` to construct the object. + +The interface looks like this: + +```cpp +class MatchResultListener { + public: + ... + // Streams x to the underlying ostream; does nothing if the ostream + // is NULL. + template + MatchResultListener& operator<<(const T& x); + + // Returns the underlying ostream. + std::ostream* stream(); +}; + +template +class MatcherInterface { + public: + virtual ~MatcherInterface(); + + // Returns true if and only if the matcher matches x; also explains the match + // result to 'listener'. + virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; + + // Describes this matcher to an ostream. + virtual void DescribeTo(std::ostream* os) const = 0; + + // Describes the negation of this matcher to an ostream. + virtual void DescribeNegationTo(std::ostream* os) const; +}; +``` + +Fortunately, most of the time you can define a polymorphic matcher easily with +the help of `MakePolymorphicMatcher()`. Here's how you can define `NotNull()` as +an example: + +```cpp +using ::testing::MakePolymorphicMatcher; +using ::testing::MatchResultListener; +using ::testing::PolymorphicMatcher; + +class NotNullMatcher { + public: + // To implement a polymorphic matcher, first define a COPYABLE class + // that has three members MatchAndExplain(), DescribeTo(), and + // DescribeNegationTo(), like the following. + + // In this example, we want to use NotNull() with any pointer, so + // MatchAndExplain() accepts a pointer of any type as its first argument. + // In general, you can define MatchAndExplain() as an ordinary method or + // a method template, or even overload it. + template + bool MatchAndExplain(T* p, + MatchResultListener* /* listener */) const { + return p != NULL; + } + + // Describes the property of a value matching this matcher. + void DescribeTo(std::ostream* os) const { *os << "is not NULL"; } + + // Describes the property of a value NOT matching this matcher. + void DescribeNegationTo(std::ostream* os) const { *os << "is NULL"; } +}; + +// To construct a polymorphic matcher, pass an instance of the class +// to MakePolymorphicMatcher(). Note the return type. +PolymorphicMatcher NotNull() { + return MakePolymorphicMatcher(NotNullMatcher()); +} + +... + + EXPECT_CALL(foo, Bar(NotNull())); // The argument must be a non-NULL pointer. +``` + +{: .callout .note} +**Note:** Your polymorphic matcher class does **not** need to inherit from +`MatcherInterface` or any other class, and its methods do **not** need to be +virtual. + +Like in a monomorphic matcher, you may explain the match result by streaming +additional information to the `listener` argument in `MatchAndExplain()`. + +### Writing New Cardinalities + +A cardinality is used in `Times()` to tell gMock how many times you expect a +call to occur. It doesn't have to be exact. For example, you can say +`AtLeast(5)` or `Between(2, 4)`. + +If the [built-in set](gmock_cheat_sheet.md#CardinalityList) of cardinalities +doesn't suit you, you are free to define your own by implementing the following +interface (in namespace `testing`): + +```cpp +class CardinalityInterface { + public: + virtual ~CardinalityInterface(); + + // Returns true if and only if call_count calls will satisfy this cardinality. + virtual bool IsSatisfiedByCallCount(int call_count) const = 0; + + // Returns true if and only if call_count calls will saturate this + // cardinality. + virtual bool IsSaturatedByCallCount(int call_count) const = 0; + + // Describes self to an ostream. + virtual void DescribeTo(std::ostream* os) const = 0; +}; +``` + +For example, to specify that a call must occur even number of times, you can +write + +```cpp +using ::testing::Cardinality; +using ::testing::CardinalityInterface; +using ::testing::MakeCardinality; + +class EvenNumberCardinality : public CardinalityInterface { + public: + bool IsSatisfiedByCallCount(int call_count) const override { + return (call_count % 2) == 0; + } + + bool IsSaturatedByCallCount(int call_count) const override { + return false; + } + + void DescribeTo(std::ostream* os) const { + *os << "called even number of times"; + } +}; + +Cardinality EvenNumber() { + return MakeCardinality(new EvenNumberCardinality); +} + +... + EXPECT_CALL(foo, Bar(3)) + .Times(EvenNumber()); +``` + +### Writing New Actions {#QuickNewActions} + +If the built-in actions don't work for you, you can easily define your own one. +All you need is a call operator with a signature compatible with the mocked +function. So you can use a lambda: + +```cpp +MockFunction mock; +EXPECT_CALL(mock, Call).WillOnce([](const int input) { return input * 7; }); +EXPECT_EQ(mock.AsStdFunction()(2), 14); +``` + +Or a struct with a call operator (even a templated one): + +```cpp +struct MultiplyBy { + template + T operator()(T arg) { return arg * multiplier; } + + int multiplier; +}; + +// Then use: +// EXPECT_CALL(...).WillOnce(MultiplyBy{7}); +``` + +It's also fine for the callable to take no arguments, ignoring the arguments +supplied to the mock function: + +```cpp +MockFunction mock; +EXPECT_CALL(mock, Call).WillOnce([] { return 17; }); +EXPECT_EQ(mock.AsStdFunction()(0), 17); +``` + +When used with `WillOnce`, the callable can assume it will be called at most +once and is allowed to be a move-only type: + +```cpp +// An action that contains move-only types and has an &&-qualified operator, +// demanding in the type system that it be called at most once. This can be +// used with WillOnce, but the compiler will reject it if handed to +// WillRepeatedly. +struct MoveOnlyAction { + std::unique_ptr move_only_state; + std::unique_ptr operator()() && { return std::move(move_only_state); } +}; + +MockFunction()> mock; +EXPECT_CALL(mock, Call).WillOnce(MoveOnlyAction{std::make_unique(17)}); +EXPECT_THAT(mock.AsStdFunction()(), Pointee(Eq(17))); +``` + +More generally, to use with a mock function whose signature is `R(Args...)` the +object can be anything convertible to `OnceAction` or +`Action. The difference between the two is that `OnceAction` has +weaker requirements (`Action` requires a copy-constructible input that can be +called repeatedly whereas `OnceAction` requires only move-constructible and +supports `&&`-qualified call operators), but can be used only with `WillOnce`. +`OnceAction` is typically relevant only when supporting move-only types or +actions that want a type-system guarantee that they will be called at most once. + +Typically the `OnceAction` and `Action` templates need not be referenced +directly in your actions: a struct or class with a call operator is sufficient, +as in the examples above. But fancier polymorphic actions that need to know the +specific return type of the mock function can define templated conversion +operators to make that possible. See `gmock-actions.h` for examples. + +#### Legacy macro-based Actions + +Before C++11, the functor-based actions were not supported; the old way of +writing actions was through a set of `ACTION*` macros. We suggest to avoid them +in new code; they hide a lot of logic behind the macro, potentially leading to +harder-to-understand compiler errors. Nevertheless, we cover them here for +completeness. + +By writing + +```cpp +ACTION(name) { statements; } +``` + +in a namespace scope (i.e. not inside a class or function), you will define an +action with the given name that executes the statements. The value returned by +`statements` will be used as the return value of the action. Inside the +statements, you can refer to the K-th (0-based) argument of the mock function as +`argK`. For example: + +```cpp +ACTION(IncrementArg1) { return ++(*arg1); } +``` + +allows you to write + +```cpp +... WillOnce(IncrementArg1()); +``` + +Note that you don't need to specify the types of the mock function arguments. +Rest assured that your code is type-safe though: you'll get a compiler error if +`*arg1` doesn't support the `++` operator, or if the type of `++(*arg1)` isn't +compatible with the mock function's return type. + +Another example: + +```cpp +ACTION(Foo) { + (*arg2)(5); + Blah(); + *arg1 = 0; + return arg0; +} +``` + +defines an action `Foo()` that invokes argument #2 (a function pointer) with 5, +calls function `Blah()`, sets the value pointed to by argument #1 to 0, and +returns argument #0. + +For more convenience and flexibility, you can also use the following pre-defined +symbols in the body of `ACTION`: + +`argK_type` | The type of the K-th (0-based) argument of the mock function +:-------------- | :----------------------------------------------------------- +`args` | All arguments of the mock function as a tuple +`args_type` | The type of all arguments of the mock function as a tuple +`return_type` | The return type of the mock function +`function_type` | The type of the mock function + +For example, when using an `ACTION` as a stub action for mock function: + +```cpp +int DoSomething(bool flag, int* ptr); +``` + +we have: + +Pre-defined Symbol | Is Bound To +------------------ | --------------------------------- +`arg0` | the value of `flag` +`arg0_type` | the type `bool` +`arg1` | the value of `ptr` +`arg1_type` | the type `int*` +`args` | the tuple `(flag, ptr)` +`args_type` | the type `std::tuple` +`return_type` | the type `int` +`function_type` | the type `int(bool, int*)` + +#### Legacy macro-based parameterized Actions + +Sometimes you'll want to parameterize an action you define. For that we have +another macro + +```cpp +ACTION_P(name, param) { statements; } +``` + +For example, + +```cpp +ACTION_P(Add, n) { return arg0 + n; } +``` + +will allow you to write + +```cpp +// Returns argument #0 + 5. +... WillOnce(Add(5)); +``` + +For convenience, we use the term *arguments* for the values used to invoke the +mock function, and the term *parameters* for the values used to instantiate an +action. + +Note that you don't need to provide the type of the parameter either. Suppose +the parameter is named `param`, you can also use the gMock-defined symbol +`param_type` to refer to the type of the parameter as inferred by the compiler. +For example, in the body of `ACTION_P(Add, n)` above, you can write `n_type` for +the type of `n`. + +gMock also provides `ACTION_P2`, `ACTION_P3`, and etc to support multi-parameter +actions. For example, + +```cpp +ACTION_P2(ReturnDistanceTo, x, y) { + double dx = arg0 - x; + double dy = arg1 - y; + return sqrt(dx*dx + dy*dy); +} +``` + +lets you write + +```cpp +... WillOnce(ReturnDistanceTo(5.0, 26.5)); +``` + +You can view `ACTION` as a degenerated parameterized action where the number of +parameters is 0. + +You can also easily define actions overloaded on the number of parameters: + +```cpp +ACTION_P(Plus, a) { ... } +ACTION_P2(Plus, a, b) { ... } +``` + +### Restricting the Type of an Argument or Parameter in an ACTION + +For maximum brevity and reusability, the `ACTION*` macros don't ask you to +provide the types of the mock function arguments and the action parameters. +Instead, we let the compiler infer the types for us. + +Sometimes, however, we may want to be more explicit about the types. There are +several tricks to do that. For example: + +```cpp +ACTION(Foo) { + // Makes sure arg0 can be converted to int. + int n = arg0; + ... use n instead of arg0 here ... +} + +ACTION_P(Bar, param) { + // Makes sure the type of arg1 is const char*. + ::testing::StaticAssertTypeEq(); + + // Makes sure param can be converted to bool. + bool flag = param; +} +``` + +where `StaticAssertTypeEq` is a compile-time assertion in googletest that +verifies two types are the same. + +### Writing New Action Templates Quickly + +Sometimes you want to give an action explicit template parameters that cannot be +inferred from its value parameters. `ACTION_TEMPLATE()` supports that and can be +viewed as an extension to `ACTION()` and `ACTION_P*()`. + +The syntax: + +```cpp +ACTION_TEMPLATE(ActionName, + HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), + AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } +``` + +defines an action template that takes *m* explicit template parameters and *n* +value parameters, where *m* is in [1, 10] and *n* is in [0, 10]. `name_i` is the +name of the *i*-th template parameter, and `kind_i` specifies whether it's a +`typename`, an integral constant, or a template. `p_i` is the name of the *i*-th +value parameter. + +Example: + +```cpp +// DuplicateArg(output) converts the k-th argument of the mock +// function to type T and copies it to *output. +ACTION_TEMPLATE(DuplicateArg, + // Note the comma between int and k: + HAS_2_TEMPLATE_PARAMS(int, k, typename, T), + AND_1_VALUE_PARAMS(output)) { + *output = T(std::get(args)); +} +``` + +To create an instance of an action template, write: + +```cpp +ActionName(v1, ..., v_n) +``` + +where the `t`s are the template arguments and the `v`s are the value arguments. +The value argument types are inferred by the compiler. For example: + +```cpp +using ::testing::_; +... + int n; + EXPECT_CALL(mock, Foo).WillOnce(DuplicateArg<1, unsigned char>(&n)); +``` + +If you want to explicitly specify the value argument types, you can provide +additional template arguments: + +```cpp +ActionName(v1, ..., v_n) +``` + +where `u_i` is the desired type of `v_i`. + +`ACTION_TEMPLATE` and `ACTION`/`ACTION_P*` can be overloaded on the number of +value parameters, but not on the number of template parameters. Without the +restriction, the meaning of the following is unclear: + +```cpp + OverloadedAction(x); +``` + +Are we using a single-template-parameter action where `bool` refers to the type +of `x`, or a two-template-parameter action where the compiler is asked to infer +the type of `x`? + +### Using the ACTION Object's Type + +If you are writing a function that returns an `ACTION` object, you'll need to +know its type. The type depends on the macro used to define the action and the +parameter types. The rule is relatively simple: + + +| Given Definition | Expression | Has Type | +| ----------------------------- | ------------------- | --------------------- | +| `ACTION(Foo)` | `Foo()` | `FooAction` | +| `ACTION_TEMPLATE(Foo, HAS_m_TEMPLATE_PARAMS(...), AND_0_VALUE_PARAMS())` | `Foo()` | `FooAction` | +| `ACTION_P(Bar, param)` | `Bar(int_value)` | `BarActionP` | +| `ACTION_TEMPLATE(Bar, HAS_m_TEMPLATE_PARAMS(...), AND_1_VALUE_PARAMS(p1))` | `Bar(int_value)` | `BarActionP` | +| `ACTION_P2(Baz, p1, p2)` | `Baz(bool_value, int_value)` | `BazActionP2` | +| `ACTION_TEMPLATE(Baz, HAS_m_TEMPLATE_PARAMS(...), AND_2_VALUE_PARAMS(p1, p2))` | `Baz(bool_value, int_value)` | `BazActionP2` | +| ... | ... | ... | + + +Note that we have to pick different suffixes (`Action`, `ActionP`, `ActionP2`, +and etc) for actions with different numbers of value parameters, or the action +definitions cannot be overloaded on the number of them. + +### Writing New Monomorphic Actions {#NewMonoActions} + +While the `ACTION*` macros are very convenient, sometimes they are +inappropriate. For example, despite the tricks shown in the previous recipes, +they don't let you directly specify the types of the mock function arguments and +the action parameters, which in general leads to unoptimized compiler error +messages that can baffle unfamiliar users. They also don't allow overloading +actions based on parameter types without jumping through some hoops. + +An alternative to the `ACTION*` macros is to implement +`::testing::ActionInterface`, where `F` is the type of the mock function in +which the action will be used. For example: + +```cpp +template +class ActionInterface { + public: + virtual ~ActionInterface(); + + // Performs the action. Result is the return type of function type + // F, and ArgumentTuple is the tuple of arguments of F. + // + + // For example, if F is int(bool, const string&), then Result would + // be int, and ArgumentTuple would be std::tuple. + virtual Result Perform(const ArgumentTuple& args) = 0; +}; +``` + +```cpp +using ::testing::_; +using ::testing::Action; +using ::testing::ActionInterface; +using ::testing::MakeAction; + +typedef int IncrementMethod(int*); + +class IncrementArgumentAction : public ActionInterface { + public: + int Perform(const std::tuple& args) override { + int* p = std::get<0>(args); // Grabs the first argument. + return *p++; + } +}; + +Action IncrementArgument() { + return MakeAction(new IncrementArgumentAction); +} + +... + EXPECT_CALL(foo, Baz(_)) + .WillOnce(IncrementArgument()); + + int n = 5; + foo.Baz(&n); // Should return 5 and change n to 6. +``` + +### Writing New Polymorphic Actions {#NewPolyActions} + +The previous recipe showed you how to define your own action. This is all good, +except that you need to know the type of the function in which the action will +be used. Sometimes that can be a problem. For example, if you want to use the +action in functions with *different* types (e.g. like `Return()` and +`SetArgPointee()`). + +If an action can be used in several types of mock functions, we say it's +*polymorphic*. The `MakePolymorphicAction()` function template makes it easy to +define such an action: + +```cpp +namespace testing { +template +PolymorphicAction MakePolymorphicAction(const Impl& impl); +} // namespace testing +``` + +As an example, let's define an action that returns the second argument in the +mock function's argument list. The first step is to define an implementation +class: + +```cpp +class ReturnSecondArgumentAction { + public: + template + Result Perform(const ArgumentTuple& args) const { + // To get the i-th (0-based) argument, use std::get(args). + return std::get<1>(args); + } +}; +``` + +This implementation class does *not* need to inherit from any particular class. +What matters is that it must have a `Perform()` method template. This method +template takes the mock function's arguments as a tuple in a **single** +argument, and returns the result of the action. It can be either `const` or not, +but must be invocable with exactly one template argument, which is the result +type. In other words, you must be able to call `Perform(args)` where `R` is +the mock function's return type and `args` is its arguments in a tuple. + +Next, we use `MakePolymorphicAction()` to turn an instance of the implementation +class into the polymorphic action we need. It will be convenient to have a +wrapper for this: + +```cpp +using ::testing::MakePolymorphicAction; +using ::testing::PolymorphicAction; + +PolymorphicAction ReturnSecondArgument() { + return MakePolymorphicAction(ReturnSecondArgumentAction()); +} +``` + +Now, you can use this polymorphic action the same way you use the built-in ones: + +```cpp +using ::testing::_; + +class MockFoo : public Foo { + public: + MOCK_METHOD(int, DoThis, (bool flag, int n), (override)); + MOCK_METHOD(string, DoThat, (int x, const char* str1, const char* str2), + (override)); +}; + + ... + MockFoo foo; + EXPECT_CALL(foo, DoThis).WillOnce(ReturnSecondArgument()); + EXPECT_CALL(foo, DoThat).WillOnce(ReturnSecondArgument()); + ... + foo.DoThis(true, 5); // Will return 5. + foo.DoThat(1, "Hi", "Bye"); // Will return "Hi". +``` + +### Teaching gMock How to Print Your Values + +When an uninteresting or unexpected call occurs, gMock prints the argument +values and the stack trace to help you debug. Assertion macros like +`EXPECT_THAT` and `EXPECT_EQ` also print the values in question when the +assertion fails. gMock and googletest do this using googletest's user-extensible +value printer. + +This printer knows how to print built-in C++ types, native arrays, STL +containers, and any type that supports the `<<` operator. For other types, it +prints the raw bytes in the value and hopes that you the user can figure it out. +[The GoogleTest advanced guide](advanced.md#teaching-googletest-how-to-print-your-values) +explains how to extend the printer to do a better job at printing your +particular type than to dump the bytes. + +## Useful Mocks Created Using gMock + + + + +### Mock std::function {#MockFunction} + +`std::function` is a general function type introduced in C++11. It is a +preferred way of passing callbacks to new interfaces. Functions are copyable, +and are not usually passed around by pointer, which makes them tricky to mock. +But fear not - `MockFunction` can help you with that. + +`MockFunction` has a mock method `Call()` with the signature: + +```cpp + R Call(T1, ..., Tn); +``` + +It also has a `AsStdFunction()` method, which creates a `std::function` proxy +forwarding to Call: + +```cpp + std::function AsStdFunction(); +``` + +To use `MockFunction`, first create `MockFunction` object and set up +expectations on its `Call` method. Then pass proxy obtained from +`AsStdFunction()` to the code you are testing. For example: + +```cpp +TEST(FooTest, RunsCallbackWithBarArgument) { + // 1. Create a mock object. + MockFunction mock_function; + + // 2. Set expectations on Call() method. + EXPECT_CALL(mock_function, Call("bar")).WillOnce(Return(1)); + + // 3. Exercise code that uses std::function. + Foo(mock_function.AsStdFunction()); + // Foo's signature can be either of: + // void Foo(const std::function& fun); + // void Foo(std::function fun); + + // 4. All expectations will be verified when mock_function + // goes out of scope and is destroyed. +} +``` + +Remember that function objects created with `AsStdFunction()` are just +forwarders. If you create multiple of them, they will share the same set of +expectations. + +Although `std::function` supports unlimited number of arguments, `MockFunction` +implementation is limited to ten. If you ever hit that limit... well, your +callback has bigger problems than being mockable. :-) diff --git a/vendor/googletest-1.14.0/docs/gmock_faq.md b/vendor/googletest-1.14.0/docs/gmock_faq.md new file mode 100644 index 00000000..8f220bf7 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/gmock_faq.md @@ -0,0 +1,390 @@ +# Legacy gMock FAQ + +### When I call a method on my mock object, the method for the real object is invoked instead. What's the problem? + +In order for a method to be mocked, it must be *virtual*, unless you use the +[high-perf dependency injection technique](gmock_cook_book.md#MockingNonVirtualMethods). + +### Can I mock a variadic function? + +You cannot mock a variadic function (i.e. a function taking ellipsis (`...`) +arguments) directly in gMock. + +The problem is that in general, there is *no way* for a mock object to know how +many arguments are passed to the variadic method, and what the arguments' types +are. Only the *author of the base class* knows the protocol, and we cannot look +into his or her head. + +Therefore, to mock such a function, the *user* must teach the mock object how to +figure out the number of arguments and their types. One way to do it is to +provide overloaded versions of the function. + +Ellipsis arguments are inherited from C and not really a C++ feature. They are +unsafe to use and don't work with arguments that have constructors or +destructors. Therefore we recommend to avoid them in C++ as much as possible. + +### MSVC gives me warning C4301 or C4373 when I define a mock method with a const parameter. Why? + +If you compile this using Microsoft Visual C++ 2005 SP1: + +```cpp +class Foo { + ... + virtual void Bar(const int i) = 0; +}; + +class MockFoo : public Foo { + ... + MOCK_METHOD(void, Bar, (const int i), (override)); +}; +``` + +You may get the following warning: + +```shell +warning C4301: 'MockFoo::Bar': overriding virtual function only differs from 'Foo::Bar' by const/volatile qualifier +``` + +This is a MSVC bug. The same code compiles fine with gcc, for example. If you +use Visual C++ 2008 SP1, you would get the warning: + +```shell +warning C4373: 'MockFoo::Bar': virtual function overrides 'Foo::Bar', previous versions of the compiler did not override when parameters only differed by const/volatile qualifiers +``` + +In C++, if you *declare* a function with a `const` parameter, the `const` +modifier is ignored. Therefore, the `Foo` base class above is equivalent to: + +```cpp +class Foo { + ... + virtual void Bar(int i) = 0; // int or const int? Makes no difference. +}; +``` + +In fact, you can *declare* `Bar()` with an `int` parameter, and define it with a +`const int` parameter. The compiler will still match them up. + +Since making a parameter `const` is meaningless in the method declaration, we +recommend to remove it in both `Foo` and `MockFoo`. That should workaround the +VC bug. + +Note that we are talking about the *top-level* `const` modifier here. If the +function parameter is passed by pointer or reference, declaring the pointee or +referee as `const` is still meaningful. For example, the following two +declarations are *not* equivalent: + +```cpp +void Bar(int* p); // Neither p nor *p is const. +void Bar(const int* p); // p is not const, but *p is. +``` + +### I can't figure out why gMock thinks my expectations are not satisfied. What should I do? + +You might want to run your test with `--gmock_verbose=info`. This flag lets +gMock print a trace of every mock function call it receives. By studying the +trace, you'll gain insights on why the expectations you set are not met. + +If you see the message "The mock function has no default action set, and its +return type has no default value set.", then try +[adding a default action](gmock_cheat_sheet.md#OnCall). Due to a known issue, +unexpected calls on mocks without default actions don't print out a detailed +comparison between the actual arguments and the expected arguments. + +### My program crashed and `ScopedMockLog` spit out tons of messages. Is it a gMock bug? + +gMock and `ScopedMockLog` are likely doing the right thing here. + +When a test crashes, the failure signal handler will try to log a lot of +information (the stack trace, and the address map, for example). The messages +are compounded if you have many threads with depth stacks. When `ScopedMockLog` +intercepts these messages and finds that they don't match any expectations, it +prints an error for each of them. + +You can learn to ignore the errors, or you can rewrite your expectations to make +your test more robust, for example, by adding something like: + +```cpp +using ::testing::AnyNumber; +using ::testing::Not; +... + // Ignores any log not done by us. + EXPECT_CALL(log, Log(_, Not(EndsWith("/my_file.cc")), _)) + .Times(AnyNumber()); +``` + +### How can I assert that a function is NEVER called? + +```cpp +using ::testing::_; +... + EXPECT_CALL(foo, Bar(_)) + .Times(0); +``` + +### I have a failed test where gMock tells me TWICE that a particular expectation is not satisfied. Isn't this redundant? + +When gMock detects a failure, it prints relevant information (the mock function +arguments, the state of relevant expectations, and etc) to help the user debug. +If another failure is detected, gMock will do the same, including printing the +state of relevant expectations. + +Sometimes an expectation's state didn't change between two failures, and you'll +see the same description of the state twice. They are however *not* redundant, +as they refer to *different points in time*. The fact they are the same *is* +interesting information. + +### I get a heapcheck failure when using a mock object, but using a real object is fine. What can be wrong? + +Does the class (hopefully a pure interface) you are mocking have a virtual +destructor? + +Whenever you derive from a base class, make sure its destructor is virtual. +Otherwise Bad Things will happen. Consider the following code: + +```cpp +class Base { + public: + // Not virtual, but should be. + ~Base() { ... } + ... +}; + +class Derived : public Base { + public: + ... + private: + std::string value_; +}; + +... + Base* p = new Derived; + ... + delete p; // Surprise! ~Base() will be called, but ~Derived() will not + // - value_ is leaked. +``` + +By changing `~Base()` to virtual, `~Derived()` will be correctly called when +`delete p` is executed, and the heap checker will be happy. + +### The "newer expectations override older ones" rule makes writing expectations awkward. Why does gMock do that? + +When people complain about this, often they are referring to code like: + +```cpp +using ::testing::Return; +... + // foo.Bar() should be called twice, return 1 the first time, and return + // 2 the second time. However, I have to write the expectations in the + // reverse order. This sucks big time!!! + EXPECT_CALL(foo, Bar()) + .WillOnce(Return(2)) + .RetiresOnSaturation(); + EXPECT_CALL(foo, Bar()) + .WillOnce(Return(1)) + .RetiresOnSaturation(); +``` + +The problem, is that they didn't pick the **best** way to express the test's +intent. + +By default, expectations don't have to be matched in *any* particular order. If +you want them to match in a certain order, you need to be explicit. This is +gMock's (and jMock's) fundamental philosophy: it's easy to accidentally +over-specify your tests, and we want to make it harder to do so. + +There are two better ways to write the test spec. You could either put the +expectations in sequence: + +```cpp +using ::testing::Return; +... + // foo.Bar() should be called twice, return 1 the first time, and return + // 2 the second time. Using a sequence, we can write the expectations + // in their natural order. + { + InSequence s; + EXPECT_CALL(foo, Bar()) + .WillOnce(Return(1)) + .RetiresOnSaturation(); + EXPECT_CALL(foo, Bar()) + .WillOnce(Return(2)) + .RetiresOnSaturation(); + } +``` + +or you can put the sequence of actions in the same expectation: + +```cpp +using ::testing::Return; +... + // foo.Bar() should be called twice, return 1 the first time, and return + // 2 the second time. + EXPECT_CALL(foo, Bar()) + .WillOnce(Return(1)) + .WillOnce(Return(2)) + .RetiresOnSaturation(); +``` + +Back to the original questions: why does gMock search the expectations (and +`ON_CALL`s) from back to front? Because this allows a user to set up a mock's +behavior for the common case early (e.g. in the mock's constructor or the test +fixture's set-up phase) and customize it with more specific rules later. If +gMock searches from front to back, this very useful pattern won't be possible. + +### gMock prints a warning when a function without EXPECT_CALL is called, even if I have set its behavior using ON_CALL. Would it be reasonable not to show the warning in this case? + +When choosing between being neat and being safe, we lean toward the latter. So +the answer is that we think it's better to show the warning. + +Often people write `ON_CALL`s in the mock object's constructor or `SetUp()`, as +the default behavior rarely changes from test to test. Then in the test body +they set the expectations, which are often different for each test. Having an +`ON_CALL` in the set-up part of a test doesn't mean that the calls are expected. +If there's no `EXPECT_CALL` and the method is called, it's possibly an error. If +we quietly let the call go through without notifying the user, bugs may creep in +unnoticed. + +If, however, you are sure that the calls are OK, you can write + +```cpp +using ::testing::_; +... + EXPECT_CALL(foo, Bar(_)) + .WillRepeatedly(...); +``` + +instead of + +```cpp +using ::testing::_; +... + ON_CALL(foo, Bar(_)) + .WillByDefault(...); +``` + +This tells gMock that you do expect the calls and no warning should be printed. + +Also, you can control the verbosity by specifying `--gmock_verbose=error`. Other +values are `info` and `warning`. If you find the output too noisy when +debugging, just choose a less verbose level. + +### How can I delete the mock function's argument in an action? + +If your mock function takes a pointer argument and you want to delete that +argument, you can use testing::DeleteArg() to delete the N'th (zero-indexed) +argument: + +```cpp +using ::testing::_; + ... + MOCK_METHOD(void, Bar, (X* x, const Y& y)); + ... + EXPECT_CALL(mock_foo_, Bar(_, _)) + .WillOnce(testing::DeleteArg<0>())); +``` + +### How can I perform an arbitrary action on a mock function's argument? + +If you find yourself needing to perform some action that's not supported by +gMock directly, remember that you can define your own actions using +[`MakeAction()`](#NewMonoActions) or +[`MakePolymorphicAction()`](#NewPolyActions), or you can write a stub function +and invoke it using [`Invoke()`](#FunctionsAsActions). + +```cpp +using ::testing::_; +using ::testing::Invoke; + ... + MOCK_METHOD(void, Bar, (X* p)); + ... + EXPECT_CALL(mock_foo_, Bar(_)) + .WillOnce(Invoke(MyAction(...))); +``` + +### My code calls a static/global function. Can I mock it? + +You can, but you need to make some changes. + +In general, if you find yourself needing to mock a static function, it's a sign +that your modules are too tightly coupled (and less flexible, less reusable, +less testable, etc). You are probably better off defining a small interface and +call the function through that interface, which then can be easily mocked. It's +a bit of work initially, but usually pays for itself quickly. + +This Google Testing Blog +[post](https://testing.googleblog.com/2008/06/defeat-static-cling.html) says it +excellently. Check it out. + +### My mock object needs to do complex stuff. It's a lot of pain to specify the actions. gMock sucks! + +I know it's not a question, but you get an answer for free any way. :-) + +With gMock, you can create mocks in C++ easily. And people might be tempted to +use them everywhere. Sometimes they work great, and sometimes you may find them, +well, a pain to use. So, what's wrong in the latter case? + +When you write a test without using mocks, you exercise the code and assert that +it returns the correct value or that the system is in an expected state. This is +sometimes called "state-based testing". + +Mocks are great for what some call "interaction-based" testing: instead of +checking the system state at the very end, mock objects verify that they are +invoked the right way and report an error as soon as it arises, giving you a +handle on the precise context in which the error was triggered. This is often +more effective and economical to do than state-based testing. + +If you are doing state-based testing and using a test double just to simulate +the real object, you are probably better off using a fake. Using a mock in this +case causes pain, as it's not a strong point for mocks to perform complex +actions. If you experience this and think that mocks suck, you are just not +using the right tool for your problem. Or, you might be trying to solve the +wrong problem. :-) + +### I got a warning "Uninteresting function call encountered - default action taken.." Should I panic? + +By all means, NO! It's just an FYI. :-) + +What it means is that you have a mock function, you haven't set any expectations +on it (by gMock's rule this means that you are not interested in calls to this +function and therefore it can be called any number of times), and it is called. +That's OK - you didn't say it's not OK to call the function! + +What if you actually meant to disallow this function to be called, but forgot to +write `EXPECT_CALL(foo, Bar()).Times(0)`? While one can argue that it's the +user's fault, gMock tries to be nice and prints you a note. + +So, when you see the message and believe that there shouldn't be any +uninteresting calls, you should investigate what's going on. To make your life +easier, gMock dumps the stack trace when an uninteresting call is encountered. +From that you can figure out which mock function it is, and how it is called. + +### I want to define a custom action. Should I use Invoke() or implement the ActionInterface interface? + +Either way is fine - you want to choose the one that's more convenient for your +circumstance. + +Usually, if your action is for a particular function type, defining it using +`Invoke()` should be easier; if your action can be used in functions of +different types (e.g. if you are defining `Return(*value*)`), +`MakePolymorphicAction()` is easiest. Sometimes you want precise control on what +types of functions the action can be used in, and implementing `ActionInterface` +is the way to go here. See the implementation of `Return()` in `gmock-actions.h` +for an example. + +### I use SetArgPointee() in WillOnce(), but gcc complains about "conflicting return type specified". What does it mean? + +You got this error as gMock has no idea what value it should return when the +mock method is called. `SetArgPointee()` says what the side effect is, but +doesn't say what the return value should be. You need `DoAll()` to chain a +`SetArgPointee()` with a `Return()` that provides a value appropriate to the API +being mocked. + +See this [recipe](gmock_cook_book.md#mocking-side-effects) for more details and +an example. + +### I have a huge mock class, and Microsoft Visual C++ runs out of memory when compiling it. What can I do? + +We've noticed that when the `/clr` compiler flag is used, Visual C++ uses 5~6 +times as much memory when compiling a mock class. We suggest to avoid `/clr` +when compiling native C++ mocks. diff --git a/vendor/googletest-1.14.0/docs/gmock_for_dummies.md b/vendor/googletest-1.14.0/docs/gmock_for_dummies.md new file mode 100644 index 00000000..43f907aa --- /dev/null +++ b/vendor/googletest-1.14.0/docs/gmock_for_dummies.md @@ -0,0 +1,700 @@ +# gMock for Dummies + +## What Is gMock? + +When you write a prototype or test, often it's not feasible or wise to rely on +real objects entirely. A **mock object** implements the same interface as a real +object (so it can be used as one), but lets you specify at run time how it will +be used and what it should do (which methods will be called? in which order? how +many times? with what arguments? what will they return? etc). + +It is easy to confuse the term *fake objects* with mock objects. Fakes and mocks +actually mean very different things in the Test-Driven Development (TDD) +community: + +* **Fake** objects have working implementations, but usually take some + shortcut (perhaps to make the operations less expensive), which makes them + not suitable for production. An in-memory file system would be an example of + a fake. +* **Mocks** are objects pre-programmed with *expectations*, which form a + specification of the calls they are expected to receive. + +If all this seems too abstract for you, don't worry - the most important thing +to remember is that a mock allows you to check the *interaction* between itself +and code that uses it. The difference between fakes and mocks shall become much +clearer once you start to use mocks. + +**gMock** is a library (sometimes we also call it a "framework" to make it sound +cool) for creating mock classes and using them. It does to C++ what +jMock/EasyMock does to Java (well, more or less). + +When using gMock, + +1. first, you use some simple macros to describe the interface you want to + mock, and they will expand to the implementation of your mock class; +2. next, you create some mock objects and specify its expectations and behavior + using an intuitive syntax; +3. then you exercise code that uses the mock objects. gMock will catch any + violation to the expectations as soon as it arises. + +## Why gMock? + +While mock objects help you remove unnecessary dependencies in tests and make +them fast and reliable, using mocks manually in C++ is *hard*: + +* Someone has to implement the mocks. The job is usually tedious and + error-prone. No wonder people go great distance to avoid it. +* The quality of those manually written mocks is a bit, uh, unpredictable. You + may see some really polished ones, but you may also see some that were + hacked up in a hurry and have all sorts of ad hoc restrictions. +* The knowledge you gained from using one mock doesn't transfer to the next + one. + +In contrast, Java and Python programmers have some fine mock frameworks (jMock, +EasyMock, etc), which automate the creation of mocks. As a result, mocking is a +proven effective technique and widely adopted practice in those communities. +Having the right tool absolutely makes the difference. + +gMock was built to help C++ programmers. It was inspired by jMock and EasyMock, +but designed with C++'s specifics in mind. It is your friend if any of the +following problems is bothering you: + +* You are stuck with a sub-optimal design and wish you had done more + prototyping before it was too late, but prototyping in C++ is by no means + "rapid". +* Your tests are slow as they depend on too many libraries or use expensive + resources (e.g. a database). +* Your tests are brittle as some resources they use are unreliable (e.g. the + network). +* You want to test how your code handles a failure (e.g. a file checksum + error), but it's not easy to cause one. +* You need to make sure that your module interacts with other modules in the + right way, but it's hard to observe the interaction; therefore you resort to + observing the side effects at the end of the action, but it's awkward at + best. +* You want to "mock out" your dependencies, except that they don't have mock + implementations yet; and, frankly, you aren't thrilled by some of those + hand-written mocks. + +We encourage you to use gMock as + +* a *design* tool, for it lets you experiment with your interface design early + and often. More iterations lead to better designs! +* a *testing* tool to cut your tests' outbound dependencies and probe the + interaction between your module and its collaborators. + +## Getting Started + +gMock is bundled with googletest. + +## A Case for Mock Turtles + +Let's look at an example. Suppose you are developing a graphics program that +relies on a [LOGO](http://en.wikipedia.org/wiki/Logo_programming_language)-like +API for drawing. How would you test that it does the right thing? Well, you can +run it and compare the screen with a golden screen snapshot, but let's admit it: +tests like this are expensive to run and fragile (What if you just upgraded to a +shiny new graphics card that has better anti-aliasing? Suddenly you have to +update all your golden images.). It would be too painful if all your tests are +like this. Fortunately, you learned about +[Dependency Injection](http://en.wikipedia.org/wiki/Dependency_injection) and know the right thing +to do: instead of having your application talk to the system API directly, wrap +the API in an interface (say, `Turtle`) and code to that interface: + +```cpp +class Turtle { + ... + virtual ~Turtle() {} + virtual void PenUp() = 0; + virtual void PenDown() = 0; + virtual void Forward(int distance) = 0; + virtual void Turn(int degrees) = 0; + virtual void GoTo(int x, int y) = 0; + virtual int GetX() const = 0; + virtual int GetY() const = 0; +}; +``` + +(Note that the destructor of `Turtle` **must** be virtual, as is the case for +**all** classes you intend to inherit from - otherwise the destructor of the +derived class will not be called when you delete an object through a base +pointer, and you'll get corrupted program states like memory leaks.) + +You can control whether the turtle's movement will leave a trace using `PenUp()` +and `PenDown()`, and control its movement using `Forward()`, `Turn()`, and +`GoTo()`. Finally, `GetX()` and `GetY()` tell you the current position of the +turtle. + +Your program will normally use a real implementation of this interface. In +tests, you can use a mock implementation instead. This allows you to easily +check what drawing primitives your program is calling, with what arguments, and +in which order. Tests written this way are much more robust (they won't break +because your new machine does anti-aliasing differently), easier to read and +maintain (the intent of a test is expressed in the code, not in some binary +images), and run *much, much faster*. + +## Writing the Mock Class + +If you are lucky, the mocks you need to use have already been implemented by +some nice people. If, however, you find yourself in the position to write a mock +class, relax - gMock turns this task into a fun game! (Well, almost.) + +### How to Define It + +Using the `Turtle` interface as example, here are the simple steps you need to +follow: + +* Derive a class `MockTurtle` from `Turtle`. +* Take a *virtual* function of `Turtle` (while it's possible to + [mock non-virtual methods using templates](gmock_cook_book.md#MockingNonVirtualMethods), + it's much more involved). +* In the `public:` section of the child class, write `MOCK_METHOD();` +* Now comes the fun part: you take the function signature, cut-and-paste it + into the macro, and add two commas - one between the return type and the + name, another between the name and the argument list. +* If you're mocking a const method, add a 4th parameter containing `(const)` + (the parentheses are required). +* Since you're overriding a virtual method, we suggest adding the `override` + keyword. For const methods the 4th parameter becomes `(const, override)`, + for non-const methods just `(override)`. This isn't mandatory. +* Repeat until all virtual functions you want to mock are done. (It goes + without saying that *all* pure virtual methods in your abstract class must + be either mocked or overridden.) + +After the process, you should have something like: + +```cpp +#include // Brings in gMock. + +class MockTurtle : public Turtle { + public: + ... + MOCK_METHOD(void, PenUp, (), (override)); + MOCK_METHOD(void, PenDown, (), (override)); + MOCK_METHOD(void, Forward, (int distance), (override)); + MOCK_METHOD(void, Turn, (int degrees), (override)); + MOCK_METHOD(void, GoTo, (int x, int y), (override)); + MOCK_METHOD(int, GetX, (), (const, override)); + MOCK_METHOD(int, GetY, (), (const, override)); +}; +``` + +You don't need to define these mock methods somewhere else - the `MOCK_METHOD` +macro will generate the definitions for you. It's that simple! + +### Where to Put It + +When you define a mock class, you need to decide where to put its definition. +Some people put it in a `_test.cc`. This is fine when the interface being mocked +(say, `Foo`) is owned by the same person or team. Otherwise, when the owner of +`Foo` changes it, your test could break. (You can't really expect `Foo`'s +maintainer to fix every test that uses `Foo`, can you?) + +Generally, you should not mock classes you don't own. If you must mock such a +class owned by others, define the mock class in `Foo`'s Bazel package (usually +the same directory or a `testing` sub-directory), and put it in a `.h` and a +`cc_library` with `testonly=True`. Then everyone can reference them from their +tests. If `Foo` ever changes, there is only one copy of `MockFoo` to change, and +only tests that depend on the changed methods need to be fixed. + +Another way to do it: you can introduce a thin layer `FooAdaptor` on top of +`Foo` and code to this new interface. Since you own `FooAdaptor`, you can absorb +changes in `Foo` much more easily. While this is more work initially, carefully +choosing the adaptor interface can make your code easier to write and more +readable (a net win in the long run), as you can choose `FooAdaptor` to fit your +specific domain much better than `Foo` does. + +## Using Mocks in Tests + +Once you have a mock class, using it is easy. The typical work flow is: + +1. Import the gMock names from the `testing` namespace such that you can use + them unqualified (You only have to do it once per file). Remember that + namespaces are a good idea. +2. Create some mock objects. +3. Specify your expectations on them (How many times will a method be called? + With what arguments? What should it do? etc.). +4. Exercise some code that uses the mocks; optionally, check the result using + googletest assertions. If a mock method is called more than expected or with + wrong arguments, you'll get an error immediately. +5. When a mock is destructed, gMock will automatically check whether all + expectations on it have been satisfied. + +Here's an example: + +```cpp +#include "path/to/mock-turtle.h" +#include +#include + +using ::testing::AtLeast; // #1 + +TEST(PainterTest, CanDrawSomething) { + MockTurtle turtle; // #2 + EXPECT_CALL(turtle, PenDown()) // #3 + .Times(AtLeast(1)); + + Painter painter(&turtle); // #4 + + EXPECT_TRUE(painter.DrawCircle(0, 0, 10)); // #5 +} +``` + +As you might have guessed, this test checks that `PenDown()` is called at least +once. If the `painter` object didn't call this method, your test will fail with +a message like this: + +```text +path/to/my_test.cc:119: Failure +Actual function call count doesn't match this expectation: +Actually: never called; +Expected: called at least once. +Stack trace: +... +``` + +**Tip 1:** If you run the test from an Emacs buffer, you can hit `` on +the line number to jump right to the failed expectation. + +**Tip 2:** If your mock objects are never deleted, the final verification won't +happen. Therefore it's a good idea to turn on the heap checker in your tests +when you allocate mocks on the heap. You get that automatically if you use the +`gtest_main` library already. + +**Important note:** gMock requires expectations to be set **before** the mock +functions are called, otherwise the behavior is **undefined**. Do not alternate +between calls to `EXPECT_CALL()` and calls to the mock functions, and do not set +any expectations on a mock after passing the mock to an API. + +This means `EXPECT_CALL()` should be read as expecting that a call will occur +*in the future*, not that a call has occurred. Why does gMock work like that? +Well, specifying the expectation beforehand allows gMock to report a violation +as soon as it rises, when the context (stack trace, etc) is still available. +This makes debugging much easier. + +Admittedly, this test is contrived and doesn't do much. You can easily achieve +the same effect without using gMock. However, as we shall reveal soon, gMock +allows you to do *so much more* with the mocks. + +## Setting Expectations + +The key to using a mock object successfully is to set the *right expectations* +on it. If you set the expectations too strict, your test will fail as the result +of unrelated changes. If you set them too loose, bugs can slip through. You want +to do it just right such that your test can catch exactly the kind of bugs you +intend it to catch. gMock provides the necessary means for you to do it "just +right." + +### General Syntax + +In gMock we use the `EXPECT_CALL()` macro to set an expectation on a mock +method. The general syntax is: + +```cpp +EXPECT_CALL(mock_object, method(matchers)) + .Times(cardinality) + .WillOnce(action) + .WillRepeatedly(action); +``` + +The macro has two arguments: first the mock object, and then the method and its +arguments. Note that the two are separated by a comma (`,`), not a period (`.`). +(Why using a comma? The answer is that it was necessary for technical reasons.) +If the method is not overloaded, the macro can also be called without matchers: + +```cpp +EXPECT_CALL(mock_object, non-overloaded-method) + .Times(cardinality) + .WillOnce(action) + .WillRepeatedly(action); +``` + +This syntax allows the test writer to specify "called with any arguments" +without explicitly specifying the number or types of arguments. To avoid +unintended ambiguity, this syntax may only be used for methods that are not +overloaded. + +Either form of the macro can be followed by some optional *clauses* that provide +more information about the expectation. We'll discuss how each clause works in +the coming sections. + +This syntax is designed to make an expectation read like English. For example, +you can probably guess that + +```cpp +using ::testing::Return; +... +EXPECT_CALL(turtle, GetX()) + .Times(5) + .WillOnce(Return(100)) + .WillOnce(Return(150)) + .WillRepeatedly(Return(200)); +``` + +says that the `turtle` object's `GetX()` method will be called five times, it +will return 100 the first time, 150 the second time, and then 200 every time. +Some people like to call this style of syntax a Domain-Specific Language (DSL). + +{: .callout .note} +**Note:** Why do we use a macro to do this? Well it serves two purposes: first +it makes expectations easily identifiable (either by `grep` or by a human +reader), and second it allows gMock to include the source file location of a +failed expectation in messages, making debugging easier. + +### Matchers: What Arguments Do We Expect? + +When a mock function takes arguments, we may specify what arguments we are +expecting, for example: + +```cpp +// Expects the turtle to move forward by 100 units. +EXPECT_CALL(turtle, Forward(100)); +``` + +Oftentimes you do not want to be too specific. Remember that talk about tests +being too rigid? Over specification leads to brittle tests and obscures the +intent of tests. Therefore we encourage you to specify only what's necessary—no +more, no less. If you aren't interested in the value of an argument, write `_` +as the argument, which means "anything goes": + +```cpp +using ::testing::_; +... +// Expects that the turtle jumps to somewhere on the x=50 line. +EXPECT_CALL(turtle, GoTo(50, _)); +``` + +`_` is an instance of what we call **matchers**. A matcher is like a predicate +and can test whether an argument is what we'd expect. You can use a matcher +inside `EXPECT_CALL()` wherever a function argument is expected. `_` is a +convenient way of saying "any value". + +In the above examples, `100` and `50` are also matchers; implicitly, they are +the same as `Eq(100)` and `Eq(50)`, which specify that the argument must be +equal (using `operator==`) to the matcher argument. There are many +[built-in matchers](reference/matchers.md) for common types (as well as +[custom matchers](gmock_cook_book.md#NewMatchers)); for example: + +```cpp +using ::testing::Ge; +... +// Expects the turtle moves forward by at least 100. +EXPECT_CALL(turtle, Forward(Ge(100))); +``` + +If you don't care about *any* arguments, rather than specify `_` for each of +them you may instead omit the parameter list: + +```cpp +// Expects the turtle to move forward. +EXPECT_CALL(turtle, Forward); +// Expects the turtle to jump somewhere. +EXPECT_CALL(turtle, GoTo); +``` + +This works for all non-overloaded methods; if a method is overloaded, you need +to help gMock resolve which overload is expected by specifying the number of +arguments and possibly also the +[types of the arguments](gmock_cook_book.md#SelectOverload). + +### Cardinalities: How Many Times Will It Be Called? + +The first clause we can specify following an `EXPECT_CALL()` is `Times()`. We +call its argument a **cardinality** as it tells *how many times* the call should +occur. It allows us to repeat an expectation many times without actually writing +it as many times. More importantly, a cardinality can be "fuzzy", just like a +matcher can be. This allows a user to express the intent of a test exactly. + +An interesting special case is when we say `Times(0)`. You may have guessed - it +means that the function shouldn't be called with the given arguments at all, and +gMock will report a googletest failure whenever the function is (wrongfully) +called. + +We've seen `AtLeast(n)` as an example of fuzzy cardinalities earlier. For the +list of built-in cardinalities you can use, see +[here](gmock_cheat_sheet.md#CardinalityList). + +The `Times()` clause can be omitted. **If you omit `Times()`, gMock will infer +the cardinality for you.** The rules are easy to remember: + +* If **neither** `WillOnce()` **nor** `WillRepeatedly()` is in the + `EXPECT_CALL()`, the inferred cardinality is `Times(1)`. +* If there are *n* `WillOnce()`'s but **no** `WillRepeatedly()`, where *n* >= + 1, the cardinality is `Times(n)`. +* If there are *n* `WillOnce()`'s and **one** `WillRepeatedly()`, where *n* >= + 0, the cardinality is `Times(AtLeast(n))`. + +**Quick quiz:** what do you think will happen if a function is expected to be +called twice but actually called four times? + +### Actions: What Should It Do? + +Remember that a mock object doesn't really have a working implementation? We as +users have to tell it what to do when a method is invoked. This is easy in +gMock. + +First, if the return type of a mock function is a built-in type or a pointer, +the function has a **default action** (a `void` function will just return, a +`bool` function will return `false`, and other functions will return 0). In +addition, in C++ 11 and above, a mock function whose return type is +default-constructible (i.e. has a default constructor) has a default action of +returning a default-constructed value. If you don't say anything, this behavior +will be used. + +Second, if a mock function doesn't have a default action, or the default action +doesn't suit you, you can specify the action to be taken each time the +expectation matches using a series of `WillOnce()` clauses followed by an +optional `WillRepeatedly()`. For example, + +```cpp +using ::testing::Return; +... +EXPECT_CALL(turtle, GetX()) + .WillOnce(Return(100)) + .WillOnce(Return(200)) + .WillOnce(Return(300)); +``` + +says that `turtle.GetX()` will be called *exactly three times* (gMock inferred +this from how many `WillOnce()` clauses we've written, since we didn't +explicitly write `Times()`), and will return 100, 200, and 300 respectively. + +```cpp +using ::testing::Return; +... +EXPECT_CALL(turtle, GetY()) + .WillOnce(Return(100)) + .WillOnce(Return(200)) + .WillRepeatedly(Return(300)); +``` + +says that `turtle.GetY()` will be called *at least twice* (gMock knows this as +we've written two `WillOnce()` clauses and a `WillRepeatedly()` while having no +explicit `Times()`), will return 100 and 200 respectively the first two times, +and 300 from the third time on. + +Of course, if you explicitly write a `Times()`, gMock will not try to infer the +cardinality itself. What if the number you specified is larger than there are +`WillOnce()` clauses? Well, after all `WillOnce()`s are used up, gMock will do +the *default* action for the function every time (unless, of course, you have a +`WillRepeatedly()`.). + +What can we do inside `WillOnce()` besides `Return()`? You can return a +reference using `ReturnRef(`*`variable`*`)`, or invoke a pre-defined function, +among [others](gmock_cook_book.md#using-actions). + +**Important note:** The `EXPECT_CALL()` statement evaluates the action clause +only once, even though the action may be performed many times. Therefore you +must be careful about side effects. The following may not do what you want: + +```cpp +using ::testing::Return; +... +int n = 100; +EXPECT_CALL(turtle, GetX()) + .Times(4) + .WillRepeatedly(Return(n++)); +``` + +Instead of returning 100, 101, 102, ..., consecutively, this mock function will +always return 100 as `n++` is only evaluated once. Similarly, `Return(new Foo)` +will create a new `Foo` object when the `EXPECT_CALL()` is executed, and will +return the same pointer every time. If you want the side effect to happen every +time, you need to define a custom action, which we'll teach in the +[cook book](gmock_cook_book.md). + +Time for another quiz! What do you think the following means? + +```cpp +using ::testing::Return; +... +EXPECT_CALL(turtle, GetY()) + .Times(4) + .WillOnce(Return(100)); +``` + +Obviously `turtle.GetY()` is expected to be called four times. But if you think +it will return 100 every time, think twice! Remember that one `WillOnce()` +clause will be consumed each time the function is invoked and the default action +will be taken afterwards. So the right answer is that `turtle.GetY()` will +return 100 the first time, but **return 0 from the second time on**, as +returning 0 is the default action for `int` functions. + +### Using Multiple Expectations {#MultiExpectations} + +So far we've only shown examples where you have a single expectation. More +realistically, you'll specify expectations on multiple mock methods which may be +from multiple mock objects. + +By default, when a mock method is invoked, gMock will search the expectations in +the **reverse order** they are defined, and stop when an active expectation that +matches the arguments is found (you can think of it as "newer rules override +older ones."). If the matching expectation cannot take any more calls, you will +get an upper-bound-violated failure. Here's an example: + +```cpp +using ::testing::_; +... +EXPECT_CALL(turtle, Forward(_)); // #1 +EXPECT_CALL(turtle, Forward(10)) // #2 + .Times(2); +``` + +If `Forward(10)` is called three times in a row, the third time it will be an +error, as the last matching expectation (#2) has been saturated. If, however, +the third `Forward(10)` call is replaced by `Forward(20)`, then it would be OK, +as now #1 will be the matching expectation. + +{: .callout .note} +**Note:** Why does gMock search for a match in the *reverse* order of the +expectations? The reason is that this allows a user to set up the default +expectations in a mock object's constructor or the test fixture's set-up phase +and then customize the mock by writing more specific expectations in the test +body. So, if you have two expectations on the same method, you want to put the +one with more specific matchers **after** the other, or the more specific rule +would be shadowed by the more general one that comes after it. + +{: .callout .tip} +**Tip:** It is very common to start with a catch-all expectation for a method +and `Times(AnyNumber())` (omitting arguments, or with `_` for all arguments, if +overloaded). This makes any calls to the method expected. This is not necessary +for methods that are not mentioned at all (these are "uninteresting"), but is +useful for methods that have some expectations, but for which other calls are +ok. See +[Understanding Uninteresting vs Unexpected Calls](gmock_cook_book.md#uninteresting-vs-unexpected). + +### Ordered vs Unordered Calls {#OrderedCalls} + +By default, an expectation can match a call even though an earlier expectation +hasn't been satisfied. In other words, the calls don't have to occur in the +order the expectations are specified. + +Sometimes, you may want all the expected calls to occur in a strict order. To +say this in gMock is easy: + +```cpp +using ::testing::InSequence; +... +TEST(FooTest, DrawsLineSegment) { + ... + { + InSequence seq; + + EXPECT_CALL(turtle, PenDown()); + EXPECT_CALL(turtle, Forward(100)); + EXPECT_CALL(turtle, PenUp()); + } + Foo(); +} +``` + +By creating an object of type `InSequence`, all expectations in its scope are +put into a *sequence* and have to occur *sequentially*. Since we are just +relying on the constructor and destructor of this object to do the actual work, +its name is really irrelevant. + +In this example, we test that `Foo()` calls the three expected functions in the +order as written. If a call is made out-of-order, it will be an error. + +(What if you care about the relative order of some of the calls, but not all of +them? Can you specify an arbitrary partial order? The answer is ... yes! The +details can be found [here](gmock_cook_book.md#OrderedCalls).) + +### All Expectations Are Sticky (Unless Said Otherwise) {#StickyExpectations} + +Now let's do a quick quiz to see how well you can use this mock stuff already. +How would you test that the turtle is asked to go to the origin *exactly twice* +(you want to ignore any other instructions it receives)? + +After you've come up with your answer, take a look at ours and compare notes +(solve it yourself first - don't cheat!): + +```cpp +using ::testing::_; +using ::testing::AnyNumber; +... +EXPECT_CALL(turtle, GoTo(_, _)) // #1 + .Times(AnyNumber()); +EXPECT_CALL(turtle, GoTo(0, 0)) // #2 + .Times(2); +``` + +Suppose `turtle.GoTo(0, 0)` is called three times. In the third time, gMock will +see that the arguments match expectation #2 (remember that we always pick the +last matching expectation). Now, since we said that there should be only two +such calls, gMock will report an error immediately. This is basically what we've +told you in the [Using Multiple Expectations](#MultiExpectations) section above. + +This example shows that **expectations in gMock are "sticky" by default**, in +the sense that they remain active even after we have reached their invocation +upper bounds. This is an important rule to remember, as it affects the meaning +of the spec, and is **different** to how it's done in many other mocking +frameworks (Why'd we do that? Because we think our rule makes the common cases +easier to express and understand.). + +Simple? Let's see if you've really understood it: what does the following code +say? + +```cpp +using ::testing::Return; +... +for (int i = n; i > 0; i--) { + EXPECT_CALL(turtle, GetX()) + .WillOnce(Return(10*i)); +} +``` + +If you think it says that `turtle.GetX()` will be called `n` times and will +return 10, 20, 30, ..., consecutively, think twice! The problem is that, as we +said, expectations are sticky. So, the second time `turtle.GetX()` is called, +the last (latest) `EXPECT_CALL()` statement will match, and will immediately +lead to an "upper bound violated" error - this piece of code is not very useful! + +One correct way of saying that `turtle.GetX()` will return 10, 20, 30, ..., is +to explicitly say that the expectations are *not* sticky. In other words, they +should *retire* as soon as they are saturated: + +```cpp +using ::testing::Return; +... +for (int i = n; i > 0; i--) { + EXPECT_CALL(turtle, GetX()) + .WillOnce(Return(10*i)) + .RetiresOnSaturation(); +} +``` + +And, there's a better way to do it: in this case, we expect the calls to occur +in a specific order, and we line up the actions to match the order. Since the +order is important here, we should make it explicit using a sequence: + +```cpp +using ::testing::InSequence; +using ::testing::Return; +... +{ + InSequence s; + + for (int i = 1; i <= n; i++) { + EXPECT_CALL(turtle, GetX()) + .WillOnce(Return(10*i)) + .RetiresOnSaturation(); + } +} +``` + +By the way, the other situation where an expectation may *not* be sticky is when +it's in a sequence - as soon as another expectation that comes after it in the +sequence has been used, it automatically retires (and will never be used to +match any call). + +### Uninteresting Calls + +A mock object may have many methods, and not all of them are that interesting. +For example, in some tests we may not care about how many times `GetX()` and +`GetY()` get called. + +In gMock, if you are not interested in a method, just don't say anything about +it. If a call to this method occurs, you'll see a warning in the test output, +but it won't be a failure. This is called "naggy" behavior; to change, see +[The Nice, the Strict, and the Naggy](gmock_cook_book.md#NiceStrictNaggy). diff --git a/vendor/googletest-1.14.0/docs/index.md b/vendor/googletest-1.14.0/docs/index.md new file mode 100644 index 00000000..b162c740 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/index.md @@ -0,0 +1,22 @@ +# GoogleTest User's Guide + +## Welcome to GoogleTest! + +GoogleTest is Google's C++ testing and mocking framework. This user's guide has +the following contents: + +* [GoogleTest Primer](primer.md) - Teaches you how to write simple tests using + GoogleTest. Read this first if you are new to GoogleTest. +* [GoogleTest Advanced](advanced.md) - Read this when you've finished the + Primer and want to utilize GoogleTest to its full potential. +* [GoogleTest Samples](samples.md) - Describes some GoogleTest samples. +* [GoogleTest FAQ](faq.md) - Have a question? Want some tips? Check here + first. +* [Mocking for Dummies](gmock_for_dummies.md) - Teaches you how to create mock + objects and use them in tests. +* [Mocking Cookbook](gmock_cook_book.md) - Includes tips and approaches to + common mocking use cases. +* [Mocking Cheat Sheet](gmock_cheat_sheet.md) - A handy reference for + matchers, actions, invariants, and more. +* [Mocking FAQ](gmock_faq.md) - Contains answers to some mocking-specific + questions. diff --git a/vendor/googletest-1.14.0/docs/pkgconfig.md b/vendor/googletest-1.14.0/docs/pkgconfig.md new file mode 100644 index 00000000..bf05d593 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/pkgconfig.md @@ -0,0 +1,144 @@ +## Using GoogleTest from various build systems + +GoogleTest comes with pkg-config files that can be used to determine all +necessary flags for compiling and linking to GoogleTest (and GoogleMock). +Pkg-config is a standardised plain-text format containing + +* the includedir (-I) path +* necessary macro (-D) definitions +* further required flags (-pthread) +* the library (-L) path +* the library (-l) to link to + +All current build systems support pkg-config in one way or another. For all +examples here we assume you want to compile the sample +`samples/sample3_unittest.cc`. + +### CMake + +Using `pkg-config` in CMake is fairly easy: + +```cmake +find_package(PkgConfig) +pkg_search_module(GTEST REQUIRED gtest_main) + +add_executable(testapp) +target_sources(testapp PRIVATE samples/sample3_unittest.cc) +target_link_libraries(testapp PRIVATE ${GTEST_LDFLAGS}) +target_compile_options(testapp PRIVATE ${GTEST_CFLAGS}) + +enable_testing() +add_test(first_and_only_test testapp) +``` + +It is generally recommended that you use `target_compile_options` + `_CFLAGS` +over `target_include_directories` + `_INCLUDE_DIRS` as the former includes not +just -I flags (GoogleTest might require a macro indicating to internal headers +that all libraries have been compiled with threading enabled. In addition, +GoogleTest might also require `-pthread` in the compiling step, and as such +splitting the pkg-config `Cflags` variable into include dirs and macros for +`target_compile_definitions()` might still miss this). The same recommendation +goes for using `_LDFLAGS` over the more commonplace `_LIBRARIES`, which happens +to discard `-L` flags and `-pthread`. + +### Help! pkg-config can't find GoogleTest! + +Let's say you have a `CMakeLists.txt` along the lines of the one in this +tutorial and you try to run `cmake`. It is very possible that you get a failure +along the lines of: + +``` +-- Checking for one of the modules 'gtest_main' +CMake Error at /usr/share/cmake/Modules/FindPkgConfig.cmake:640 (message): + None of the required 'gtest_main' found +``` + +These failures are common if you installed GoogleTest yourself and have not +sourced it from a distro or other package manager. If so, you need to tell +pkg-config where it can find the `.pc` files containing the information. Say you +installed GoogleTest to `/usr/local`, then it might be that the `.pc` files are +installed under `/usr/local/lib64/pkgconfig`. If you set + +``` +export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig +``` + +pkg-config will also try to look in `PKG_CONFIG_PATH` to find `gtest_main.pc`. + +### Using pkg-config in a cross-compilation setting + +Pkg-config can be used in a cross-compilation setting too. To do this, let's +assume the final prefix of the cross-compiled installation will be `/usr`, and +your sysroot is `/home/MYUSER/sysroot`. Configure and install GTest using + +``` +mkdir build && cmake -DCMAKE_INSTALL_PREFIX=/usr .. +``` + +Install into the sysroot using `DESTDIR`: + +``` +make -j install DESTDIR=/home/MYUSER/sysroot +``` + +Before we continue, it is recommended to **always** define the following two +variables for pkg-config in a cross-compilation setting: + +``` +export PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=yes +export PKG_CONFIG_ALLOW_SYSTEM_LIBS=yes +``` + +otherwise `pkg-config` will filter `-I` and `-L` flags against standard prefixes +such as `/usr` (see https://bugs.freedesktop.org/show_bug.cgi?id=28264#c3 for +reasons why this stripping needs to occur usually). + +If you look at the generated pkg-config file, it will look something like + +``` +libdir=/usr/lib64 +includedir=/usr/include + +Name: gtest +Description: GoogleTest (without main() function) +Version: 1.11.0 +URL: https://github.com/google/googletest +Libs: -L${libdir} -lgtest -lpthread +Cflags: -I${includedir} -DGTEST_HAS_PTHREAD=1 -lpthread +``` + +Notice that the sysroot is not included in `libdir` and `includedir`! If you try +to run `pkg-config` with the correct +`PKG_CONFIG_LIBDIR=/home/MYUSER/sysroot/usr/lib64/pkgconfig` against this `.pc` +file, you will get + +``` +$ pkg-config --cflags gtest +-DGTEST_HAS_PTHREAD=1 -lpthread -I/usr/include +$ pkg-config --libs gtest +-L/usr/lib64 -lgtest -lpthread +``` + +which is obviously wrong and points to the `CBUILD` and not `CHOST` root. In +order to use this in a cross-compilation setting, we need to tell pkg-config to +inject the actual sysroot into `-I` and `-L` variables. Let us now tell +pkg-config about the actual sysroot + +``` +export PKG_CONFIG_DIR= +export PKG_CONFIG_SYSROOT_DIR=/home/MYUSER/sysroot +export PKG_CONFIG_LIBDIR=${PKG_CONFIG_SYSROOT_DIR}/usr/lib64/pkgconfig +``` + +and running `pkg-config` again we get + +``` +$ pkg-config --cflags gtest +-DGTEST_HAS_PTHREAD=1 -lpthread -I/home/MYUSER/sysroot/usr/include +$ pkg-config --libs gtest +-L/home/MYUSER/sysroot/usr/lib64 -lgtest -lpthread +``` + +which contains the correct sysroot now. For a more comprehensive guide to also +including `${CHOST}` in build system calls, see the excellent tutorial by Diego +Elio Pettenò: diff --git a/vendor/googletest-1.14.0/docs/platforms.md b/vendor/googletest-1.14.0/docs/platforms.md new file mode 100644 index 00000000..d35a7be0 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/platforms.md @@ -0,0 +1,8 @@ +# Supported Platforms + +GoogleTest follows Google's +[Foundational C++ Support Policy](https://opensource.google/documentation/policies/cplusplus-support). +See +[this table](https://github.com/google/oss-policies-info/blob/main/foundational-cxx-support-matrix.md) +for a list of currently supported versions compilers, platforms, and build +tools. diff --git a/vendor/googletest-1.14.0/docs/primer.md b/vendor/googletest-1.14.0/docs/primer.md new file mode 100644 index 00000000..f2a97a72 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/primer.md @@ -0,0 +1,483 @@ +# GoogleTest Primer + +## Introduction: Why GoogleTest? + +*GoogleTest* helps you write better C++ tests. + +GoogleTest is a testing framework developed by the Testing Technology team with +Google's specific requirements and constraints in mind. Whether you work on +Linux, Windows, or a Mac, if you write C++ code, GoogleTest can help you. And it +supports *any* kind of tests, not just unit tests. + +So what makes a good test, and how does GoogleTest fit in? We believe: + +1. Tests should be *independent* and *repeatable*. It's a pain to debug a test + that succeeds or fails as a result of other tests. GoogleTest isolates the + tests by running each of them on a different object. When a test fails, + GoogleTest allows you to run it in isolation for quick debugging. +2. Tests should be well *organized* and reflect the structure of the tested + code. GoogleTest groups related tests into test suites that can share data + and subroutines. This common pattern is easy to recognize and makes tests + easy to maintain. Such consistency is especially helpful when people switch + projects and start to work on a new code base. +3. Tests should be *portable* and *reusable*. Google has a lot of code that is + platform-neutral; its tests should also be platform-neutral. GoogleTest + works on different OSes, with different compilers, with or without + exceptions, so GoogleTest tests can work with a variety of configurations. +4. When tests fail, they should provide as much *information* about the problem + as possible. GoogleTest doesn't stop at the first test failure. Instead, it + only stops the current test and continues with the next. You can also set up + tests that report non-fatal failures after which the current test continues. + Thus, you can detect and fix multiple bugs in a single run-edit-compile + cycle. +5. The testing framework should liberate test writers from housekeeping chores + and let them focus on the test *content*. GoogleTest automatically keeps + track of all tests defined, and doesn't require the user to enumerate them + in order to run them. +6. Tests should be *fast*. With GoogleTest, you can reuse shared resources + across tests and pay for the set-up/tear-down only once, without making + tests depend on each other. + +Since GoogleTest is based on the popular xUnit architecture, you'll feel right +at home if you've used JUnit or PyUnit before. If not, it will take you about 10 +minutes to learn the basics and get started. So let's go! + +## Beware of the Nomenclature + +{: .callout .note} +*Note:* There might be some confusion arising from different definitions of the +terms *Test*, *Test Case* and *Test Suite*, so beware of misunderstanding these. + +Historically, GoogleTest started to use the term *Test Case* for grouping +related tests, whereas current publications, including International Software +Testing Qualifications Board ([ISTQB](http://www.istqb.org/)) materials and +various textbooks on software quality, use the term +*[Test Suite][istqb test suite]* for this. + +The related term *Test*, as it is used in GoogleTest, corresponds to the term +*[Test Case][istqb test case]* of ISTQB and others. + +The term *Test* is commonly of broad enough sense, including ISTQB's definition +of *Test Case*, so it's not much of a problem here. But the term *Test Case* as +was used in Google Test is of contradictory sense and thus confusing. + +GoogleTest recently started replacing the term *Test Case* with *Test Suite*. +The preferred API is *TestSuite*. The older TestCase API is being slowly +deprecated and refactored away. + +So please be aware of the different definitions of the terms: + + +Meaning | GoogleTest Term | [ISTQB](http://www.istqb.org/) Term +:----------------------------------------------------------------------------------- | :---------------------- | :---------------------------------- +Exercise a particular program path with specific input values and verify the results | [TEST()](#simple-tests) | [Test Case][istqb test case] + + +[istqb test case]: http://glossary.istqb.org/en/search/test%20case +[istqb test suite]: http://glossary.istqb.org/en/search/test%20suite + +## Basic Concepts + +When using GoogleTest, you start by writing *assertions*, which are statements +that check whether a condition is true. An assertion's result can be *success*, +*nonfatal failure*, or *fatal failure*. If a fatal failure occurs, it aborts the +current function; otherwise the program continues normally. + +*Tests* use assertions to verify the tested code's behavior. If a test crashes +or has a failed assertion, then it *fails*; otherwise it *succeeds*. + +A *test suite* contains one or many tests. You should group your tests into test +suites that reflect the structure of the tested code. When multiple tests in a +test suite need to share common objects and subroutines, you can put them into a +*test fixture* class. + +A *test program* can contain multiple test suites. + +We'll now explain how to write a test program, starting at the individual +assertion level and building up to tests and test suites. + +## Assertions + +GoogleTest assertions are macros that resemble function calls. You test a class +or function by making assertions about its behavior. When an assertion fails, +GoogleTest prints the assertion's source file and line number location, along +with a failure message. You may also supply a custom failure message which will +be appended to GoogleTest's message. + +The assertions come in pairs that test the same thing but have different effects +on the current function. `ASSERT_*` versions generate fatal failures when they +fail, and **abort the current function**. `EXPECT_*` versions generate nonfatal +failures, which don't abort the current function. Usually `EXPECT_*` are +preferred, as they allow more than one failure to be reported in a test. +However, you should use `ASSERT_*` if it doesn't make sense to continue when the +assertion in question fails. + +Since a failed `ASSERT_*` returns from the current function immediately, +possibly skipping clean-up code that comes after it, it may cause a space leak. +Depending on the nature of the leak, it may or may not be worth fixing - so keep +this in mind if you get a heap checker error in addition to assertion errors. + +To provide a custom failure message, simply stream it into the macro using the +`<<` operator or a sequence of such operators. See the following example, using +the [`ASSERT_EQ` and `EXPECT_EQ`](reference/assertions.md#EXPECT_EQ) macros to +verify value equality: + +```c++ +ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length"; + +for (int i = 0; i < x.size(); ++i) { + EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i; +} +``` + +Anything that can be streamed to an `ostream` can be streamed to an assertion +macro--in particular, C strings and `string` objects. If a wide string +(`wchar_t*`, `TCHAR*` in `UNICODE` mode on Windows, or `std::wstring`) is +streamed to an assertion, it will be translated to UTF-8 when printed. + +GoogleTest provides a collection of assertions for verifying the behavior of +your code in various ways. You can check Boolean conditions, compare values +based on relational operators, verify string values, floating-point values, and +much more. There are even assertions that enable you to verify more complex +states by providing custom predicates. For the complete list of assertions +provided by GoogleTest, see the [Assertions Reference](reference/assertions.md). + +## Simple Tests + +To create a test: + +1. Use the `TEST()` macro to define and name a test function. These are + ordinary C++ functions that don't return a value. +2. In this function, along with any valid C++ statements you want to include, + use the various GoogleTest assertions to check values. +3. The test's result is determined by the assertions; if any assertion in the + test fails (either fatally or non-fatally), or if the test crashes, the + entire test fails. Otherwise, it succeeds. + +```c++ +TEST(TestSuiteName, TestName) { + ... test body ... +} +``` + +`TEST()` arguments go from general to specific. The *first* argument is the name +of the test suite, and the *second* argument is the test's name within the test +suite. Both names must be valid C++ identifiers, and they should not contain any +underscores (`_`). A test's *full name* consists of its containing test suite +and its individual name. Tests from different test suites can have the same +individual name. + +For example, let's take a simple integer function: + +```c++ +int Factorial(int n); // Returns the factorial of n +``` + +A test suite for this function might look like: + +```c++ +// Tests factorial of 0. +TEST(FactorialTest, HandlesZeroInput) { + EXPECT_EQ(Factorial(0), 1); +} + +// Tests factorial of positive numbers. +TEST(FactorialTest, HandlesPositiveInput) { + EXPECT_EQ(Factorial(1), 1); + EXPECT_EQ(Factorial(2), 2); + EXPECT_EQ(Factorial(3), 6); + EXPECT_EQ(Factorial(8), 40320); +} +``` + +GoogleTest groups the test results by test suites, so logically related tests +should be in the same test suite; in other words, the first argument to their +`TEST()` should be the same. In the above example, we have two tests, +`HandlesZeroInput` and `HandlesPositiveInput`, that belong to the same test +suite `FactorialTest`. + +When naming your test suites and tests, you should follow the same convention as +for +[naming functions and classes](https://google.github.io/styleguide/cppguide.html#Function_Names). + +**Availability**: Linux, Windows, Mac. + +## Test Fixtures: Using the Same Data Configuration for Multiple Tests {#same-data-multiple-tests} + +If you find yourself writing two or more tests that operate on similar data, you +can use a *test fixture*. This allows you to reuse the same configuration of +objects for several different tests. + +To create a fixture: + +1. Derive a class from `::testing::Test` . Start its body with `protected:`, as + we'll want to access fixture members from sub-classes. +2. Inside the class, declare any objects you plan to use. +3. If necessary, write a default constructor or `SetUp()` function to prepare + the objects for each test. A common mistake is to spell `SetUp()` as + **`Setup()`** with a small `u` - Use `override` in C++11 to make sure you + spelled it correctly. +4. If necessary, write a destructor or `TearDown()` function to release any + resources you allocated in `SetUp()` . To learn when you should use the + constructor/destructor and when you should use `SetUp()/TearDown()`, read + the [FAQ](faq.md#CtorVsSetUp). +5. If needed, define subroutines for your tests to share. + +When using a fixture, use `TEST_F()` instead of `TEST()` as it allows you to +access objects and subroutines in the test fixture: + +```c++ +TEST_F(TestFixtureClassName, TestName) { + ... test body ... +} +``` + +Unlike `TEST()`, in `TEST_F()` the first argument must be the name of the test +fixture class. (`_F` stands for "Fixture"). No test suite name is specified for +this macro. + +Unfortunately, the C++ macro system does not allow us to create a single macro +that can handle both types of tests. Using the wrong macro causes a compiler +error. + +Also, you must first define a test fixture class before using it in a +`TEST_F()`, or you'll get the compiler error "`virtual outside class +declaration`". + +For each test defined with `TEST_F()`, GoogleTest will create a *fresh* test +fixture at runtime, immediately initialize it via `SetUp()`, run the test, clean +up by calling `TearDown()`, and then delete the test fixture. Note that +different tests in the same test suite have different test fixture objects, and +GoogleTest always deletes a test fixture before it creates the next one. +GoogleTest does **not** reuse the same test fixture for multiple tests. Any +changes one test makes to the fixture do not affect other tests. + +As an example, let's write tests for a FIFO queue class named `Queue`, which has +the following interface: + +```c++ +template // E is the element type. +class Queue { + public: + Queue(); + void Enqueue(const E& element); + E* Dequeue(); // Returns NULL if the queue is empty. + size_t size() const; + ... +}; +``` + +First, define a fixture class. By convention, you should give it the name +`FooTest` where `Foo` is the class being tested. + +```c++ +class QueueTest : public ::testing::Test { + protected: + void SetUp() override { + // q0_ remains empty + q1_.Enqueue(1); + q2_.Enqueue(2); + q2_.Enqueue(3); + } + + // void TearDown() override {} + + Queue q0_; + Queue q1_; + Queue q2_; +}; +``` + +In this case, `TearDown()` is not needed since we don't have to clean up after +each test, other than what's already done by the destructor. + +Now we'll write tests using `TEST_F()` and this fixture. + +```c++ +TEST_F(QueueTest, IsEmptyInitially) { + EXPECT_EQ(q0_.size(), 0); +} + +TEST_F(QueueTest, DequeueWorks) { + int* n = q0_.Dequeue(); + EXPECT_EQ(n, nullptr); + + n = q1_.Dequeue(); + ASSERT_NE(n, nullptr); + EXPECT_EQ(*n, 1); + EXPECT_EQ(q1_.size(), 0); + delete n; + + n = q2_.Dequeue(); + ASSERT_NE(n, nullptr); + EXPECT_EQ(*n, 2); + EXPECT_EQ(q2_.size(), 1); + delete n; +} +``` + +The above uses both `ASSERT_*` and `EXPECT_*` assertions. The rule of thumb is +to use `EXPECT_*` when you want the test to continue to reveal more errors after +the assertion failure, and use `ASSERT_*` when continuing after failure doesn't +make sense. For example, the second assertion in the `Dequeue` test is +`ASSERT_NE(n, nullptr)`, as we need to dereference the pointer `n` later, which +would lead to a segfault when `n` is `NULL`. + +When these tests run, the following happens: + +1. GoogleTest constructs a `QueueTest` object (let's call it `t1`). +2. `t1.SetUp()` initializes `t1`. +3. The first test (`IsEmptyInitially`) runs on `t1`. +4. `t1.TearDown()` cleans up after the test finishes. +5. `t1` is destructed. +6. The above steps are repeated on another `QueueTest` object, this time + running the `DequeueWorks` test. + +**Availability**: Linux, Windows, Mac. + +## Invoking the Tests + +`TEST()` and `TEST_F()` implicitly register their tests with GoogleTest. So, +unlike with many other C++ testing frameworks, you don't have to re-list all +your defined tests in order to run them. + +After defining your tests, you can run them with `RUN_ALL_TESTS()`, which +returns `0` if all the tests are successful, or `1` otherwise. Note that +`RUN_ALL_TESTS()` runs *all tests* in your link unit--they can be from different +test suites, or even different source files. + +When invoked, the `RUN_ALL_TESTS()` macro: + +* Saves the state of all GoogleTest flags. + +* Creates a test fixture object for the first test. + +* Initializes it via `SetUp()`. + +* Runs the test on the fixture object. + +* Cleans up the fixture via `TearDown()`. + +* Deletes the fixture. + +* Restores the state of all GoogleTest flags. + +* Repeats the above steps for the next test, until all tests have run. + +If a fatal failure happens the subsequent steps will be skipped. + +{: .callout .important} +> IMPORTANT: You must **not** ignore the return value of `RUN_ALL_TESTS()`, or +> you will get a compiler error. The rationale for this design is that the +> automated testing service determines whether a test has passed based on its +> exit code, not on its stdout/stderr output; thus your `main()` function must +> return the value of `RUN_ALL_TESTS()`. +> +> Also, you should call `RUN_ALL_TESTS()` only **once**. Calling it more than +> once conflicts with some advanced GoogleTest features (e.g., thread-safe +> [death tests](advanced.md#death-tests)) and thus is not supported. + +**Availability**: Linux, Windows, Mac. + +## Writing the main() Function + +Most users should *not* need to write their own `main` function and instead link +with `gtest_main` (as opposed to with `gtest`), which defines a suitable entry +point. See the end of this section for details. The remainder of this section +should only apply when you need to do something custom before the tests run that +cannot be expressed within the framework of fixtures and test suites. + +If you write your own `main` function, it should return the value of +`RUN_ALL_TESTS()`. + +You can start from this boilerplate: + +```c++ +#include "this/package/foo.h" + +#include + +namespace my { +namespace project { +namespace { + +// The fixture for testing class Foo. +class FooTest : public ::testing::Test { + protected: + // You can remove any or all of the following functions if their bodies would + // be empty. + + FooTest() { + // You can do set-up work for each test here. + } + + ~FooTest() override { + // You can do clean-up work that doesn't throw exceptions here. + } + + // If the constructor and destructor are not enough for setting up + // and cleaning up each test, you can define the following methods: + + void SetUp() override { + // Code here will be called immediately after the constructor (right + // before each test). + } + + void TearDown() override { + // Code here will be called immediately after each test (right + // before the destructor). + } + + // Class members declared here can be used by all tests in the test suite + // for Foo. +}; + +// Tests that the Foo::Bar() method does Abc. +TEST_F(FooTest, MethodBarDoesAbc) { + const std::string input_filepath = "this/package/testdata/myinputfile.dat"; + const std::string output_filepath = "this/package/testdata/myoutputfile.dat"; + Foo f; + EXPECT_EQ(f.Bar(input_filepath, output_filepath), 0); +} + +// Tests that Foo does Xyz. +TEST_F(FooTest, DoesXyz) { + // Exercises the Xyz feature of Foo. +} + +} // namespace +} // namespace project +} // namespace my + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} +``` + +The `::testing::InitGoogleTest()` function parses the command line for +GoogleTest flags, and removes all recognized flags. This allows the user to +control a test program's behavior via various flags, which we'll cover in the +[AdvancedGuide](advanced.md). You **must** call this function before calling +`RUN_ALL_TESTS()`, or the flags won't be properly initialized. + +On Windows, `InitGoogleTest()` also works with wide strings, so it can be used +in programs compiled in `UNICODE` mode as well. + +But maybe you think that writing all those `main` functions is too much work? We +agree with you completely, and that's why Google Test provides a basic +implementation of main(). If it fits your needs, then just link your test with +the `gtest_main` library and you are good to go. + +{: .callout .note} +NOTE: `ParseGUnitFlags()` is deprecated in favor of `InitGoogleTest()`. + +## Known Limitations + +* Google Test is designed to be thread-safe. The implementation is thread-safe + on systems where the `pthreads` library is available. It is currently + *unsafe* to use Google Test assertions from two threads concurrently on + other systems (e.g. Windows). In most tests this is not an issue as usually + the assertions are done in the main thread. If you want to help, you can + volunteer to implement the necessary synchronization primitives in + `gtest-port.h` for your platform. diff --git a/vendor/googletest-1.14.0/docs/quickstart-bazel.md b/vendor/googletest-1.14.0/docs/quickstart-bazel.md new file mode 100644 index 00000000..4f693dbe --- /dev/null +++ b/vendor/googletest-1.14.0/docs/quickstart-bazel.md @@ -0,0 +1,153 @@ +# Quickstart: Building with Bazel + +This tutorial aims to get you up and running with GoogleTest using the Bazel +build system. If you're using GoogleTest for the first time or need a refresher, +we recommend this tutorial as a starting point. + +## Prerequisites + +To complete this tutorial, you'll need: + +* A compatible operating system (e.g. Linux, macOS, Windows). +* A compatible C++ compiler that supports at least C++14. +* [Bazel](https://bazel.build/), the preferred build system used by the + GoogleTest team. + +See [Supported Platforms](platforms.md) for more information about platforms +compatible with GoogleTest. + +If you don't already have Bazel installed, see the +[Bazel installation guide](https://bazel.build/install). + +{: .callout .note} Note: The terminal commands in this tutorial show a Unix +shell prompt, but the commands work on the Windows command line as well. + +## Set up a Bazel workspace + +A +[Bazel workspace](https://docs.bazel.build/versions/main/build-ref.html#workspace) +is a directory on your filesystem that you use to manage source files for the +software you want to build. Each workspace directory has a text file named +`WORKSPACE` which may be empty, or may contain references to external +dependencies required to build the outputs. + +First, create a directory for your workspace: + +``` +$ mkdir my_workspace && cd my_workspace +``` + +Next, you’ll create the `WORKSPACE` file to specify dependencies. A common and +recommended way to depend on GoogleTest is to use a +[Bazel external dependency](https://docs.bazel.build/versions/main/external.html) +via the +[`http_archive` rule](https://docs.bazel.build/versions/main/repo/http.html#http_archive). +To do this, in the root directory of your workspace (`my_workspace/`), create a +file named `WORKSPACE` with the following contents: + +``` +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "com_google_googletest", + urls = ["https://github.com/google/googletest/archive/5ab508a01f9eb089207ee87fd547d290da39d015.zip"], + strip_prefix = "googletest-5ab508a01f9eb089207ee87fd547d290da39d015", +) +``` + +The above configuration declares a dependency on GoogleTest which is downloaded +as a ZIP archive from GitHub. In the above example, +`5ab508a01f9eb089207ee87fd547d290da39d015` is the Git commit hash of the +GoogleTest version to use; we recommend updating the hash often to point to the +latest version. Use a recent hash on the `main` branch. + +Now you're ready to build C++ code that uses GoogleTest. + +## Create and run a binary + +With your Bazel workspace set up, you can now use GoogleTest code within your +own project. + +As an example, create a file named `hello_test.cc` in your `my_workspace` +directory with the following contents: + +```cpp +#include + +// Demonstrate some basic assertions. +TEST(HelloTest, BasicAssertions) { + // Expect two strings not to be equal. + EXPECT_STRNE("hello", "world"); + // Expect equality. + EXPECT_EQ(7 * 6, 42); +} +``` + +GoogleTest provides [assertions](primer.md#assertions) that you use to test the +behavior of your code. The above sample includes the main GoogleTest header file +and demonstrates some basic assertions. + +To build the code, create a file named `BUILD` in the same directory with the +following contents: + +``` +cc_test( + name = "hello_test", + size = "small", + srcs = ["hello_test.cc"], + deps = ["@com_google_googletest//:gtest_main"], +) +``` + +This `cc_test` rule declares the C++ test binary you want to build, and links to +GoogleTest (`//:gtest_main`) using the prefix you specified in the `WORKSPACE` +file (`@com_google_googletest`). For more information about Bazel `BUILD` files, +see the +[Bazel C++ Tutorial](https://docs.bazel.build/versions/main/tutorial/cpp.html). + +{: .callout .note} +NOTE: In the example below, we assume Clang or GCC and set `--cxxopt=-std=c++14` +to ensure that GoogleTest is compiled as C++14 instead of the compiler's default +setting (which could be C++11). For MSVC, the equivalent would be +`--cxxopt=/std:c++14`. See [Supported Platforms](platforms.md) for more details +on supported language versions. + +Now you can build and run your test: + +
        +my_workspace$ bazel test --cxxopt=-std=c++14 --test_output=all //:hello_test
        +INFO: Analyzed target //:hello_test (26 packages loaded, 362 targets configured).
        +INFO: Found 1 test target...
        +INFO: From Testing //:hello_test:
        +==================== Test output for //:hello_test:
        +Running main() from gmock_main.cc
        +[==========] Running 1 test from 1 test suite.
        +[----------] Global test environment set-up.
        +[----------] 1 test from HelloTest
        +[ RUN      ] HelloTest.BasicAssertions
        +[       OK ] HelloTest.BasicAssertions (0 ms)
        +[----------] 1 test from HelloTest (0 ms total)
        +
        +[----------] Global test environment tear-down
        +[==========] 1 test from 1 test suite ran. (0 ms total)
        +[  PASSED  ] 1 test.
        +================================================================================
        +Target //:hello_test up-to-date:
        +  bazel-bin/hello_test
        +INFO: Elapsed time: 4.190s, Critical Path: 3.05s
        +INFO: 27 processes: 8 internal, 19 linux-sandbox.
        +INFO: Build completed successfully, 27 total actions
        +//:hello_test                                                     PASSED in 0.1s
        +
        +INFO: Build completed successfully, 27 total actions
        +
        + +Congratulations! You've successfully built and run a test binary using +GoogleTest. + +## Next steps + +* [Check out the Primer](primer.md) to start learning how to write simple + tests. +* [See the code samples](samples.md) for more examples showing how to use a + variety of GoogleTest features. diff --git a/vendor/googletest-1.14.0/docs/quickstart-cmake.md b/vendor/googletest-1.14.0/docs/quickstart-cmake.md new file mode 100644 index 00000000..4e422b74 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/quickstart-cmake.md @@ -0,0 +1,157 @@ +# Quickstart: Building with CMake + +This tutorial aims to get you up and running with GoogleTest using CMake. If +you're using GoogleTest for the first time or need a refresher, we recommend +this tutorial as a starting point. If your project uses Bazel, see the +[Quickstart for Bazel](quickstart-bazel.md) instead. + +## Prerequisites + +To complete this tutorial, you'll need: + +* A compatible operating system (e.g. Linux, macOS, Windows). +* A compatible C++ compiler that supports at least C++14. +* [CMake](https://cmake.org/) and a compatible build tool for building the + project. + * Compatible build tools include + [Make](https://www.gnu.org/software/make/), + [Ninja](https://ninja-build.org/), and others - see + [CMake Generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html) + for more information. + +See [Supported Platforms](platforms.md) for more information about platforms +compatible with GoogleTest. + +If you don't already have CMake installed, see the +[CMake installation guide](https://cmake.org/install). + +{: .callout .note} +Note: The terminal commands in this tutorial show a Unix shell prompt, but the +commands work on the Windows command line as well. + +## Set up a project + +CMake uses a file named `CMakeLists.txt` to configure the build system for a +project. You'll use this file to set up your project and declare a dependency on +GoogleTest. + +First, create a directory for your project: + +``` +$ mkdir my_project && cd my_project +``` + +Next, you'll create the `CMakeLists.txt` file and declare a dependency on +GoogleTest. There are many ways to express dependencies in the CMake ecosystem; +in this quickstart, you'll use the +[`FetchContent` CMake module](https://cmake.org/cmake/help/latest/module/FetchContent.html). +To do this, in your project directory (`my_project`), create a file named +`CMakeLists.txt` with the following contents: + +```cmake +cmake_minimum_required(VERSION 3.14) +project(my_project) + +# GoogleTest requires at least C++14 +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip +) +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) +``` + +The above configuration declares a dependency on GoogleTest which is downloaded +from GitHub. In the above example, `03597a01ee50ed33e9dfd640b249b4be3799d395` is +the Git commit hash of the GoogleTest version to use; we recommend updating the +hash often to point to the latest version. + +For more information about how to create `CMakeLists.txt` files, see the +[CMake Tutorial](https://cmake.org/cmake/help/latest/guide/tutorial/index.html). + +## Create and run a binary + +With GoogleTest declared as a dependency, you can use GoogleTest code within +your own project. + +As an example, create a file named `hello_test.cc` in your `my_project` +directory with the following contents: + +```cpp +#include + +// Demonstrate some basic assertions. +TEST(HelloTest, BasicAssertions) { + // Expect two strings not to be equal. + EXPECT_STRNE("hello", "world"); + // Expect equality. + EXPECT_EQ(7 * 6, 42); +} +``` + +GoogleTest provides [assertions](primer.md#assertions) that you use to test the +behavior of your code. The above sample includes the main GoogleTest header file +and demonstrates some basic assertions. + +To build the code, add the following to the end of your `CMakeLists.txt` file: + +```cmake +enable_testing() + +add_executable( + hello_test + hello_test.cc +) +target_link_libraries( + hello_test + GTest::gtest_main +) + +include(GoogleTest) +gtest_discover_tests(hello_test) +``` + +The above configuration enables testing in CMake, declares the C++ test binary +you want to build (`hello_test`), and links it to GoogleTest (`gtest_main`). The +last two lines enable CMake's test runner to discover the tests included in the +binary, using the +[`GoogleTest` CMake module](https://cmake.org/cmake/help/git-stage/module/GoogleTest.html). + +Now you can build and run your test: + +
        +my_project$ cmake -S . -B build
        +-- The C compiler identification is GNU 10.2.1
        +-- The CXX compiler identification is GNU 10.2.1
        +...
        +-- Build files have been written to: .../my_project/build
        +
        +my_project$ cmake --build build
        +Scanning dependencies of target gtest
        +...
        +[100%] Built target gmock_main
        +
        +my_project$ cd build && ctest
        +Test project .../my_project/build
        +    Start 1: HelloTest.BasicAssertions
        +1/1 Test #1: HelloTest.BasicAssertions ........   Passed    0.00 sec
        +
        +100% tests passed, 0 tests failed out of 1
        +
        +Total Test time (real) =   0.01 sec
        +
        + +Congratulations! You've successfully built and run a test binary using +GoogleTest. + +## Next steps + +* [Check out the Primer](primer.md) to start learning how to write simple + tests. +* [See the code samples](samples.md) for more examples showing how to use a + variety of GoogleTest features. diff --git a/vendor/googletest-1.14.0/docs/reference/actions.md b/vendor/googletest-1.14.0/docs/reference/actions.md new file mode 100644 index 00000000..ab81a129 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/reference/actions.md @@ -0,0 +1,115 @@ +# Actions Reference + +[**Actions**](../gmock_for_dummies.md#actions-what-should-it-do) specify what a +mock function should do when invoked. This page lists the built-in actions +provided by GoogleTest. All actions are defined in the `::testing` namespace. + +## Returning a Value + +| Action | Description | +| :-------------------------------- | :-------------------------------------------- | +| `Return()` | Return from a `void` mock function. | +| `Return(value)` | Return `value`. If the type of `value` is different to the mock function's return type, `value` is converted to the latter type at the time the expectation is set, not when the action is executed. | +| `ReturnArg()` | Return the `N`-th (0-based) argument. | +| `ReturnNew(a1, ..., ak)` | Return `new T(a1, ..., ak)`; a different object is created each time. | +| `ReturnNull()` | Return a null pointer. | +| `ReturnPointee(ptr)` | Return the value pointed to by `ptr`. | +| `ReturnRef(variable)` | Return a reference to `variable`. | +| `ReturnRefOfCopy(value)` | Return a reference to a copy of `value`; the copy lives as long as the action. | +| `ReturnRoundRobin({a1, ..., ak})` | Each call will return the next `ai` in the list, starting at the beginning when the end of the list is reached. | + +## Side Effects + +| Action | Description | +| :--------------------------------- | :-------------------------------------- | +| `Assign(&variable, value)` | Assign `value` to variable. | +| `DeleteArg()` | Delete the `N`-th (0-based) argument, which must be a pointer. | +| `SaveArg(pointer)` | Save the `N`-th (0-based) argument to `*pointer`. | +| `SaveArgPointee(pointer)` | Save the value pointed to by the `N`-th (0-based) argument to `*pointer`. | +| `SetArgReferee(value)` | Assign `value` to the variable referenced by the `N`-th (0-based) argument. | +| `SetArgPointee(value)` | Assign `value` to the variable pointed by the `N`-th (0-based) argument. | +| `SetArgumentPointee(value)` | Same as `SetArgPointee(value)`. Deprecated. Will be removed in v1.7.0. | +| `SetArrayArgument(first, last)` | Copies the elements in source range [`first`, `last`) to the array pointed to by the `N`-th (0-based) argument, which can be either a pointer or an iterator. The action does not take ownership of the elements in the source range. | +| `SetErrnoAndReturn(error, value)` | Set `errno` to `error` and return `value`. | +| `Throw(exception)` | Throws the given exception, which can be any copyable value. Available since v1.1.0. | + +## Using a Function, Functor, or Lambda as an Action + +In the following, by "callable" we mean a free function, `std::function`, +functor, or lambda. + +| Action | Description | +| :---------------------------------- | :------------------------------------- | +| `f` | Invoke `f` with the arguments passed to the mock function, where `f` is a callable. | +| `Invoke(f)` | Invoke `f` with the arguments passed to the mock function, where `f` can be a global/static function or a functor. | +| `Invoke(object_pointer, &class::method)` | Invoke the method on the object with the arguments passed to the mock function. | +| `InvokeWithoutArgs(f)` | Invoke `f`, which can be a global/static function or a functor. `f` must take no arguments. | +| `InvokeWithoutArgs(object_pointer, &class::method)` | Invoke the method on the object, which takes no arguments. | +| `InvokeArgument(arg1, arg2, ..., argk)` | Invoke the mock function's `N`-th (0-based) argument, which must be a function or a functor, with the `k` arguments. | + +The return value of the invoked function is used as the return value of the +action. + +When defining a callable to be used with `Invoke*()`, you can declare any unused +parameters as `Unused`: + +```cpp +using ::testing::Invoke; +double Distance(Unused, double x, double y) { return sqrt(x*x + y*y); } +... +EXPECT_CALL(mock, Foo("Hi", _, _)).WillOnce(Invoke(Distance)); +``` + +`Invoke(callback)` and `InvokeWithoutArgs(callback)` take ownership of +`callback`, which must be permanent. The type of `callback` must be a base +callback type instead of a derived one, e.g. + +```cpp + BlockingClosure* done = new BlockingClosure; + ... Invoke(done) ...; // This won't compile! + + Closure* done2 = new BlockingClosure; + ... Invoke(done2) ...; // This works. +``` + +In `InvokeArgument(...)`, if an argument needs to be passed by reference, +wrap it inside `std::ref()`. For example, + +```cpp +using ::testing::InvokeArgument; +... +InvokeArgument<2>(5, string("Hi"), std::ref(foo)) +``` + +calls the mock function's #2 argument, passing to it `5` and `string("Hi")` by +value, and `foo` by reference. + +## Default Action + +| Action | Description | +| :------------ | :----------------------------------------------------- | +| `DoDefault()` | Do the default action (specified by `ON_CALL()` or the built-in one). | + +{: .callout .note} +**Note:** due to technical reasons, `DoDefault()` cannot be used inside a +composite action - trying to do so will result in a run-time error. + +## Composite Actions + +| Action | Description | +| :----------------------------- | :------------------------------------------ | +| `DoAll(a1, a2, ..., an)` | Do all actions `a1` to `an` and return the result of `an` in each invocation. The first `n - 1` sub-actions must return void and will receive a readonly view of the arguments. | +| `IgnoreResult(a)` | Perform action `a` and ignore its result. `a` must not return void. | +| `WithArg(a)` | Pass the `N`-th (0-based) argument of the mock function to action `a` and perform it. | +| `WithArgs(a)` | Pass the selected (0-based) arguments of the mock function to action `a` and perform it. | +| `WithoutArgs(a)` | Perform action `a` without any arguments. | + +## Defining Actions + +| Macro | Description | +| :--------------------------------- | :-------------------------------------- | +| `ACTION(Sum) { return arg0 + arg1; }` | Defines an action `Sum()` to return the sum of the mock function's argument #0 and #1. | +| `ACTION_P(Plus, n) { return arg0 + n; }` | Defines an action `Plus(n)` to return the sum of the mock function's argument #0 and `n`. | +| `ACTION_Pk(Foo, p1, ..., pk) { statements; }` | Defines a parameterized action `Foo(p1, ..., pk)` to execute the given `statements`. | + +The `ACTION*` macros cannot be used inside a function or class. diff --git a/vendor/googletest-1.14.0/docs/reference/assertions.md b/vendor/googletest-1.14.0/docs/reference/assertions.md new file mode 100644 index 00000000..aa1dbc04 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/reference/assertions.md @@ -0,0 +1,633 @@ +# Assertions Reference + +This page lists the assertion macros provided by GoogleTest for verifying code +behavior. To use them, include the header `gtest/gtest.h`. + +The majority of the macros listed below come as a pair with an `EXPECT_` variant +and an `ASSERT_` variant. Upon failure, `EXPECT_` macros generate nonfatal +failures and allow the current function to continue running, while `ASSERT_` +macros generate fatal failures and abort the current function. + +All assertion macros support streaming a custom failure message into them with +the `<<` operator, for example: + +```cpp +EXPECT_TRUE(my_condition) << "My condition is not true"; +``` + +Anything that can be streamed to an `ostream` can be streamed to an assertion +macro—in particular, C strings and string objects. If a wide string (`wchar_t*`, +`TCHAR*` in `UNICODE` mode on Windows, or `std::wstring`) is streamed to an +assertion, it will be translated to UTF-8 when printed. + +## Explicit Success and Failure {#success-failure} + +The assertions in this section generate a success or failure directly instead of +testing a value or expression. These are useful when control flow, rather than a +Boolean expression, determines the test's success or failure, as shown by the +following example: + +```c++ +switch(expression) { + case 1: + ... some checks ... + case 2: + ... some other checks ... + default: + FAIL() << "We shouldn't get here."; +} +``` + +### SUCCEED {#SUCCEED} + +`SUCCEED()` + +Generates a success. This *does not* make the overall test succeed. A test is +considered successful only if none of its assertions fail during its execution. + +The `SUCCEED` assertion is purely documentary and currently doesn't generate any +user-visible output. However, we may add `SUCCEED` messages to GoogleTest output +in the future. + +### FAIL {#FAIL} + +`FAIL()` + +Generates a fatal failure, which returns from the current function. + +Can only be used in functions that return `void`. See +[Assertion Placement](../advanced.md#assertion-placement) for more information. + +### ADD_FAILURE {#ADD_FAILURE} + +`ADD_FAILURE()` + +Generates a nonfatal failure, which allows the current function to continue +running. + +### ADD_FAILURE_AT {#ADD_FAILURE_AT} + +`ADD_FAILURE_AT(`*`file_path`*`,`*`line_number`*`)` + +Generates a nonfatal failure at the file and line number specified. + +## Generalized Assertion {#generalized} + +The following assertion allows [matchers](matchers.md) to be used to verify +values. + +### EXPECT_THAT {#EXPECT_THAT} + +`EXPECT_THAT(`*`value`*`,`*`matcher`*`)` \ +`ASSERT_THAT(`*`value`*`,`*`matcher`*`)` + +Verifies that *`value`* matches the [matcher](matchers.md) *`matcher`*. + +For example, the following code verifies that the string `value1` starts with +`"Hello"`, `value2` matches a regular expression, and `value3` is between 5 and +10: + +```cpp +#include + +using ::testing::AllOf; +using ::testing::Gt; +using ::testing::Lt; +using ::testing::MatchesRegex; +using ::testing::StartsWith; + +... +EXPECT_THAT(value1, StartsWith("Hello")); +EXPECT_THAT(value2, MatchesRegex("Line \\d+")); +ASSERT_THAT(value3, AllOf(Gt(5), Lt(10))); +``` + +Matchers enable assertions of this form to read like English and generate +informative failure messages. For example, if the above assertion on `value1` +fails, the resulting message will be similar to the following: + +``` +Value of: value1 + Actual: "Hi, world!" +Expected: starts with "Hello" +``` + +GoogleTest provides a built-in library of matchers—see the +[Matchers Reference](matchers.md). It is also possible to write your own +matchers—see [Writing New Matchers Quickly](../gmock_cook_book.md#NewMatchers). +The use of matchers makes `EXPECT_THAT` a powerful, extensible assertion. + +*The idea for this assertion was borrowed from Joe Walnes' Hamcrest project, +which adds `assertThat()` to JUnit.* + +## Boolean Conditions {#boolean} + +The following assertions test Boolean conditions. + +### EXPECT_TRUE {#EXPECT_TRUE} + +`EXPECT_TRUE(`*`condition`*`)` \ +`ASSERT_TRUE(`*`condition`*`)` + +Verifies that *`condition`* is true. + +### EXPECT_FALSE {#EXPECT_FALSE} + +`EXPECT_FALSE(`*`condition`*`)` \ +`ASSERT_FALSE(`*`condition`*`)` + +Verifies that *`condition`* is false. + +## Binary Comparison {#binary-comparison} + +The following assertions compare two values. The value arguments must be +comparable by the assertion's comparison operator, otherwise a compiler error +will result. + +If an argument supports the `<<` operator, it will be called to print the +argument when the assertion fails. Otherwise, GoogleTest will attempt to print +them in the best way it can—see +[Teaching GoogleTest How to Print Your Values](../advanced.md#teaching-googletest-how-to-print-your-values). + +Arguments are always evaluated exactly once, so it's OK for the arguments to +have side effects. However, the argument evaluation order is undefined and +programs should not depend on any particular argument evaluation order. + +These assertions work with both narrow and wide string objects (`string` and +`wstring`). + +See also the [Floating-Point Comparison](#floating-point) assertions to compare +floating-point numbers and avoid problems caused by rounding. + +### EXPECT_EQ {#EXPECT_EQ} + +`EXPECT_EQ(`*`val1`*`,`*`val2`*`)` \ +`ASSERT_EQ(`*`val1`*`,`*`val2`*`)` + +Verifies that *`val1`*`==`*`val2`*. + +Does pointer equality on pointers. If used on two C strings, it tests if they +are in the same memory location, not if they have the same value. Use +[`EXPECT_STREQ`](#EXPECT_STREQ) to compare C strings (e.g. `const char*`) by +value. + +When comparing a pointer to `NULL`, use `EXPECT_EQ(`*`ptr`*`, nullptr)` instead +of `EXPECT_EQ(`*`ptr`*`, NULL)`. + +### EXPECT_NE {#EXPECT_NE} + +`EXPECT_NE(`*`val1`*`,`*`val2`*`)` \ +`ASSERT_NE(`*`val1`*`,`*`val2`*`)` + +Verifies that *`val1`*`!=`*`val2`*. + +Does pointer equality on pointers. If used on two C strings, it tests if they +are in different memory locations, not if they have different values. Use +[`EXPECT_STRNE`](#EXPECT_STRNE) to compare C strings (e.g. `const char*`) by +value. + +When comparing a pointer to `NULL`, use `EXPECT_NE(`*`ptr`*`, nullptr)` instead +of `EXPECT_NE(`*`ptr`*`, NULL)`. + +### EXPECT_LT {#EXPECT_LT} + +`EXPECT_LT(`*`val1`*`,`*`val2`*`)` \ +`ASSERT_LT(`*`val1`*`,`*`val2`*`)` + +Verifies that *`val1`*`<`*`val2`*. + +### EXPECT_LE {#EXPECT_LE} + +`EXPECT_LE(`*`val1`*`,`*`val2`*`)` \ +`ASSERT_LE(`*`val1`*`,`*`val2`*`)` + +Verifies that *`val1`*`<=`*`val2`*. + +### EXPECT_GT {#EXPECT_GT} + +`EXPECT_GT(`*`val1`*`,`*`val2`*`)` \ +`ASSERT_GT(`*`val1`*`,`*`val2`*`)` + +Verifies that *`val1`*`>`*`val2`*. + +### EXPECT_GE {#EXPECT_GE} + +`EXPECT_GE(`*`val1`*`,`*`val2`*`)` \ +`ASSERT_GE(`*`val1`*`,`*`val2`*`)` + +Verifies that *`val1`*`>=`*`val2`*. + +## String Comparison {#c-strings} + +The following assertions compare two **C strings**. To compare two `string` +objects, use [`EXPECT_EQ`](#EXPECT_EQ) or [`EXPECT_NE`](#EXPECT_NE) instead. + +These assertions also accept wide C strings (`wchar_t*`). If a comparison of two +wide strings fails, their values will be printed as UTF-8 narrow strings. + +To compare a C string with `NULL`, use `EXPECT_EQ(`*`c_string`*`, nullptr)` or +`EXPECT_NE(`*`c_string`*`, nullptr)`. + +### EXPECT_STREQ {#EXPECT_STREQ} + +`EXPECT_STREQ(`*`str1`*`,`*`str2`*`)` \ +`ASSERT_STREQ(`*`str1`*`,`*`str2`*`)` + +Verifies that the two C strings *`str1`* and *`str2`* have the same contents. + +### EXPECT_STRNE {#EXPECT_STRNE} + +`EXPECT_STRNE(`*`str1`*`,`*`str2`*`)` \ +`ASSERT_STRNE(`*`str1`*`,`*`str2`*`)` + +Verifies that the two C strings *`str1`* and *`str2`* have different contents. + +### EXPECT_STRCASEEQ {#EXPECT_STRCASEEQ} + +`EXPECT_STRCASEEQ(`*`str1`*`,`*`str2`*`)` \ +`ASSERT_STRCASEEQ(`*`str1`*`,`*`str2`*`)` + +Verifies that the two C strings *`str1`* and *`str2`* have the same contents, +ignoring case. + +### EXPECT_STRCASENE {#EXPECT_STRCASENE} + +`EXPECT_STRCASENE(`*`str1`*`,`*`str2`*`)` \ +`ASSERT_STRCASENE(`*`str1`*`,`*`str2`*`)` + +Verifies that the two C strings *`str1`* and *`str2`* have different contents, +ignoring case. + +## Floating-Point Comparison {#floating-point} + +The following assertions compare two floating-point values. + +Due to rounding errors, it is very unlikely that two floating-point values will +match exactly, so `EXPECT_EQ` is not suitable. In general, for floating-point +comparison to make sense, the user needs to carefully choose the error bound. + +GoogleTest also provides assertions that use a default error bound based on +Units in the Last Place (ULPs). To learn more about ULPs, see the article +[Comparing Floating Point Numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). + +### EXPECT_FLOAT_EQ {#EXPECT_FLOAT_EQ} + +`EXPECT_FLOAT_EQ(`*`val1`*`,`*`val2`*`)` \ +`ASSERT_FLOAT_EQ(`*`val1`*`,`*`val2`*`)` + +Verifies that the two `float` values *`val1`* and *`val2`* are approximately +equal, to within 4 ULPs from each other. + +### EXPECT_DOUBLE_EQ {#EXPECT_DOUBLE_EQ} + +`EXPECT_DOUBLE_EQ(`*`val1`*`,`*`val2`*`)` \ +`ASSERT_DOUBLE_EQ(`*`val1`*`,`*`val2`*`)` + +Verifies that the two `double` values *`val1`* and *`val2`* are approximately +equal, to within 4 ULPs from each other. + +### EXPECT_NEAR {#EXPECT_NEAR} + +`EXPECT_NEAR(`*`val1`*`,`*`val2`*`,`*`abs_error`*`)` \ +`ASSERT_NEAR(`*`val1`*`,`*`val2`*`,`*`abs_error`*`)` + +Verifies that the difference between *`val1`* and *`val2`* does not exceed the +absolute error bound *`abs_error`*. + +## Exception Assertions {#exceptions} + +The following assertions verify that a piece of code throws, or does not throw, +an exception. Usage requires exceptions to be enabled in the build environment. + +Note that the piece of code under test can be a compound statement, for example: + +```cpp +EXPECT_NO_THROW({ + int n = 5; + DoSomething(&n); +}); +``` + +### EXPECT_THROW {#EXPECT_THROW} + +`EXPECT_THROW(`*`statement`*`,`*`exception_type`*`)` \ +`ASSERT_THROW(`*`statement`*`,`*`exception_type`*`)` + +Verifies that *`statement`* throws an exception of type *`exception_type`*. + +### EXPECT_ANY_THROW {#EXPECT_ANY_THROW} + +`EXPECT_ANY_THROW(`*`statement`*`)` \ +`ASSERT_ANY_THROW(`*`statement`*`)` + +Verifies that *`statement`* throws an exception of any type. + +### EXPECT_NO_THROW {#EXPECT_NO_THROW} + +`EXPECT_NO_THROW(`*`statement`*`)` \ +`ASSERT_NO_THROW(`*`statement`*`)` + +Verifies that *`statement`* does not throw any exception. + +## Predicate Assertions {#predicates} + +The following assertions enable more complex predicates to be verified while +printing a more clear failure message than if `EXPECT_TRUE` were used alone. + +### EXPECT_PRED* {#EXPECT_PRED} + +`EXPECT_PRED1(`*`pred`*`,`*`val1`*`)` \ +`EXPECT_PRED2(`*`pred`*`,`*`val1`*`,`*`val2`*`)` \ +`EXPECT_PRED3(`*`pred`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`)` \ +`EXPECT_PRED4(`*`pred`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`)` \ +`EXPECT_PRED5(`*`pred`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`,`*`val5`*`)` + +`ASSERT_PRED1(`*`pred`*`,`*`val1`*`)` \ +`ASSERT_PRED2(`*`pred`*`,`*`val1`*`,`*`val2`*`)` \ +`ASSERT_PRED3(`*`pred`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`)` \ +`ASSERT_PRED4(`*`pred`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`)` \ +`ASSERT_PRED5(`*`pred`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`,`*`val5`*`)` + +Verifies that the predicate *`pred`* returns `true` when passed the given values +as arguments. + +The parameter *`pred`* is a function or functor that accepts as many arguments +as the corresponding macro accepts values. If *`pred`* returns `true` for the +given arguments, the assertion succeeds, otherwise the assertion fails. + +When the assertion fails, it prints the value of each argument. Arguments are +always evaluated exactly once. + +As an example, see the following code: + +```cpp +// Returns true if m and n have no common divisors except 1. +bool MutuallyPrime(int m, int n) { ... } +... +const int a = 3; +const int b = 4; +const int c = 10; +... +EXPECT_PRED2(MutuallyPrime, a, b); // Succeeds +EXPECT_PRED2(MutuallyPrime, b, c); // Fails +``` + +In the above example, the first assertion succeeds, and the second fails with +the following message: + +``` +MutuallyPrime(b, c) is false, where +b is 4 +c is 10 +``` + +Note that if the given predicate is an overloaded function or a function +template, the assertion macro might not be able to determine which version to +use, and it might be necessary to explicitly specify the type of the function. +For example, for a Boolean function `IsPositive()` overloaded to take either a +single `int` or `double` argument, it would be necessary to write one of the +following: + +```cpp +EXPECT_PRED1(static_cast(IsPositive), 5); +EXPECT_PRED1(static_cast(IsPositive), 3.14); +``` + +Writing simply `EXPECT_PRED1(IsPositive, 5);` would result in a compiler error. +Similarly, to use a template function, specify the template arguments: + +```cpp +template +bool IsNegative(T x) { + return x < 0; +} +... +EXPECT_PRED1(IsNegative, -5); // Must specify type for IsNegative +``` + +If a template has multiple parameters, wrap the predicate in parentheses so the +macro arguments are parsed correctly: + +```cpp +ASSERT_PRED2((MyPredicate), 5, 0); +``` + +### EXPECT_PRED_FORMAT* {#EXPECT_PRED_FORMAT} + +`EXPECT_PRED_FORMAT1(`*`pred_formatter`*`,`*`val1`*`)` \ +`EXPECT_PRED_FORMAT2(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`)` \ +`EXPECT_PRED_FORMAT3(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`)` \ +`EXPECT_PRED_FORMAT4(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`)` +\ +`EXPECT_PRED_FORMAT5(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`,`*`val5`*`)` + +`ASSERT_PRED_FORMAT1(`*`pred_formatter`*`,`*`val1`*`)` \ +`ASSERT_PRED_FORMAT2(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`)` \ +`ASSERT_PRED_FORMAT3(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`)` \ +`ASSERT_PRED_FORMAT4(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`)` +\ +`ASSERT_PRED_FORMAT5(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`,`*`val5`*`)` + +Verifies that the predicate *`pred_formatter`* succeeds when passed the given +values as arguments. + +The parameter *`pred_formatter`* is a *predicate-formatter*, which is a function +or functor with the signature: + +```cpp +testing::AssertionResult PredicateFormatter(const char* expr1, + const char* expr2, + ... + const char* exprn, + T1 val1, + T2 val2, + ... + Tn valn); +``` + +where *`val1`*, *`val2`*, ..., *`valn`* are the values of the predicate +arguments, and *`expr1`*, *`expr2`*, ..., *`exprn`* are the corresponding +expressions as they appear in the source code. The types `T1`, `T2`, ..., `Tn` +can be either value types or reference types; if an argument has type `T`, it +can be declared as either `T` or `const T&`, whichever is appropriate. For more +about the return type `testing::AssertionResult`, see +[Using a Function That Returns an AssertionResult](../advanced.md#using-a-function-that-returns-an-assertionresult). + +As an example, see the following code: + +```cpp +// Returns the smallest prime common divisor of m and n, +// or 1 when m and n are mutually prime. +int SmallestPrimeCommonDivisor(int m, int n) { ... } + +// Returns true if m and n have no common divisors except 1. +bool MutuallyPrime(int m, int n) { ... } + +// A predicate-formatter for asserting that two integers are mutually prime. +testing::AssertionResult AssertMutuallyPrime(const char* m_expr, + const char* n_expr, + int m, + int n) { + if (MutuallyPrime(m, n)) return testing::AssertionSuccess(); + + return testing::AssertionFailure() << m_expr << " and " << n_expr + << " (" << m << " and " << n << ") are not mutually prime, " + << "as they have a common divisor " << SmallestPrimeCommonDivisor(m, n); +} + +... +const int a = 3; +const int b = 4; +const int c = 10; +... +EXPECT_PRED_FORMAT2(AssertMutuallyPrime, a, b); // Succeeds +EXPECT_PRED_FORMAT2(AssertMutuallyPrime, b, c); // Fails +``` + +In the above example, the final assertion fails and the predicate-formatter +produces the following failure message: + +``` +b and c (4 and 10) are not mutually prime, as they have a common divisor 2 +``` + +## Windows HRESULT Assertions {#HRESULT} + +The following assertions test for `HRESULT` success or failure. For example: + +```cpp +CComPtr shell; +ASSERT_HRESULT_SUCCEEDED(shell.CoCreateInstance(L"Shell.Application")); +CComVariant empty; +ASSERT_HRESULT_SUCCEEDED(shell->ShellExecute(CComBSTR(url), empty, empty, empty, empty)); +``` + +The generated output contains the human-readable error message associated with +the returned `HRESULT` code. + +### EXPECT_HRESULT_SUCCEEDED {#EXPECT_HRESULT_SUCCEEDED} + +`EXPECT_HRESULT_SUCCEEDED(`*`expression`*`)` \ +`ASSERT_HRESULT_SUCCEEDED(`*`expression`*`)` + +Verifies that *`expression`* is a success `HRESULT`. + +### EXPECT_HRESULT_FAILED {#EXPECT_HRESULT_FAILED} + +`EXPECT_HRESULT_FAILED(`*`expression`*`)` \ +`ASSERT_HRESULT_FAILED(`*`expression`*`)` + +Verifies that *`expression`* is a failure `HRESULT`. + +## Death Assertions {#death} + +The following assertions verify that a piece of code causes the process to +terminate. For context, see [Death Tests](../advanced.md#death-tests). + +These assertions spawn a new process and execute the code under test in that +process. How that happens depends on the platform and the variable +`::testing::GTEST_FLAG(death_test_style)`, which is initialized from the +command-line flag `--gtest_death_test_style`. + +* On POSIX systems, `fork()` (or `clone()` on Linux) is used to spawn the + child, after which: + * If the variable's value is `"fast"`, the death test statement is + immediately executed. + * If the variable's value is `"threadsafe"`, the child process re-executes + the unit test binary just as it was originally invoked, but with some + extra flags to cause just the single death test under consideration to + be run. +* On Windows, the child is spawned using the `CreateProcess()` API, and + re-executes the binary to cause just the single death test under + consideration to be run - much like the `"threadsafe"` mode on POSIX. + +Other values for the variable are illegal and will cause the death test to fail. +Currently, the flag's default value is +**`"fast"`**. + +If the death test statement runs to completion without dying, the child process +will nonetheless terminate, and the assertion fails. + +Note that the piece of code under test can be a compound statement, for example: + +```cpp +EXPECT_DEATH({ + int n = 5; + DoSomething(&n); +}, "Error on line .* of DoSomething()"); +``` + +### EXPECT_DEATH {#EXPECT_DEATH} + +`EXPECT_DEATH(`*`statement`*`,`*`matcher`*`)` \ +`ASSERT_DEATH(`*`statement`*`,`*`matcher`*`)` + +Verifies that *`statement`* causes the process to terminate with a nonzero exit +status and produces `stderr` output that matches *`matcher`*. + +The parameter *`matcher`* is either a [matcher](matchers.md) for a `const +std::string&`, or a regular expression (see +[Regular Expression Syntax](../advanced.md#regular-expression-syntax))—a bare +string *`s`* (with no matcher) is treated as +[`ContainsRegex(s)`](matchers.md#string-matchers), **not** +[`Eq(s)`](matchers.md#generic-comparison). + +For example, the following code verifies that calling `DoSomething(42)` causes +the process to die with an error message that contains the text `My error`: + +```cpp +EXPECT_DEATH(DoSomething(42), "My error"); +``` + +### EXPECT_DEATH_IF_SUPPORTED {#EXPECT_DEATH_IF_SUPPORTED} + +`EXPECT_DEATH_IF_SUPPORTED(`*`statement`*`,`*`matcher`*`)` \ +`ASSERT_DEATH_IF_SUPPORTED(`*`statement`*`,`*`matcher`*`)` + +If death tests are supported, behaves the same as +[`EXPECT_DEATH`](#EXPECT_DEATH). Otherwise, verifies nothing. + +### EXPECT_DEBUG_DEATH {#EXPECT_DEBUG_DEATH} + +`EXPECT_DEBUG_DEATH(`*`statement`*`,`*`matcher`*`)` \ +`ASSERT_DEBUG_DEATH(`*`statement`*`,`*`matcher`*`)` + +In debug mode, behaves the same as [`EXPECT_DEATH`](#EXPECT_DEATH). When not in +debug mode (i.e. `NDEBUG` is defined), just executes *`statement`*. + +### EXPECT_EXIT {#EXPECT_EXIT} + +`EXPECT_EXIT(`*`statement`*`,`*`predicate`*`,`*`matcher`*`)` \ +`ASSERT_EXIT(`*`statement`*`,`*`predicate`*`,`*`matcher`*`)` + +Verifies that *`statement`* causes the process to terminate with an exit status +that satisfies *`predicate`*, and produces `stderr` output that matches +*`matcher`*. + +The parameter *`predicate`* is a function or functor that accepts an `int` exit +status and returns a `bool`. GoogleTest provides two predicates to handle common +cases: + +```cpp +// Returns true if the program exited normally with the given exit status code. +::testing::ExitedWithCode(exit_code); + +// Returns true if the program was killed by the given signal. +// Not available on Windows. +::testing::KilledBySignal(signal_number); +``` + +The parameter *`matcher`* is either a [matcher](matchers.md) for a `const +std::string&`, or a regular expression (see +[Regular Expression Syntax](../advanced.md#regular-expression-syntax))—a bare +string *`s`* (with no matcher) is treated as +[`ContainsRegex(s)`](matchers.md#string-matchers), **not** +[`Eq(s)`](matchers.md#generic-comparison). + +For example, the following code verifies that calling `NormalExit()` causes the +process to print a message containing the text `Success` to `stderr` and exit +with exit status code 0: + +```cpp +EXPECT_EXIT(NormalExit(), testing::ExitedWithCode(0), "Success"); +``` diff --git a/vendor/googletest-1.14.0/docs/reference/matchers.md b/vendor/googletest-1.14.0/docs/reference/matchers.md new file mode 100644 index 00000000..243e3f95 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/reference/matchers.md @@ -0,0 +1,302 @@ +# Matchers Reference + +A **matcher** matches a *single* argument. You can use it inside `ON_CALL()` or +`EXPECT_CALL()`, or use it to validate a value directly using two macros: + +| Macro | Description | +| :----------------------------------- | :------------------------------------ | +| `EXPECT_THAT(actual_value, matcher)` | Asserts that `actual_value` matches `matcher`. | +| `ASSERT_THAT(actual_value, matcher)` | The same as `EXPECT_THAT(actual_value, matcher)`, except that it generates a **fatal** failure. | + +{: .callout .warning} +**WARNING:** Equality matching via `EXPECT_THAT(actual_value, expected_value)` +is supported, however note that implicit conversions can cause surprising +results. For example, `EXPECT_THAT(some_bool, "some string")` will compile and +may pass unintentionally. + +**BEST PRACTICE:** Prefer to make the comparison explicit via +`EXPECT_THAT(actual_value, Eq(expected_value))` or `EXPECT_EQ(actual_value, +expected_value)`. + +Built-in matchers (where `argument` is the function argument, e.g. +`actual_value` in the example above, or when used in the context of +`EXPECT_CALL(mock_object, method(matchers))`, the arguments of `method`) are +divided into several categories. All matchers are defined in the `::testing` +namespace unless otherwise noted. + +## Wildcard + +Matcher | Description +:-------------------------- | :----------------------------------------------- +`_` | `argument` can be any value of the correct type. +`A()` or `An()` | `argument` can be any value of type `type`. + +## Generic Comparison + +| Matcher | Description | +| :--------------------- | :-------------------------------------------------- | +| `Eq(value)` or `value` | `argument == value` | +| `Ge(value)` | `argument >= value` | +| `Gt(value)` | `argument > value` | +| `Le(value)` | `argument <= value` | +| `Lt(value)` | `argument < value` | +| `Ne(value)` | `argument != value` | +| `IsFalse()` | `argument` evaluates to `false` in a Boolean context. | +| `IsTrue()` | `argument` evaluates to `true` in a Boolean context. | +| `IsNull()` | `argument` is a `NULL` pointer (raw or smart). | +| `NotNull()` | `argument` is a non-null pointer (raw or smart). | +| `Optional(m)` | `argument` is `optional<>` that contains a value matching `m`. (For testing whether an `optional<>` is set, check for equality with `nullopt`. You may need to use `Eq(nullopt)` if the inner type doesn't have `==`.)| +| `VariantWith(m)` | `argument` is `variant<>` that holds the alternative of type T with a value matching `m`. | +| `Ref(variable)` | `argument` is a reference to `variable`. | +| `TypedEq(value)` | `argument` has type `type` and is equal to `value`. You may need to use this instead of `Eq(value)` when the mock function is overloaded. | + +Except `Ref()`, these matchers make a *copy* of `value` in case it's modified or +destructed later. If the compiler complains that `value` doesn't have a public +copy constructor, try wrap it in `std::ref()`, e.g. +`Eq(std::ref(non_copyable_value))`. If you do that, make sure +`non_copyable_value` is not changed afterwards, or the meaning of your matcher +will be changed. + +`IsTrue` and `IsFalse` are useful when you need to use a matcher, or for types +that can be explicitly converted to Boolean, but are not implicitly converted to +Boolean. In other cases, you can use the basic +[`EXPECT_TRUE` and `EXPECT_FALSE`](assertions.md#boolean) assertions. + +## Floating-Point Matchers {#FpMatchers} + +| Matcher | Description | +| :------------------------------- | :--------------------------------- | +| `DoubleEq(a_double)` | `argument` is a `double` value approximately equal to `a_double`, treating two NaNs as unequal. | +| `FloatEq(a_float)` | `argument` is a `float` value approximately equal to `a_float`, treating two NaNs as unequal. | +| `NanSensitiveDoubleEq(a_double)` | `argument` is a `double` value approximately equal to `a_double`, treating two NaNs as equal. | +| `NanSensitiveFloatEq(a_float)` | `argument` is a `float` value approximately equal to `a_float`, treating two NaNs as equal. | +| `IsNan()` | `argument` is any floating-point type with a NaN value. | + +The above matchers use ULP-based comparison (the same as used in googletest). +They automatically pick a reasonable error bound based on the absolute value of +the expected value. `DoubleEq()` and `FloatEq()` conform to the IEEE standard, +which requires comparing two NaNs for equality to return false. The +`NanSensitive*` version instead treats two NaNs as equal, which is often what a +user wants. + +| Matcher | Description | +| :------------------------------------------------ | :----------------------- | +| `DoubleNear(a_double, max_abs_error)` | `argument` is a `double` value close to `a_double` (absolute error <= `max_abs_error`), treating two NaNs as unequal. | +| `FloatNear(a_float, max_abs_error)` | `argument` is a `float` value close to `a_float` (absolute error <= `max_abs_error`), treating two NaNs as unequal. | +| `NanSensitiveDoubleNear(a_double, max_abs_error)` | `argument` is a `double` value close to `a_double` (absolute error <= `max_abs_error`), treating two NaNs as equal. | +| `NanSensitiveFloatNear(a_float, max_abs_error)` | `argument` is a `float` value close to `a_float` (absolute error <= `max_abs_error`), treating two NaNs as equal. | + +## String Matchers + +The `argument` can be either a C string or a C++ string object: + +| Matcher | Description | +| :---------------------- | :------------------------------------------------- | +| `ContainsRegex(string)` | `argument` matches the given regular expression. | +| `EndsWith(suffix)` | `argument` ends with string `suffix`. | +| `HasSubstr(string)` | `argument` contains `string` as a sub-string. | +| `IsEmpty()` | `argument` is an empty string. | +| `MatchesRegex(string)` | `argument` matches the given regular expression with the match starting at the first character and ending at the last character. | +| `StartsWith(prefix)` | `argument` starts with string `prefix`. | +| `StrCaseEq(string)` | `argument` is equal to `string`, ignoring case. | +| `StrCaseNe(string)` | `argument` is not equal to `string`, ignoring case. | +| `StrEq(string)` | `argument` is equal to `string`. | +| `StrNe(string)` | `argument` is not equal to `string`. | +| `WhenBase64Unescaped(m)` | `argument` is a base-64 escaped string whose unescaped string matches `m`. The web-safe format from [RFC 4648](https://www.rfc-editor.org/rfc/rfc4648#section-5) is supported. | + +`ContainsRegex()` and `MatchesRegex()` take ownership of the `RE` object. They +use the regular expression syntax defined +[here](../advanced.md#regular-expression-syntax). All of these matchers, except +`ContainsRegex()` and `MatchesRegex()` work for wide strings as well. + +## Container Matchers + +Most STL-style containers support `==`, so you can use `Eq(expected_container)` +or simply `expected_container` to match a container exactly. If you want to +write the elements in-line, match them more flexibly, or get more informative +messages, you can use: + +| Matcher | Description | +| :---------------------------------------- | :------------------------------- | +| `BeginEndDistanceIs(m)` | `argument` is a container whose `begin()` and `end()` iterators are separated by a number of increments matching `m`. E.g. `BeginEndDistanceIs(2)` or `BeginEndDistanceIs(Lt(2))`. For containers that define a `size()` method, `SizeIs(m)` may be more efficient. | +| `ContainerEq(container)` | The same as `Eq(container)` except that the failure message also includes which elements are in one container but not the other. | +| `Contains(e)` | `argument` contains an element that matches `e`, which can be either a value or a matcher. | +| `Contains(e).Times(n)` | `argument` contains elements that match `e`, which can be either a value or a matcher, and the number of matches is `n`, which can be either a value or a matcher. Unlike the plain `Contains` and `Each` this allows to check for arbitrary occurrences including testing for absence with `Contains(e).Times(0)`. | +| `Each(e)` | `argument` is a container where *every* element matches `e`, which can be either a value or a matcher. | +| `ElementsAre(e0, e1, ..., en)` | `argument` has `n + 1` elements, where the *i*-th element matches `ei`, which can be a value or a matcher. | +| `ElementsAreArray({e0, e1, ..., en})`, `ElementsAreArray(a_container)`, `ElementsAreArray(begin, end)`, `ElementsAreArray(array)`, or `ElementsAreArray(array, count)` | The same as `ElementsAre()` except that the expected element values/matchers come from an initializer list, STL-style container, iterator range, or C-style array. | +| `IsEmpty()` | `argument` is an empty container (`container.empty()`). | +| `IsSubsetOf({e0, e1, ..., en})`, `IsSubsetOf(a_container)`, `IsSubsetOf(begin, end)`, `IsSubsetOf(array)`, or `IsSubsetOf(array, count)` | `argument` matches `UnorderedElementsAre(x0, x1, ..., xk)` for some subset `{x0, x1, ..., xk}` of the expected matchers. | +| `IsSupersetOf({e0, e1, ..., en})`, `IsSupersetOf(a_container)`, `IsSupersetOf(begin, end)`, `IsSupersetOf(array)`, or `IsSupersetOf(array, count)` | Some subset of `argument` matches `UnorderedElementsAre(`expected matchers`)`. | +| `Pointwise(m, container)`, `Pointwise(m, {e0, e1, ..., en})` | `argument` contains the same number of elements as in `container`, and for all i, (the i-th element in `argument`, the i-th element in `container`) match `m`, which is a matcher on 2-tuples. E.g. `Pointwise(Le(), upper_bounds)` verifies that each element in `argument` doesn't exceed the corresponding element in `upper_bounds`. See more detail below. | +| `SizeIs(m)` | `argument` is a container whose size matches `m`. E.g. `SizeIs(2)` or `SizeIs(Lt(2))`. | +| `UnorderedElementsAre(e0, e1, ..., en)` | `argument` has `n + 1` elements, and under *some* permutation of the elements, each element matches an `ei` (for a different `i`), which can be a value or a matcher. | +| `UnorderedElementsAreArray({e0, e1, ..., en})`, `UnorderedElementsAreArray(a_container)`, `UnorderedElementsAreArray(begin, end)`, `UnorderedElementsAreArray(array)`, or `UnorderedElementsAreArray(array, count)` | The same as `UnorderedElementsAre()` except that the expected element values/matchers come from an initializer list, STL-style container, iterator range, or C-style array. | +| `UnorderedPointwise(m, container)`, `UnorderedPointwise(m, {e0, e1, ..., en})` | Like `Pointwise(m, container)`, but ignores the order of elements. | +| `WhenSorted(m)` | When `argument` is sorted using the `<` operator, it matches container matcher `m`. E.g. `WhenSorted(ElementsAre(1, 2, 3))` verifies that `argument` contains elements 1, 2, and 3, ignoring order. | +| `WhenSortedBy(comparator, m)` | The same as `WhenSorted(m)`, except that the given comparator instead of `<` is used to sort `argument`. E.g. `WhenSortedBy(std::greater(), ElementsAre(3, 2, 1))`. | + +**Notes:** + +* These matchers can also match: + 1. a native array passed by reference (e.g. in `Foo(const int (&a)[5])`), + and + 2. an array passed as a pointer and a count (e.g. in `Bar(const T* buffer, + int len)` -- see [Multi-argument Matchers](#MultiArgMatchers)). +* The array being matched may be multi-dimensional (i.e. its elements can be + arrays). +* `m` in `Pointwise(m, ...)` and `UnorderedPointwise(m, ...)` should be a + matcher for `::std::tuple` where `T` and `U` are the element type of + the actual container and the expected container, respectively. For example, + to compare two `Foo` containers where `Foo` doesn't support `operator==`, + one might write: + + ```cpp + MATCHER(FooEq, "") { + return std::get<0>(arg).Equals(std::get<1>(arg)); + } + ... + EXPECT_THAT(actual_foos, Pointwise(FooEq(), expected_foos)); + ``` + +## Member Matchers + +| Matcher | Description | +| :------------------------------ | :----------------------------------------- | +| `Field(&class::field, m)` | `argument.field` (or `argument->field` when `argument` is a plain pointer) matches matcher `m`, where `argument` is an object of type _class_. | +| `Field(field_name, &class::field, m)` | The same as the two-parameter version, but provides a better error message. | +| `Key(e)` | `argument.first` matches `e`, which can be either a value or a matcher. E.g. `Contains(Key(Le(5)))` can verify that a `map` contains a key `<= 5`. | +| `Pair(m1, m2)` | `argument` is an `std::pair` whose `first` field matches `m1` and `second` field matches `m2`. | +| `FieldsAre(m...)` | `argument` is a compatible object where each field matches piecewise with the matchers `m...`. A compatible object is any that supports the `std::tuple_size`+`get(obj)` protocol. In C++17 and up this also supports types compatible with structured bindings, like aggregates. | +| `Property(&class::property, m)` | `argument.property()` (or `argument->property()` when `argument` is a plain pointer) matches matcher `m`, where `argument` is an object of type _class_. The method `property()` must take no argument and be declared as `const`. | +| `Property(property_name, &class::property, m)` | The same as the two-parameter version, but provides a better error message. + +**Notes:** + +* You can use `FieldsAre()` to match any type that supports structured + bindings, such as `std::tuple`, `std::pair`, `std::array`, and aggregate + types. For example: + + ```cpp + std::tuple my_tuple{7, "hello world"}; + EXPECT_THAT(my_tuple, FieldsAre(Ge(0), HasSubstr("hello"))); + + struct MyStruct { + int value = 42; + std::string greeting = "aloha"; + }; + MyStruct s; + EXPECT_THAT(s, FieldsAre(42, "aloha")); + ``` + +* Don't use `Property()` against member functions that you do not own, because + taking addresses of functions is fragile and generally not part of the + contract of the function. + +## Matching the Result of a Function, Functor, or Callback + +| Matcher | Description | +| :--------------- | :------------------------------------------------ | +| `ResultOf(f, m)` | `f(argument)` matches matcher `m`, where `f` is a function or functor. | +| `ResultOf(result_description, f, m)` | The same as the two-parameter version, but provides a better error message. + +## Pointer Matchers + +| Matcher | Description | +| :------------------------ | :---------------------------------------------- | +| `Address(m)` | the result of `std::addressof(argument)` matches `m`. | +| `Pointee(m)` | `argument` (either a smart pointer or a raw pointer) points to a value that matches matcher `m`. | +| `Pointer(m)` | `argument` (either a smart pointer or a raw pointer) contains a pointer that matches `m`. `m` will match against the raw pointer regardless of the type of `argument`. | +| `WhenDynamicCastTo(m)` | when `argument` is passed through `dynamic_cast()`, it matches matcher `m`. | + +## Multi-argument Matchers {#MultiArgMatchers} + +Technically, all matchers match a *single* value. A "multi-argument" matcher is +just one that matches a *tuple*. The following matchers can be used to match a +tuple `(x, y)`: + +Matcher | Description +:------ | :---------- +`Eq()` | `x == y` +`Ge()` | `x >= y` +`Gt()` | `x > y` +`Le()` | `x <= y` +`Lt()` | `x < y` +`Ne()` | `x != y` + +You can use the following selectors to pick a subset of the arguments (or +reorder them) to participate in the matching: + +| Matcher | Description | +| :------------------------- | :---------------------------------------------- | +| `AllArgs(m)` | Equivalent to `m`. Useful as syntactic sugar in `.With(AllArgs(m))`. | +| `Args(m)` | The tuple of the `k` selected (using 0-based indices) arguments matches `m`, e.g. `Args<1, 2>(Eq())`. | + +## Composite Matchers + +You can make a matcher from one or more other matchers: + +| Matcher | Description | +| :------------------------------- | :-------------------------------------- | +| `AllOf(m1, m2, ..., mn)` | `argument` matches all of the matchers `m1` to `mn`. | +| `AllOfArray({m0, m1, ..., mn})`, `AllOfArray(a_container)`, `AllOfArray(begin, end)`, `AllOfArray(array)`, or `AllOfArray(array, count)` | The same as `AllOf()` except that the matchers come from an initializer list, STL-style container, iterator range, or C-style array. | +| `AnyOf(m1, m2, ..., mn)` | `argument` matches at least one of the matchers `m1` to `mn`. | +| `AnyOfArray({m0, m1, ..., mn})`, `AnyOfArray(a_container)`, `AnyOfArray(begin, end)`, `AnyOfArray(array)`, or `AnyOfArray(array, count)` | The same as `AnyOf()` except that the matchers come from an initializer list, STL-style container, iterator range, or C-style array. | +| `Not(m)` | `argument` doesn't match matcher `m`. | +| `Conditional(cond, m1, m2)` | Matches matcher `m1` if `cond` evaluates to true, else matches `m2`.| + +## Adapters for Matchers + +| Matcher | Description | +| :---------------------- | :------------------------------------ | +| `MatcherCast(m)` | casts matcher `m` to type `Matcher`. | +| `SafeMatcherCast(m)` | [safely casts](../gmock_cook_book.md#SafeMatcherCast) matcher `m` to type `Matcher`. | +| `Truly(predicate)` | `predicate(argument)` returns something considered by C++ to be true, where `predicate` is a function or functor. | + +`AddressSatisfies(callback)` and `Truly(callback)` take ownership of `callback`, +which must be a permanent callback. + +## Using Matchers as Predicates {#MatchersAsPredicatesCheat} + +| Matcher | Description | +| :---------------------------- | :------------------------------------------ | +| `Matches(m)(value)` | evaluates to `true` if `value` matches `m`. You can use `Matches(m)` alone as a unary functor. | +| `ExplainMatchResult(m, value, result_listener)` | evaluates to `true` if `value` matches `m`, explaining the result to `result_listener`. | +| `Value(value, m)` | evaluates to `true` if `value` matches `m`. | + +## Defining Matchers + +| Macro | Description | +| :----------------------------------- | :------------------------------------ | +| `MATCHER(IsEven, "") { return (arg % 2) == 0; }` | Defines a matcher `IsEven()` to match an even number. | +| `MATCHER_P(IsDivisibleBy, n, "") { *result_listener << "where the remainder is " << (arg % n); return (arg % n) == 0; }` | Defines a matcher `IsDivisibleBy(n)` to match a number divisible by `n`. | +| `MATCHER_P2(IsBetween, a, b, absl::StrCat(negation ? "isn't" : "is", " between ", PrintToString(a), " and ", PrintToString(b))) { return a <= arg && arg <= b; }` | Defines a matcher `IsBetween(a, b)` to match a value in the range [`a`, `b`]. | + +**Notes:** + +1. The `MATCHER*` macros cannot be used inside a function or class. +2. The matcher body must be *purely functional* (i.e. it cannot have any side + effect, and the result must not depend on anything other than the value + being matched and the matcher parameters). +3. You can use `PrintToString(x)` to convert a value `x` of any type to a + string. +4. You can use `ExplainMatchResult()` in a custom matcher to wrap another + matcher, for example: + + ```cpp + MATCHER_P(NestedPropertyMatches, matcher, "") { + return ExplainMatchResult(matcher, arg.nested().property(), result_listener); + } + ``` + +5. You can use `DescribeMatcher<>` to describe another matcher. For example: + + ```cpp + MATCHER_P(XAndYThat, matcher, + "X that " + DescribeMatcher(matcher, negation) + + (negation ? " or" : " and") + " Y that " + + DescribeMatcher(matcher, negation)) { + return ExplainMatchResult(matcher, arg.x(), result_listener) && + ExplainMatchResult(matcher, arg.y(), result_listener); + } + ``` diff --git a/vendor/googletest-1.14.0/docs/reference/mocking.md b/vendor/googletest-1.14.0/docs/reference/mocking.md new file mode 100644 index 00000000..e414ffbd --- /dev/null +++ b/vendor/googletest-1.14.0/docs/reference/mocking.md @@ -0,0 +1,589 @@ +# Mocking Reference + +This page lists the facilities provided by GoogleTest for creating and working +with mock objects. To use them, include the header +`gmock/gmock.h`. + +## Macros {#macros} + +GoogleTest defines the following macros for working with mocks. + +### MOCK_METHOD {#MOCK_METHOD} + +`MOCK_METHOD(`*`return_type`*`,`*`method_name`*`, (`*`args...`*`));` \ +`MOCK_METHOD(`*`return_type`*`,`*`method_name`*`, (`*`args...`*`), +(`*`specs...`*`));` + +Defines a mock method *`method_name`* with arguments `(`*`args...`*`)` and +return type *`return_type`* within a mock class. + +The parameters of `MOCK_METHOD` mirror the method declaration. The optional +fourth parameter *`specs...`* is a comma-separated list of qualifiers. The +following qualifiers are accepted: + +| Qualifier | Meaning | +| -------------------------- | -------------------------------------------- | +| `const` | Makes the mocked method a `const` method. Required if overriding a `const` method. | +| `override` | Marks the method with `override`. Recommended if overriding a `virtual` method. | +| `noexcept` | Marks the method with `noexcept`. Required if overriding a `noexcept` method. | +| `Calltype(`*`calltype`*`)` | Sets the call type for the method, for example `Calltype(STDMETHODCALLTYPE)`. Useful on Windows. | +| `ref(`*`qualifier`*`)` | Marks the method with the given reference qualifier, for example `ref(&)` or `ref(&&)`. Required if overriding a method that has a reference qualifier. | + +Note that commas in arguments prevent `MOCK_METHOD` from parsing the arguments +correctly if they are not appropriately surrounded by parentheses. See the +following example: + +```cpp +class MyMock { + public: + // The following 2 lines will not compile due to commas in the arguments: + MOCK_METHOD(std::pair, GetPair, ()); // Error! + MOCK_METHOD(bool, CheckMap, (std::map, bool)); // Error! + + // One solution - wrap arguments that contain commas in parentheses: + MOCK_METHOD((std::pair), GetPair, ()); + MOCK_METHOD(bool, CheckMap, ((std::map), bool)); + + // Another solution - use type aliases: + using BoolAndInt = std::pair; + MOCK_METHOD(BoolAndInt, GetPair, ()); + using MapIntDouble = std::map; + MOCK_METHOD(bool, CheckMap, (MapIntDouble, bool)); +}; +``` + +`MOCK_METHOD` must be used in the `public:` section of a mock class definition, +regardless of whether the method being mocked is `public`, `protected`, or +`private` in the base class. + +### EXPECT_CALL {#EXPECT_CALL} + +`EXPECT_CALL(`*`mock_object`*`,`*`method_name`*`(`*`matchers...`*`))` + +Creates an [expectation](../gmock_for_dummies.md#setting-expectations) that the +method *`method_name`* of the object *`mock_object`* is called with arguments +that match the given matchers *`matchers...`*. `EXPECT_CALL` must precede any +code that exercises the mock object. + +The parameter *`matchers...`* is a comma-separated list of +[matchers](../gmock_for_dummies.md#matchers-what-arguments-do-we-expect) that +correspond to each argument of the method *`method_name`*. The expectation will +apply only to calls of *`method_name`* whose arguments match all of the +matchers. If `(`*`matchers...`*`)` is omitted, the expectation behaves as if +each argument's matcher were a [wildcard matcher (`_`)](matchers.md#wildcard). +See the [Matchers Reference](matchers.md) for a list of all built-in matchers. + +The following chainable clauses can be used to modify the expectation, and they +must be used in the following order: + +```cpp +EXPECT_CALL(mock_object, method_name(matchers...)) + .With(multi_argument_matcher) // Can be used at most once + .Times(cardinality) // Can be used at most once + .InSequence(sequences...) // Can be used any number of times + .After(expectations...) // Can be used any number of times + .WillOnce(action) // Can be used any number of times + .WillRepeatedly(action) // Can be used at most once + .RetiresOnSaturation(); // Can be used at most once +``` + +See details for each modifier clause below. + +#### With {#EXPECT_CALL.With} + +`.With(`*`multi_argument_matcher`*`)` + +Restricts the expectation to apply only to mock function calls whose arguments +as a whole match the multi-argument matcher *`multi_argument_matcher`*. + +GoogleTest passes all of the arguments as one tuple into the matcher. The +parameter *`multi_argument_matcher`* must thus be a matcher of type +`Matcher>`, where `A1, ..., An` are the types of the +function arguments. + +For example, the following code sets the expectation that +`my_mock.SetPosition()` is called with any two arguments, the first argument +being less than the second: + +```cpp +using ::testing::_; +using ::testing::Lt; +... +EXPECT_CALL(my_mock, SetPosition(_, _)) + .With(Lt()); +``` + +GoogleTest provides some built-in matchers for 2-tuples, including the `Lt()` +matcher above. See [Multi-argument Matchers](matchers.md#MultiArgMatchers). + +The `With` clause can be used at most once on an expectation and must be the +first clause. + +#### Times {#EXPECT_CALL.Times} + +`.Times(`*`cardinality`*`)` + +Specifies how many times the mock function call is expected. + +The parameter *`cardinality`* represents the number of expected calls and can be +one of the following, all defined in the `::testing` namespace: + +| Cardinality | Meaning | +| ------------------- | --------------------------------------------------- | +| `AnyNumber()` | The function can be called any number of times. | +| `AtLeast(n)` | The function call is expected at least *n* times. | +| `AtMost(n)` | The function call is expected at most *n* times. | +| `Between(m, n)` | The function call is expected between *m* and *n* times, inclusive. | +| `Exactly(n)` or `n` | The function call is expected exactly *n* times. If *n* is 0, the call should never happen. | + +If the `Times` clause is omitted, GoogleTest infers the cardinality as follows: + +* If neither [`WillOnce`](#EXPECT_CALL.WillOnce) nor + [`WillRepeatedly`](#EXPECT_CALL.WillRepeatedly) are specified, the inferred + cardinality is `Times(1)`. +* If there are *n* `WillOnce` clauses and no `WillRepeatedly` clause, where + *n* >= 1, the inferred cardinality is `Times(n)`. +* If there are *n* `WillOnce` clauses and one `WillRepeatedly` clause, where + *n* >= 0, the inferred cardinality is `Times(AtLeast(n))`. + +The `Times` clause can be used at most once on an expectation. + +#### InSequence {#EXPECT_CALL.InSequence} + +`.InSequence(`*`sequences...`*`)` + +Specifies that the mock function call is expected in a certain sequence. + +The parameter *`sequences...`* is any number of [`Sequence`](#Sequence) objects. +Expected calls assigned to the same sequence are expected to occur in the order +the expectations are declared. + +For example, the following code sets the expectation that the `Reset()` method +of `my_mock` is called before both `GetSize()` and `Describe()`, and `GetSize()` +and `Describe()` can occur in any order relative to each other: + +```cpp +using ::testing::Sequence; +Sequence s1, s2; +... +EXPECT_CALL(my_mock, Reset()) + .InSequence(s1, s2); +EXPECT_CALL(my_mock, GetSize()) + .InSequence(s1); +EXPECT_CALL(my_mock, Describe()) + .InSequence(s2); +``` + +The `InSequence` clause can be used any number of times on an expectation. + +See also the [`InSequence` class](#InSequence). + +#### After {#EXPECT_CALL.After} + +`.After(`*`expectations...`*`)` + +Specifies that the mock function call is expected to occur after one or more +other calls. + +The parameter *`expectations...`* can be up to five +[`Expectation`](#Expectation) or [`ExpectationSet`](#ExpectationSet) objects. +The mock function call is expected to occur after all of the given expectations. + +For example, the following code sets the expectation that the `Describe()` +method of `my_mock` is called only after both `InitX()` and `InitY()` have been +called. + +```cpp +using ::testing::Expectation; +... +Expectation init_x = EXPECT_CALL(my_mock, InitX()); +Expectation init_y = EXPECT_CALL(my_mock, InitY()); +EXPECT_CALL(my_mock, Describe()) + .After(init_x, init_y); +``` + +The `ExpectationSet` object is helpful when the number of prerequisites for an +expectation is large or variable, for example: + +```cpp +using ::testing::ExpectationSet; +... +ExpectationSet all_inits; +// Collect all expectations of InitElement() calls +for (int i = 0; i < element_count; i++) { + all_inits += EXPECT_CALL(my_mock, InitElement(i)); +} +EXPECT_CALL(my_mock, Describe()) + .After(all_inits); // Expect Describe() call after all InitElement() calls +``` + +The `After` clause can be used any number of times on an expectation. + +#### WillOnce {#EXPECT_CALL.WillOnce} + +`.WillOnce(`*`action`*`)` + +Specifies the mock function's actual behavior when invoked, for a single +matching function call. + +The parameter *`action`* represents the +[action](../gmock_for_dummies.md#actions-what-should-it-do) that the function +call will perform. See the [Actions Reference](actions.md) for a list of +built-in actions. + +The use of `WillOnce` implicitly sets a cardinality on the expectation when +`Times` is not specified. See [`Times`](#EXPECT_CALL.Times). + +Each matching function call will perform the next action in the order declared. +For example, the following code specifies that `my_mock.GetNumber()` is expected +to be called exactly 3 times and will return `1`, `2`, and `3` respectively on +the first, second, and third calls: + +```cpp +using ::testing::Return; +... +EXPECT_CALL(my_mock, GetNumber()) + .WillOnce(Return(1)) + .WillOnce(Return(2)) + .WillOnce(Return(3)); +``` + +The `WillOnce` clause can be used any number of times on an expectation. Unlike +`WillRepeatedly`, the action fed to each `WillOnce` call will be called at most +once, so may be a move-only type and/or have an `&&`-qualified call operator. + +#### WillRepeatedly {#EXPECT_CALL.WillRepeatedly} + +`.WillRepeatedly(`*`action`*`)` + +Specifies the mock function's actual behavior when invoked, for all subsequent +matching function calls. Takes effect after the actions specified in the +[`WillOnce`](#EXPECT_CALL.WillOnce) clauses, if any, have been performed. + +The parameter *`action`* represents the +[action](../gmock_for_dummies.md#actions-what-should-it-do) that the function +call will perform. See the [Actions Reference](actions.md) for a list of +built-in actions. + +The use of `WillRepeatedly` implicitly sets a cardinality on the expectation +when `Times` is not specified. See [`Times`](#EXPECT_CALL.Times). + +If any `WillOnce` clauses have been specified, matching function calls will +perform those actions before the action specified by `WillRepeatedly`. See the +following example: + +```cpp +using ::testing::Return; +... +EXPECT_CALL(my_mock, GetName()) + .WillRepeatedly(Return("John Doe")); // Return "John Doe" on all calls + +EXPECT_CALL(my_mock, GetNumber()) + .WillOnce(Return(42)) // Return 42 on the first call + .WillRepeatedly(Return(7)); // Return 7 on all subsequent calls +``` + +The `WillRepeatedly` clause can be used at most once on an expectation. + +#### RetiresOnSaturation {#EXPECT_CALL.RetiresOnSaturation} + +`.RetiresOnSaturation()` + +Indicates that the expectation will no longer be active after the expected +number of matching function calls has been reached. + +The `RetiresOnSaturation` clause is only meaningful for expectations with an +upper-bounded cardinality. The expectation will *retire* (no longer match any +function calls) after it has been *saturated* (the upper bound has been +reached). See the following example: + +```cpp +using ::testing::_; +using ::testing::AnyNumber; +... +EXPECT_CALL(my_mock, SetNumber(_)) // Expectation 1 + .Times(AnyNumber()); +EXPECT_CALL(my_mock, SetNumber(7)) // Expectation 2 + .Times(2) + .RetiresOnSaturation(); +``` + +In the above example, the first two calls to `my_mock.SetNumber(7)` match +expectation 2, which then becomes inactive and no longer matches any calls. A +third call to `my_mock.SetNumber(7)` would then match expectation 1. Without +`RetiresOnSaturation()` on expectation 2, a third call to `my_mock.SetNumber(7)` +would match expectation 2 again, producing a failure since the limit of 2 calls +was exceeded. + +The `RetiresOnSaturation` clause can be used at most once on an expectation and +must be the last clause. + +### ON_CALL {#ON_CALL} + +`ON_CALL(`*`mock_object`*`,`*`method_name`*`(`*`matchers...`*`))` + +Defines what happens when the method *`method_name`* of the object +*`mock_object`* is called with arguments that match the given matchers +*`matchers...`*. Requires a modifier clause to specify the method's behavior. +*Does not* set any expectations that the method will be called. + +The parameter *`matchers...`* is a comma-separated list of +[matchers](../gmock_for_dummies.md#matchers-what-arguments-do-we-expect) that +correspond to each argument of the method *`method_name`*. The `ON_CALL` +specification will apply only to calls of *`method_name`* whose arguments match +all of the matchers. If `(`*`matchers...`*`)` is omitted, the behavior is as if +each argument's matcher were a [wildcard matcher (`_`)](matchers.md#wildcard). +See the [Matchers Reference](matchers.md) for a list of all built-in matchers. + +The following chainable clauses can be used to set the method's behavior, and +they must be used in the following order: + +```cpp +ON_CALL(mock_object, method_name(matchers...)) + .With(multi_argument_matcher) // Can be used at most once + .WillByDefault(action); // Required +``` + +See details for each modifier clause below. + +#### With {#ON_CALL.With} + +`.With(`*`multi_argument_matcher`*`)` + +Restricts the specification to only mock function calls whose arguments as a +whole match the multi-argument matcher *`multi_argument_matcher`*. + +GoogleTest passes all of the arguments as one tuple into the matcher. The +parameter *`multi_argument_matcher`* must thus be a matcher of type +`Matcher>`, where `A1, ..., An` are the types of the +function arguments. + +For example, the following code sets the default behavior when +`my_mock.SetPosition()` is called with any two arguments, the first argument +being less than the second: + +```cpp +using ::testing::_; +using ::testing::Lt; +using ::testing::Return; +... +ON_CALL(my_mock, SetPosition(_, _)) + .With(Lt()) + .WillByDefault(Return(true)); +``` + +GoogleTest provides some built-in matchers for 2-tuples, including the `Lt()` +matcher above. See [Multi-argument Matchers](matchers.md#MultiArgMatchers). + +The `With` clause can be used at most once with each `ON_CALL` statement. + +#### WillByDefault {#ON_CALL.WillByDefault} + +`.WillByDefault(`*`action`*`)` + +Specifies the default behavior of a matching mock function call. + +The parameter *`action`* represents the +[action](../gmock_for_dummies.md#actions-what-should-it-do) that the function +call will perform. See the [Actions Reference](actions.md) for a list of +built-in actions. + +For example, the following code specifies that by default, a call to +`my_mock.Greet()` will return `"hello"`: + +```cpp +using ::testing::Return; +... +ON_CALL(my_mock, Greet()) + .WillByDefault(Return("hello")); +``` + +The action specified by `WillByDefault` is superseded by the actions specified +on a matching `EXPECT_CALL` statement, if any. See the +[`WillOnce`](#EXPECT_CALL.WillOnce) and +[`WillRepeatedly`](#EXPECT_CALL.WillRepeatedly) clauses of `EXPECT_CALL`. + +The `WillByDefault` clause must be used exactly once with each `ON_CALL` +statement. + +## Classes {#classes} + +GoogleTest defines the following classes for working with mocks. + +### DefaultValue {#DefaultValue} + +`::testing::DefaultValue` + +Allows a user to specify the default value for a type `T` that is both copyable +and publicly destructible (i.e. anything that can be used as a function return +type). For mock functions with a return type of `T`, this default value is +returned from function calls that do not specify an action. + +Provides the static methods `Set()`, `SetFactory()`, and `Clear()` to manage the +default value: + +```cpp +// Sets the default value to be returned. T must be copy constructible. +DefaultValue::Set(value); + +// Sets a factory. Will be invoked on demand. T must be move constructible. +T MakeT(); +DefaultValue::SetFactory(&MakeT); + +// Unsets the default value. +DefaultValue::Clear(); +``` + +### NiceMock {#NiceMock} + +`::testing::NiceMock` + +Represents a mock object that suppresses warnings on +[uninteresting calls](../gmock_cook_book.md#uninteresting-vs-unexpected). The +template parameter `T` is any mock class, except for another `NiceMock`, +`NaggyMock`, or `StrictMock`. + +Usage of `NiceMock` is analogous to usage of `T`. `NiceMock` is a subclass +of `T`, so it can be used wherever an object of type `T` is accepted. In +addition, `NiceMock` can be constructed with any arguments that a constructor +of `T` accepts. + +For example, the following code suppresses warnings on the mock `my_mock` of +type `MockClass` if a method other than `DoSomething()` is called: + +```cpp +using ::testing::NiceMock; +... +NiceMock my_mock("some", "args"); +EXPECT_CALL(my_mock, DoSomething()); +... code that uses my_mock ... +``` + +`NiceMock` only works for mock methods defined using the `MOCK_METHOD` macro +directly in the definition of class `T`. If a mock method is defined in a base +class of `T`, a warning might still be generated. + +`NiceMock` might not work correctly if the destructor of `T` is not virtual. + +### NaggyMock {#NaggyMock} + +`::testing::NaggyMock` + +Represents a mock object that generates warnings on +[uninteresting calls](../gmock_cook_book.md#uninteresting-vs-unexpected). The +template parameter `T` is any mock class, except for another `NiceMock`, +`NaggyMock`, or `StrictMock`. + +Usage of `NaggyMock` is analogous to usage of `T`. `NaggyMock` is a +subclass of `T`, so it can be used wherever an object of type `T` is accepted. +In addition, `NaggyMock` can be constructed with any arguments that a +constructor of `T` accepts. + +For example, the following code generates warnings on the mock `my_mock` of type +`MockClass` if a method other than `DoSomething()` is called: + +```cpp +using ::testing::NaggyMock; +... +NaggyMock my_mock("some", "args"); +EXPECT_CALL(my_mock, DoSomething()); +... code that uses my_mock ... +``` + +Mock objects of type `T` by default behave the same way as `NaggyMock`. + +### StrictMock {#StrictMock} + +`::testing::StrictMock` + +Represents a mock object that generates test failures on +[uninteresting calls](../gmock_cook_book.md#uninteresting-vs-unexpected). The +template parameter `T` is any mock class, except for another `NiceMock`, +`NaggyMock`, or `StrictMock`. + +Usage of `StrictMock` is analogous to usage of `T`. `StrictMock` is a +subclass of `T`, so it can be used wherever an object of type `T` is accepted. +In addition, `StrictMock` can be constructed with any arguments that a +constructor of `T` accepts. + +For example, the following code generates a test failure on the mock `my_mock` +of type `MockClass` if a method other than `DoSomething()` is called: + +```cpp +using ::testing::StrictMock; +... +StrictMock my_mock("some", "args"); +EXPECT_CALL(my_mock, DoSomething()); +... code that uses my_mock ... +``` + +`StrictMock` only works for mock methods defined using the `MOCK_METHOD` +macro directly in the definition of class `T`. If a mock method is defined in a +base class of `T`, a failure might not be generated. + +`StrictMock` might not work correctly if the destructor of `T` is not +virtual. + +### Sequence {#Sequence} + +`::testing::Sequence` + +Represents a chronological sequence of expectations. See the +[`InSequence`](#EXPECT_CALL.InSequence) clause of `EXPECT_CALL` for usage. + +### InSequence {#InSequence} + +`::testing::InSequence` + +An object of this type causes all expectations encountered in its scope to be +put in an anonymous sequence. + +This allows more convenient expression of multiple expectations in a single +sequence: + +```cpp +using ::testing::InSequence; +{ + InSequence seq; + + // The following are expected to occur in the order declared. + EXPECT_CALL(...); + EXPECT_CALL(...); + ... + EXPECT_CALL(...); +} +``` + +The name of the `InSequence` object does not matter. + +### Expectation {#Expectation} + +`::testing::Expectation` + +Represents a mock function call expectation as created by +[`EXPECT_CALL`](#EXPECT_CALL): + +```cpp +using ::testing::Expectation; +Expectation my_expectation = EXPECT_CALL(...); +``` + +Useful for specifying sequences of expectations; see the +[`After`](#EXPECT_CALL.After) clause of `EXPECT_CALL`. + +### ExpectationSet {#ExpectationSet} + +`::testing::ExpectationSet` + +Represents a set of mock function call expectations. + +Use the `+=` operator to add [`Expectation`](#Expectation) objects to the set: + +```cpp +using ::testing::ExpectationSet; +ExpectationSet my_expectations; +my_expectations += EXPECT_CALL(...); +``` + +Useful for specifying sequences of expectations; see the +[`After`](#EXPECT_CALL.After) clause of `EXPECT_CALL`. diff --git a/vendor/googletest-1.14.0/docs/reference/testing.md b/vendor/googletest-1.14.0/docs/reference/testing.md new file mode 100644 index 00000000..17225a68 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/reference/testing.md @@ -0,0 +1,1432 @@ +# Testing Reference + + + +This page lists the facilities provided by GoogleTest for writing test programs. +To use them, include the header `gtest/gtest.h`. + +## Macros + +GoogleTest defines the following macros for writing tests. + +### TEST {#TEST} + +
        +TEST(TestSuiteName, TestName) {
        +  ... statements ...
        +}
        +
        + +Defines an individual test named *`TestName`* in the test suite +*`TestSuiteName`*, consisting of the given statements. + +Both arguments *`TestSuiteName`* and *`TestName`* must be valid C++ identifiers +and must not contain underscores (`_`). Tests in different test suites can have +the same individual name. + +The statements within the test body can be any code under test. +[Assertions](assertions.md) used within the test body determine the outcome of +the test. + +### TEST_F {#TEST_F} + +
        +TEST_F(TestFixtureName, TestName) {
        +  ... statements ...
        +}
        +
        + +Defines an individual test named *`TestName`* that uses the test fixture class +*`TestFixtureName`*. The test suite name is *`TestFixtureName`*. + +Both arguments *`TestFixtureName`* and *`TestName`* must be valid C++ +identifiers and must not contain underscores (`_`). *`TestFixtureName`* must be +the name of a test fixture class—see +[Test Fixtures](../primer.md#same-data-multiple-tests). + +The statements within the test body can be any code under test. +[Assertions](assertions.md) used within the test body determine the outcome of +the test. + +### TEST_P {#TEST_P} + +
        +TEST_P(TestFixtureName, TestName) {
        +  ... statements ...
        +}
        +
        + +Defines an individual value-parameterized test named *`TestName`* that uses the +test fixture class *`TestFixtureName`*. The test suite name is +*`TestFixtureName`*. + +Both arguments *`TestFixtureName`* and *`TestName`* must be valid C++ +identifiers and must not contain underscores (`_`). *`TestFixtureName`* must be +the name of a value-parameterized test fixture class—see +[Value-Parameterized Tests](../advanced.md#value-parameterized-tests). + +The statements within the test body can be any code under test. Within the test +body, the test parameter can be accessed with the `GetParam()` function (see +[`WithParamInterface`](#WithParamInterface)). For example: + +```cpp +TEST_P(MyTestSuite, DoesSomething) { + ... + EXPECT_TRUE(DoSomething(GetParam())); + ... +} +``` + +[Assertions](assertions.md) used within the test body determine the outcome of +the test. + +See also [`INSTANTIATE_TEST_SUITE_P`](#INSTANTIATE_TEST_SUITE_P). + +### INSTANTIATE_TEST_SUITE_P {#INSTANTIATE_TEST_SUITE_P} + +`INSTANTIATE_TEST_SUITE_P(`*`InstantiationName`*`,`*`TestSuiteName`*`,`*`param_generator`*`)` +\ +`INSTANTIATE_TEST_SUITE_P(`*`InstantiationName`*`,`*`TestSuiteName`*`,`*`param_generator`*`,`*`name_generator`*`)` + +Instantiates the value-parameterized test suite *`TestSuiteName`* (defined with +[`TEST_P`](#TEST_P)). + +The argument *`InstantiationName`* is a unique name for the instantiation of the +test suite, to distinguish between multiple instantiations. In test output, the +instantiation name is added as a prefix to the test suite name +*`TestSuiteName`*. + +The argument *`param_generator`* is one of the following GoogleTest-provided +functions that generate the test parameters, all defined in the `::testing` +namespace: + + + +| Parameter Generator | Behavior | +| ------------------- | ---------------------------------------------------- | +| `Range(begin, end [, step])` | Yields values `{begin, begin+step, begin+step+step, ...}`. The values do not include `end`. `step` defaults to 1. | +| `Values(v1, v2, ..., vN)` | Yields values `{v1, v2, ..., vN}`. | +| `ValuesIn(container)` or `ValuesIn(begin,end)` | Yields values from a C-style array, an STL-style container, or an iterator range `[begin, end)`. | +| `Bool()` | Yields sequence `{false, true}`. | +| `Combine(g1, g2, ..., gN)` | Yields as `std::tuple` *n*-tuples all combinations (Cartesian product) of the values generated by the given *n* generators `g1`, `g2`, ..., `gN`. | +| `ConvertGenerator(g)` | Yields values generated by generator `g`, `static_cast` to `T`. | + +The optional last argument *`name_generator`* is a function or functor that +generates custom test name suffixes based on the test parameters. The function +must accept an argument of type +[`TestParamInfo`](#TestParamInfo) and return a `std::string`. +The test name suffix can only contain alphanumeric characters and underscores. +GoogleTest provides [`PrintToStringParamName`](#PrintToStringParamName), or a +custom function can be used for more control: + +```cpp +INSTANTIATE_TEST_SUITE_P( + MyInstantiation, MyTestSuite, + testing::Values(...), + [](const testing::TestParamInfo& info) { + // Can use info.param here to generate the test suffix + std::string name = ... + return name; + }); +``` + +For more information, see +[Value-Parameterized Tests](../advanced.md#value-parameterized-tests). + +See also +[`GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST`](#GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST). + +### TYPED_TEST_SUITE {#TYPED_TEST_SUITE} + +`TYPED_TEST_SUITE(`*`TestFixtureName`*`,`*`Types`*`)` + +Defines a typed test suite based on the test fixture *`TestFixtureName`*. The +test suite name is *`TestFixtureName`*. + +The argument *`TestFixtureName`* is a fixture class template, parameterized by a +type, for example: + +```cpp +template +class MyFixture : public testing::Test { + public: + ... + using List = std::list; + static T shared_; + T value_; +}; +``` + +The argument *`Types`* is a [`Types`](#Types) object representing the list of +types to run the tests on, for example: + +```cpp +using MyTypes = ::testing::Types; +TYPED_TEST_SUITE(MyFixture, MyTypes); +``` + +The type alias (`using` or `typedef`) is necessary for the `TYPED_TEST_SUITE` +macro to parse correctly. + +See also [`TYPED_TEST`](#TYPED_TEST) and +[Typed Tests](../advanced.md#typed-tests) for more information. + +### TYPED_TEST {#TYPED_TEST} + +
        +TYPED_TEST(TestSuiteName, TestName) {
        +  ... statements ...
        +}
        +
        + +Defines an individual typed test named *`TestName`* in the typed test suite +*`TestSuiteName`*. The test suite must be defined with +[`TYPED_TEST_SUITE`](#TYPED_TEST_SUITE). + +Within the test body, the special name `TypeParam` refers to the type parameter, +and `TestFixture` refers to the fixture class. See the following example: + +```cpp +TYPED_TEST(MyFixture, Example) { + // Inside a test, refer to the special name TypeParam to get the type + // parameter. Since we are inside a derived class template, C++ requires + // us to visit the members of MyFixture via 'this'. + TypeParam n = this->value_; + + // To visit static members of the fixture, add the 'TestFixture::' + // prefix. + n += TestFixture::shared_; + + // To refer to typedefs in the fixture, add the 'typename TestFixture::' + // prefix. The 'typename' is required to satisfy the compiler. + typename TestFixture::List values; + + values.push_back(n); + ... +} +``` + +For more information, see [Typed Tests](../advanced.md#typed-tests). + +### TYPED_TEST_SUITE_P {#TYPED_TEST_SUITE_P} + +`TYPED_TEST_SUITE_P(`*`TestFixtureName`*`)` + +Defines a type-parameterized test suite based on the test fixture +*`TestFixtureName`*. The test suite name is *`TestFixtureName`*. + +The argument *`TestFixtureName`* is a fixture class template, parameterized by a +type. See [`TYPED_TEST_SUITE`](#TYPED_TEST_SUITE) for an example. + +See also [`TYPED_TEST_P`](#TYPED_TEST_P) and +[Type-Parameterized Tests](../advanced.md#type-parameterized-tests) for more +information. + +### TYPED_TEST_P {#TYPED_TEST_P} + +
        +TYPED_TEST_P(TestSuiteName, TestName) {
        +  ... statements ...
        +}
        +
        + +Defines an individual type-parameterized test named *`TestName`* in the +type-parameterized test suite *`TestSuiteName`*. The test suite must be defined +with [`TYPED_TEST_SUITE_P`](#TYPED_TEST_SUITE_P). + +Within the test body, the special name `TypeParam` refers to the type parameter, +and `TestFixture` refers to the fixture class. See [`TYPED_TEST`](#TYPED_TEST) +for an example. + +See also [`REGISTER_TYPED_TEST_SUITE_P`](#REGISTER_TYPED_TEST_SUITE_P) and +[Type-Parameterized Tests](../advanced.md#type-parameterized-tests) for more +information. + +### REGISTER_TYPED_TEST_SUITE_P {#REGISTER_TYPED_TEST_SUITE_P} + +`REGISTER_TYPED_TEST_SUITE_P(`*`TestSuiteName`*`,`*`TestNames...`*`)` + +Registers the type-parameterized tests *`TestNames...`* of the test suite +*`TestSuiteName`*. The test suite and tests must be defined with +[`TYPED_TEST_SUITE_P`](#TYPED_TEST_SUITE_P) and [`TYPED_TEST_P`](#TYPED_TEST_P). + +For example: + +```cpp +// Define the test suite and tests. +TYPED_TEST_SUITE_P(MyFixture); +TYPED_TEST_P(MyFixture, HasPropertyA) { ... } +TYPED_TEST_P(MyFixture, HasPropertyB) { ... } + +// Register the tests in the test suite. +REGISTER_TYPED_TEST_SUITE_P(MyFixture, HasPropertyA, HasPropertyB); +``` + +See also [`INSTANTIATE_TYPED_TEST_SUITE_P`](#INSTANTIATE_TYPED_TEST_SUITE_P) and +[Type-Parameterized Tests](../advanced.md#type-parameterized-tests) for more +information. + +### INSTANTIATE_TYPED_TEST_SUITE_P {#INSTANTIATE_TYPED_TEST_SUITE_P} + +`INSTANTIATE_TYPED_TEST_SUITE_P(`*`InstantiationName`*`,`*`TestSuiteName`*`,`*`Types`*`)` + +Instantiates the type-parameterized test suite *`TestSuiteName`*. The test suite +must be registered with +[`REGISTER_TYPED_TEST_SUITE_P`](#REGISTER_TYPED_TEST_SUITE_P). + +The argument *`InstantiationName`* is a unique name for the instantiation of the +test suite, to distinguish between multiple instantiations. In test output, the +instantiation name is added as a prefix to the test suite name +*`TestSuiteName`*. + +The argument *`Types`* is a [`Types`](#Types) object representing the list of +types to run the tests on, for example: + +```cpp +using MyTypes = ::testing::Types; +INSTANTIATE_TYPED_TEST_SUITE_P(MyInstantiation, MyFixture, MyTypes); +``` + +The type alias (`using` or `typedef`) is necessary for the +`INSTANTIATE_TYPED_TEST_SUITE_P` macro to parse correctly. + +For more information, see +[Type-Parameterized Tests](../advanced.md#type-parameterized-tests). + +### FRIEND_TEST {#FRIEND_TEST} + +`FRIEND_TEST(`*`TestSuiteName`*`,`*`TestName`*`)` + +Within a class body, declares an individual test as a friend of the class, +enabling the test to access private class members. + +If the class is defined in a namespace, then in order to be friends of the +class, test fixtures and tests must be defined in the exact same namespace, +without inline or anonymous namespaces. + +For example, if the class definition looks like the following: + +```cpp +namespace my_namespace { + +class MyClass { + friend class MyClassTest; + FRIEND_TEST(MyClassTest, HasPropertyA); + FRIEND_TEST(MyClassTest, HasPropertyB); + ... definition of class MyClass ... +}; + +} // namespace my_namespace +``` + +Then the test code should look like: + +```cpp +namespace my_namespace { + +class MyClassTest : public testing::Test { + ... +}; + +TEST_F(MyClassTest, HasPropertyA) { ... } +TEST_F(MyClassTest, HasPropertyB) { ... } + +} // namespace my_namespace +``` + +See [Testing Private Code](../advanced.md#testing-private-code) for more +information. + +### SCOPED_TRACE {#SCOPED_TRACE} + +`SCOPED_TRACE(`*`message`*`)` + +Causes the current file name, line number, and the given message *`message`* to +be added to the failure message for each assertion failure that occurs in the +scope. + +For more information, see +[Adding Traces to Assertions](../advanced.md#adding-traces-to-assertions). + +See also the [`ScopedTrace` class](#ScopedTrace). + +### GTEST_SKIP {#GTEST_SKIP} + +`GTEST_SKIP()` + +Prevents further test execution at runtime. + +Can be used in individual test cases or in the `SetUp()` methods of test +environments or test fixtures (classes derived from the +[`Environment`](#Environment) or [`Test`](#Test) classes). If used in a global +test environment `SetUp()` method, it skips all tests in the test program. If +used in a test fixture `SetUp()` method, it skips all tests in the corresponding +test suite. + +Similar to assertions, `GTEST_SKIP` allows streaming a custom message into it. + +See [Skipping Test Execution](../advanced.md#skipping-test-execution) for more +information. + +### GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST {#GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST} + +`GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(`*`TestSuiteName`*`)` + +Allows the value-parameterized test suite *`TestSuiteName`* to be +uninstantiated. + +By default, every [`TEST_P`](#TEST_P) call without a corresponding +[`INSTANTIATE_TEST_SUITE_P`](#INSTANTIATE_TEST_SUITE_P) call causes a failing +test in the test suite `GoogleTestVerification`. +`GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST` suppresses this failure for the +given test suite. + +## Classes and types + +GoogleTest defines the following classes and types to help with writing tests. + +### AssertionResult {#AssertionResult} + +`testing::AssertionResult` + +A class for indicating whether an assertion was successful. + +When the assertion wasn't successful, the `AssertionResult` object stores a +non-empty failure message that can be retrieved with the object's `message()` +method. + +To create an instance of this class, use one of the factory functions +[`AssertionSuccess()`](#AssertionSuccess) or +[`AssertionFailure()`](#AssertionFailure). + +### AssertionException {#AssertionException} + +`testing::AssertionException` + +Exception which can be thrown from +[`TestEventListener::OnTestPartResult`](#TestEventListener::OnTestPartResult). + +### EmptyTestEventListener {#EmptyTestEventListener} + +`testing::EmptyTestEventListener` + +Provides an empty implementation of all methods in the +[`TestEventListener`](#TestEventListener) interface, such that a subclass only +needs to override the methods it cares about. + +### Environment {#Environment} + +`testing::Environment` + +Represents a global test environment. See +[Global Set-Up and Tear-Down](../advanced.md#global-set-up-and-tear-down). + +#### Protected Methods {#Environment-protected} + +##### SetUp {#Environment::SetUp} + +`virtual void Environment::SetUp()` + +Override this to define how to set up the environment. + +##### TearDown {#Environment::TearDown} + +`virtual void Environment::TearDown()` + +Override this to define how to tear down the environment. + +### ScopedTrace {#ScopedTrace} + +`testing::ScopedTrace` + +An instance of this class causes a trace to be included in every test failure +message generated by code in the scope of the lifetime of the `ScopedTrace` +instance. The effect is undone with the destruction of the instance. + +The `ScopedTrace` constructor has the following form: + +```cpp +template +ScopedTrace(const char* file, int line, const T& message) +``` + +Example usage: + +```cpp +testing::ScopedTrace trace("file.cc", 123, "message"); +``` + +The resulting trace includes the given source file path and line number, and the +given message. The `message` argument can be anything streamable to +`std::ostream`. + +See also [`SCOPED_TRACE`](#SCOPED_TRACE). + +### Test {#Test} + +`testing::Test` + +The abstract class that all tests inherit from. `Test` is not copyable. + +#### Public Methods {#Test-public} + +##### SetUpTestSuite {#Test::SetUpTestSuite} + +`static void Test::SetUpTestSuite()` + +Performs shared setup for all tests in the test suite. GoogleTest calls +`SetUpTestSuite()` before running the first test in the test suite. + +##### TearDownTestSuite {#Test::TearDownTestSuite} + +`static void Test::TearDownTestSuite()` + +Performs shared teardown for all tests in the test suite. GoogleTest calls +`TearDownTestSuite()` after running the last test in the test suite. + +##### HasFatalFailure {#Test::HasFatalFailure} + +`static bool Test::HasFatalFailure()` + +Returns true if and only if the current test has a fatal failure. + +##### HasNonfatalFailure {#Test::HasNonfatalFailure} + +`static bool Test::HasNonfatalFailure()` + +Returns true if and only if the current test has a nonfatal failure. + +##### HasFailure {#Test::HasFailure} + +`static bool Test::HasFailure()` + +Returns true if and only if the current test has any failure, either fatal or +nonfatal. + +##### IsSkipped {#Test::IsSkipped} + +`static bool Test::IsSkipped()` + +Returns true if and only if the current test was skipped. + +##### RecordProperty {#Test::RecordProperty} + +`static void Test::RecordProperty(const std::string& key, const std::string& +value)` \ +`static void Test::RecordProperty(const std::string& key, int value)` + +Logs a property for the current test, test suite, or entire invocation of the +test program. Only the last value for a given key is logged. + +The key must be a valid XML attribute name, and cannot conflict with the ones +already used by GoogleTest (`name`, `file`, `line`, `status`, `time`, +`classname`, `type_param`, and `value_param`). + +`RecordProperty` is `public static` so it can be called from utility functions +that are not members of the test fixture. + +Calls to `RecordProperty` made during the lifespan of the test (from the moment +its constructor starts to the moment its destructor finishes) are output in XML +as attributes of the `` element. Properties recorded from a fixture's +`SetUpTestSuite` or `TearDownTestSuite` methods are logged as attributes of the +corresponding `` element. Calls to `RecordProperty` made in the +global context (before or after invocation of `RUN_ALL_TESTS` or from the +`SetUp`/`TearDown` methods of registered `Environment` objects) are output as +attributes of the `` element. + +#### Protected Methods {#Test-protected} + +##### SetUp {#Test::SetUp} + +`virtual void Test::SetUp()` + +Override this to perform test fixture setup. GoogleTest calls `SetUp()` before +running each individual test. + +##### TearDown {#Test::TearDown} + +`virtual void Test::TearDown()` + +Override this to perform test fixture teardown. GoogleTest calls `TearDown()` +after running each individual test. + +### TestWithParam {#TestWithParam} + +`testing::TestWithParam` + +A convenience class which inherits from both [`Test`](#Test) and +[`WithParamInterface`](#WithParamInterface). + +### TestSuite {#TestSuite} + +Represents a test suite. `TestSuite` is not copyable. + +#### Public Methods {#TestSuite-public} + +##### name {#TestSuite::name} + +`const char* TestSuite::name() const` + +Gets the name of the test suite. + +##### type_param {#TestSuite::type_param} + +`const char* TestSuite::type_param() const` + +Returns the name of the parameter type, or `NULL` if this is not a typed or +type-parameterized test suite. See [Typed Tests](../advanced.md#typed-tests) and +[Type-Parameterized Tests](../advanced.md#type-parameterized-tests). + +##### should_run {#TestSuite::should_run} + +`bool TestSuite::should_run() const` + +Returns true if any test in this test suite should run. + +##### successful_test_count {#TestSuite::successful_test_count} + +`int TestSuite::successful_test_count() const` + +Gets the number of successful tests in this test suite. + +##### skipped_test_count {#TestSuite::skipped_test_count} + +`int TestSuite::skipped_test_count() const` + +Gets the number of skipped tests in this test suite. + +##### failed_test_count {#TestSuite::failed_test_count} + +`int TestSuite::failed_test_count() const` + +Gets the number of failed tests in this test suite. + +##### reportable_disabled_test_count {#TestSuite::reportable_disabled_test_count} + +`int TestSuite::reportable_disabled_test_count() const` + +Gets the number of disabled tests that will be reported in the XML report. + +##### disabled_test_count {#TestSuite::disabled_test_count} + +`int TestSuite::disabled_test_count() const` + +Gets the number of disabled tests in this test suite. + +##### reportable_test_count {#TestSuite::reportable_test_count} + +`int TestSuite::reportable_test_count() const` + +Gets the number of tests to be printed in the XML report. + +##### test_to_run_count {#TestSuite::test_to_run_count} + +`int TestSuite::test_to_run_count() const` + +Get the number of tests in this test suite that should run. + +##### total_test_count {#TestSuite::total_test_count} + +`int TestSuite::total_test_count() const` + +Gets the number of all tests in this test suite. + +##### Passed {#TestSuite::Passed} + +`bool TestSuite::Passed() const` + +Returns true if and only if the test suite passed. + +##### Failed {#TestSuite::Failed} + +`bool TestSuite::Failed() const` + +Returns true if and only if the test suite failed. + +##### elapsed_time {#TestSuite::elapsed_time} + +`TimeInMillis TestSuite::elapsed_time() const` + +Returns the elapsed time, in milliseconds. + +##### start_timestamp {#TestSuite::start_timestamp} + +`TimeInMillis TestSuite::start_timestamp() const` + +Gets the time of the test suite start, in ms from the start of the UNIX epoch. + +##### GetTestInfo {#TestSuite::GetTestInfo} + +`const TestInfo* TestSuite::GetTestInfo(int i) const` + +Returns the [`TestInfo`](#TestInfo) for the `i`-th test among all the tests. `i` +can range from 0 to `total_test_count() - 1`. If `i` is not in that range, +returns `NULL`. + +##### ad_hoc_test_result {#TestSuite::ad_hoc_test_result} + +`const TestResult& TestSuite::ad_hoc_test_result() const` + +Returns the [`TestResult`](#TestResult) that holds test properties recorded +during execution of `SetUpTestSuite` and `TearDownTestSuite`. + +### TestInfo {#TestInfo} + +`testing::TestInfo` + +Stores information about a test. + +#### Public Methods {#TestInfo-public} + +##### test_suite_name {#TestInfo::test_suite_name} + +`const char* TestInfo::test_suite_name() const` + +Returns the test suite name. + +##### name {#TestInfo::name} + +`const char* TestInfo::name() const` + +Returns the test name. + +##### type_param {#TestInfo::type_param} + +`const char* TestInfo::type_param() const` + +Returns the name of the parameter type, or `NULL` if this is not a typed or +type-parameterized test. See [Typed Tests](../advanced.md#typed-tests) and +[Type-Parameterized Tests](../advanced.md#type-parameterized-tests). + +##### value_param {#TestInfo::value_param} + +`const char* TestInfo::value_param() const` + +Returns the text representation of the value parameter, or `NULL` if this is not +a value-parameterized test. See +[Value-Parameterized Tests](../advanced.md#value-parameterized-tests). + +##### file {#TestInfo::file} + +`const char* TestInfo::file() const` + +Returns the file name where this test is defined. + +##### line {#TestInfo::line} + +`int TestInfo::line() const` + +Returns the line where this test is defined. + +##### is_in_another_shard {#TestInfo::is_in_another_shard} + +`bool TestInfo::is_in_another_shard() const` + +Returns true if this test should not be run because it's in another shard. + +##### should_run {#TestInfo::should_run} + +`bool TestInfo::should_run() const` + +Returns true if this test should run, that is if the test is not disabled (or it +is disabled but the `also_run_disabled_tests` flag has been specified) and its +full name matches the user-specified filter. + +GoogleTest allows the user to filter the tests by their full names. Only the +tests that match the filter will run. See +[Running a Subset of the Tests](../advanced.md#running-a-subset-of-the-tests) +for more information. + +##### is_reportable {#TestInfo::is_reportable} + +`bool TestInfo::is_reportable() const` + +Returns true if and only if this test will appear in the XML report. + +##### result {#TestInfo::result} + +`const TestResult* TestInfo::result() const` + +Returns the result of the test. See [`TestResult`](#TestResult). + +### TestParamInfo {#TestParamInfo} + +`testing::TestParamInfo` + +Describes a parameter to a value-parameterized test. The type `T` is the type of +the parameter. + +Contains the fields `param` and `index` which hold the value of the parameter +and its integer index respectively. + +### UnitTest {#UnitTest} + +`testing::UnitTest` + +This class contains information about the test program. + +`UnitTest` is a singleton class. The only instance is created when +`UnitTest::GetInstance()` is first called. This instance is never deleted. + +`UnitTest` is not copyable. + +#### Public Methods {#UnitTest-public} + +##### GetInstance {#UnitTest::GetInstance} + +`static UnitTest* UnitTest::GetInstance()` + +Gets the singleton `UnitTest` object. The first time this method is called, a +`UnitTest` object is constructed and returned. Consecutive calls will return the +same object. + +##### original_working_dir {#UnitTest::original_working_dir} + +`const char* UnitTest::original_working_dir() const` + +Returns the working directory when the first [`TEST()`](#TEST) or +[`TEST_F()`](#TEST_F) was executed. The `UnitTest` object owns the string. + +##### current_test_suite {#UnitTest::current_test_suite} + +`const TestSuite* UnitTest::current_test_suite() const` + +Returns the [`TestSuite`](#TestSuite) object for the test that's currently +running, or `NULL` if no test is running. + +##### current_test_info {#UnitTest::current_test_info} + +`const TestInfo* UnitTest::current_test_info() const` + +Returns the [`TestInfo`](#TestInfo) object for the test that's currently +running, or `NULL` if no test is running. + +##### random_seed {#UnitTest::random_seed} + +`int UnitTest::random_seed() const` + +Returns the random seed used at the start of the current test run. + +##### successful_test_suite_count {#UnitTest::successful_test_suite_count} + +`int UnitTest::successful_test_suite_count() const` + +Gets the number of successful test suites. + +##### failed_test_suite_count {#UnitTest::failed_test_suite_count} + +`int UnitTest::failed_test_suite_count() const` + +Gets the number of failed test suites. + +##### total_test_suite_count {#UnitTest::total_test_suite_count} + +`int UnitTest::total_test_suite_count() const` + +Gets the number of all test suites. + +##### test_suite_to_run_count {#UnitTest::test_suite_to_run_count} + +`int UnitTest::test_suite_to_run_count() const` + +Gets the number of all test suites that contain at least one test that should +run. + +##### successful_test_count {#UnitTest::successful_test_count} + +`int UnitTest::successful_test_count() const` + +Gets the number of successful tests. + +##### skipped_test_count {#UnitTest::skipped_test_count} + +`int UnitTest::skipped_test_count() const` + +Gets the number of skipped tests. + +##### failed_test_count {#UnitTest::failed_test_count} + +`int UnitTest::failed_test_count() const` + +Gets the number of failed tests. + +##### reportable_disabled_test_count {#UnitTest::reportable_disabled_test_count} + +`int UnitTest::reportable_disabled_test_count() const` + +Gets the number of disabled tests that will be reported in the XML report. + +##### disabled_test_count {#UnitTest::disabled_test_count} + +`int UnitTest::disabled_test_count() const` + +Gets the number of disabled tests. + +##### reportable_test_count {#UnitTest::reportable_test_count} + +`int UnitTest::reportable_test_count() const` + +Gets the number of tests to be printed in the XML report. + +##### total_test_count {#UnitTest::total_test_count} + +`int UnitTest::total_test_count() const` + +Gets the number of all tests. + +##### test_to_run_count {#UnitTest::test_to_run_count} + +`int UnitTest::test_to_run_count() const` + +Gets the number of tests that should run. + +##### start_timestamp {#UnitTest::start_timestamp} + +`TimeInMillis UnitTest::start_timestamp() const` + +Gets the time of the test program start, in ms from the start of the UNIX epoch. + +##### elapsed_time {#UnitTest::elapsed_time} + +`TimeInMillis UnitTest::elapsed_time() const` + +Gets the elapsed time, in milliseconds. + +##### Passed {#UnitTest::Passed} + +`bool UnitTest::Passed() const` + +Returns true if and only if the unit test passed (i.e. all test suites passed). + +##### Failed {#UnitTest::Failed} + +`bool UnitTest::Failed() const` + +Returns true if and only if the unit test failed (i.e. some test suite failed or +something outside of all tests failed). + +##### GetTestSuite {#UnitTest::GetTestSuite} + +`const TestSuite* UnitTest::GetTestSuite(int i) const` + +Gets the [`TestSuite`](#TestSuite) object for the `i`-th test suite among all +the test suites. `i` can range from 0 to `total_test_suite_count() - 1`. If `i` +is not in that range, returns `NULL`. + +##### ad_hoc_test_result {#UnitTest::ad_hoc_test_result} + +`const TestResult& UnitTest::ad_hoc_test_result() const` + +Returns the [`TestResult`](#TestResult) containing information on test failures +and properties logged outside of individual test suites. + +##### listeners {#UnitTest::listeners} + +`TestEventListeners& UnitTest::listeners()` + +Returns the list of event listeners that can be used to track events inside +GoogleTest. See [`TestEventListeners`](#TestEventListeners). + +### TestEventListener {#TestEventListener} + +`testing::TestEventListener` + +The interface for tracing execution of tests. The methods below are listed in +the order the corresponding events are fired. + +#### Public Methods {#TestEventListener-public} + +##### OnTestProgramStart {#TestEventListener::OnTestProgramStart} + +`virtual void TestEventListener::OnTestProgramStart(const UnitTest& unit_test)` + +Fired before any test activity starts. + +##### OnTestIterationStart {#TestEventListener::OnTestIterationStart} + +`virtual void TestEventListener::OnTestIterationStart(const UnitTest& unit_test, +int iteration)` + +Fired before each iteration of tests starts. There may be more than one +iteration if `GTEST_FLAG(repeat)` is set. `iteration` is the iteration index, +starting from 0. + +##### OnEnvironmentsSetUpStart {#TestEventListener::OnEnvironmentsSetUpStart} + +`virtual void TestEventListener::OnEnvironmentsSetUpStart(const UnitTest& +unit_test)` + +Fired before environment set-up for each iteration of tests starts. + +##### OnEnvironmentsSetUpEnd {#TestEventListener::OnEnvironmentsSetUpEnd} + +`virtual void TestEventListener::OnEnvironmentsSetUpEnd(const UnitTest& +unit_test)` + +Fired after environment set-up for each iteration of tests ends. + +##### OnTestSuiteStart {#TestEventListener::OnTestSuiteStart} + +`virtual void TestEventListener::OnTestSuiteStart(const TestSuite& test_suite)` + +Fired before the test suite starts. + +##### OnTestStart {#TestEventListener::OnTestStart} + +`virtual void TestEventListener::OnTestStart(const TestInfo& test_info)` + +Fired before the test starts. + +##### OnTestPartResult {#TestEventListener::OnTestPartResult} + +`virtual void TestEventListener::OnTestPartResult(const TestPartResult& +test_part_result)` + +Fired after a failed assertion or a `SUCCEED()` invocation. If you want to throw +an exception from this function to skip to the next test, it must be an +[`AssertionException`](#AssertionException) or inherited from it. + +##### OnTestEnd {#TestEventListener::OnTestEnd} + +`virtual void TestEventListener::OnTestEnd(const TestInfo& test_info)` + +Fired after the test ends. + +##### OnTestSuiteEnd {#TestEventListener::OnTestSuiteEnd} + +`virtual void TestEventListener::OnTestSuiteEnd(const TestSuite& test_suite)` + +Fired after the test suite ends. + +##### OnEnvironmentsTearDownStart {#TestEventListener::OnEnvironmentsTearDownStart} + +`virtual void TestEventListener::OnEnvironmentsTearDownStart(const UnitTest& +unit_test)` + +Fired before environment tear-down for each iteration of tests starts. + +##### OnEnvironmentsTearDownEnd {#TestEventListener::OnEnvironmentsTearDownEnd} + +`virtual void TestEventListener::OnEnvironmentsTearDownEnd(const UnitTest& +unit_test)` + +Fired after environment tear-down for each iteration of tests ends. + +##### OnTestIterationEnd {#TestEventListener::OnTestIterationEnd} + +`virtual void TestEventListener::OnTestIterationEnd(const UnitTest& unit_test, +int iteration)` + +Fired after each iteration of tests finishes. + +##### OnTestProgramEnd {#TestEventListener::OnTestProgramEnd} + +`virtual void TestEventListener::OnTestProgramEnd(const UnitTest& unit_test)` + +Fired after all test activities have ended. + +### TestEventListeners {#TestEventListeners} + +`testing::TestEventListeners` + +Lets users add listeners to track events in GoogleTest. + +#### Public Methods {#TestEventListeners-public} + +##### Append {#TestEventListeners::Append} + +`void TestEventListeners::Append(TestEventListener* listener)` + +Appends an event listener to the end of the list. GoogleTest assumes ownership +of the listener (i.e. it will delete the listener when the test program +finishes). + +##### Release {#TestEventListeners::Release} + +`TestEventListener* TestEventListeners::Release(TestEventListener* listener)` + +Removes the given event listener from the list and returns it. It then becomes +the caller's responsibility to delete the listener. Returns `NULL` if the +listener is not found in the list. + +##### default_result_printer {#TestEventListeners::default_result_printer} + +`TestEventListener* TestEventListeners::default_result_printer() const` + +Returns the standard listener responsible for the default console output. Can be +removed from the listeners list to shut down default console output. Note that +removing this object from the listener list with +[`Release()`](#TestEventListeners::Release) transfers its ownership to the +caller and makes this function return `NULL` the next time. + +##### default_xml_generator {#TestEventListeners::default_xml_generator} + +`TestEventListener* TestEventListeners::default_xml_generator() const` + +Returns the standard listener responsible for the default XML output controlled +by the `--gtest_output=xml` flag. Can be removed from the listeners list by +users who want to shut down the default XML output controlled by this flag and +substitute it with custom one. Note that removing this object from the listener +list with [`Release()`](#TestEventListeners::Release) transfers its ownership to +the caller and makes this function return `NULL` the next time. + +### TestPartResult {#TestPartResult} + +`testing::TestPartResult` + +A copyable object representing the result of a test part (i.e. an assertion or +an explicit `FAIL()`, `ADD_FAILURE()`, or `SUCCESS()`). + +#### Public Methods {#TestPartResult-public} + +##### type {#TestPartResult::type} + +`Type TestPartResult::type() const` + +Gets the outcome of the test part. + +The return type `Type` is an enum defined as follows: + +```cpp +enum Type { + kSuccess, // Succeeded. + kNonFatalFailure, // Failed but the test can continue. + kFatalFailure, // Failed and the test should be terminated. + kSkip // Skipped. +}; +``` + +##### file_name {#TestPartResult::file_name} + +`const char* TestPartResult::file_name() const` + +Gets the name of the source file where the test part took place, or `NULL` if +it's unknown. + +##### line_number {#TestPartResult::line_number} + +`int TestPartResult::line_number() const` + +Gets the line in the source file where the test part took place, or `-1` if it's +unknown. + +##### summary {#TestPartResult::summary} + +`const char* TestPartResult::summary() const` + +Gets the summary of the failure message. + +##### message {#TestPartResult::message} + +`const char* TestPartResult::message() const` + +Gets the message associated with the test part. + +##### skipped {#TestPartResult::skipped} + +`bool TestPartResult::skipped() const` + +Returns true if and only if the test part was skipped. + +##### passed {#TestPartResult::passed} + +`bool TestPartResult::passed() const` + +Returns true if and only if the test part passed. + +##### nonfatally_failed {#TestPartResult::nonfatally_failed} + +`bool TestPartResult::nonfatally_failed() const` + +Returns true if and only if the test part non-fatally failed. + +##### fatally_failed {#TestPartResult::fatally_failed} + +`bool TestPartResult::fatally_failed() const` + +Returns true if and only if the test part fatally failed. + +##### failed {#TestPartResult::failed} + +`bool TestPartResult::failed() const` + +Returns true if and only if the test part failed. + +### TestProperty {#TestProperty} + +`testing::TestProperty` + +A copyable object representing a user-specified test property which can be +output as a key/value string pair. + +#### Public Methods {#TestProperty-public} + +##### key {#key} + +`const char* key() const` + +Gets the user-supplied key. + +##### value {#value} + +`const char* value() const` + +Gets the user-supplied value. + +##### SetValue {#SetValue} + +`void SetValue(const std::string& new_value)` + +Sets a new value, overriding the previous one. + +### TestResult {#TestResult} + +`testing::TestResult` + +Contains information about the result of a single test. + +`TestResult` is not copyable. + +#### Public Methods {#TestResult-public} + +##### total_part_count {#TestResult::total_part_count} + +`int TestResult::total_part_count() const` + +Gets the number of all test parts. This is the sum of the number of successful +test parts and the number of failed test parts. + +##### test_property_count {#TestResult::test_property_count} + +`int TestResult::test_property_count() const` + +Returns the number of test properties. + +##### Passed {#TestResult::Passed} + +`bool TestResult::Passed() const` + +Returns true if and only if the test passed (i.e. no test part failed). + +##### Skipped {#TestResult::Skipped} + +`bool TestResult::Skipped() const` + +Returns true if and only if the test was skipped. + +##### Failed {#TestResult::Failed} + +`bool TestResult::Failed() const` + +Returns true if and only if the test failed. + +##### HasFatalFailure {#TestResult::HasFatalFailure} + +`bool TestResult::HasFatalFailure() const` + +Returns true if and only if the test fatally failed. + +##### HasNonfatalFailure {#TestResult::HasNonfatalFailure} + +`bool TestResult::HasNonfatalFailure() const` + +Returns true if and only if the test has a non-fatal failure. + +##### elapsed_time {#TestResult::elapsed_time} + +`TimeInMillis TestResult::elapsed_time() const` + +Returns the elapsed time, in milliseconds. + +##### start_timestamp {#TestResult::start_timestamp} + +`TimeInMillis TestResult::start_timestamp() const` + +Gets the time of the test case start, in ms from the start of the UNIX epoch. + +##### GetTestPartResult {#TestResult::GetTestPartResult} + +`const TestPartResult& TestResult::GetTestPartResult(int i) const` + +Returns the [`TestPartResult`](#TestPartResult) for the `i`-th test part result +among all the results. `i` can range from 0 to `total_part_count() - 1`. If `i` +is not in that range, aborts the program. + +##### GetTestProperty {#TestResult::GetTestProperty} + +`const TestProperty& TestResult::GetTestProperty(int i) const` + +Returns the [`TestProperty`](#TestProperty) object for the `i`-th test property. +`i` can range from 0 to `test_property_count() - 1`. If `i` is not in that +range, aborts the program. + +### TimeInMillis {#TimeInMillis} + +`testing::TimeInMillis` + +An integer type representing time in milliseconds. + +### Types {#Types} + +`testing::Types` + +Represents a list of types for use in typed tests and type-parameterized tests. + +The template argument `T...` can be any number of types, for example: + +``` +testing::Types +``` + +See [Typed Tests](../advanced.md#typed-tests) and +[Type-Parameterized Tests](../advanced.md#type-parameterized-tests) for more +information. + +### WithParamInterface {#WithParamInterface} + +`testing::WithParamInterface` + +The pure interface class that all value-parameterized tests inherit from. + +A value-parameterized test fixture class must inherit from both [`Test`](#Test) +and `WithParamInterface`. In most cases that just means inheriting from +[`TestWithParam`](#TestWithParam), but more complicated test hierarchies may +need to inherit from `Test` and `WithParamInterface` at different levels. + +This interface defines the type alias `ParamType` for the parameter type `T` and +has support for accessing the test parameter value via the `GetParam()` method: + +``` +static const ParamType& GetParam() +``` + +For more information, see +[Value-Parameterized Tests](../advanced.md#value-parameterized-tests). + +## Functions + +GoogleTest defines the following functions to help with writing and running +tests. + +### InitGoogleTest {#InitGoogleTest} + +`void testing::InitGoogleTest(int* argc, char** argv)` \ +`void testing::InitGoogleTest(int* argc, wchar_t** argv)` \ +`void testing::InitGoogleTest()` + +Initializes GoogleTest. This must be called before calling +[`RUN_ALL_TESTS()`](#RUN_ALL_TESTS). In particular, it parses the command line +for the flags that GoogleTest recognizes. Whenever a GoogleTest flag is seen, it +is removed from `argv`, and `*argc` is decremented. + +No value is returned. Instead, the GoogleTest flag variables are updated. + +The `InitGoogleTest(int* argc, wchar_t** argv)` overload can be used in Windows +programs compiled in `UNICODE` mode. + +The argument-less `InitGoogleTest()` overload can be used on Arduino/embedded +platforms where there is no `argc`/`argv`. + +### AddGlobalTestEnvironment {#AddGlobalTestEnvironment} + +`Environment* testing::AddGlobalTestEnvironment(Environment* env)` + +Adds a test environment to the test program. Must be called before +[`RUN_ALL_TESTS()`](#RUN_ALL_TESTS) is called. See +[Global Set-Up and Tear-Down](../advanced.md#global-set-up-and-tear-down) for +more information. + +See also [`Environment`](#Environment). + +### RegisterTest {#RegisterTest} + +```cpp +template +TestInfo* testing::RegisterTest(const char* test_suite_name, const char* test_name, + const char* type_param, const char* value_param, + const char* file, int line, Factory factory) +``` + +Dynamically registers a test with the framework. + +The `factory` argument is a factory callable (move-constructible) object or +function pointer that creates a new instance of the `Test` object. It handles +ownership to the caller. The signature of the callable is `Fixture*()`, where +`Fixture` is the test fixture class for the test. All tests registered with the +same `test_suite_name` must return the same fixture type. This is checked at +runtime. + +The framework will infer the fixture class from the factory and will call the +`SetUpTestSuite` and `TearDownTestSuite` methods for it. + +Must be called before [`RUN_ALL_TESTS()`](#RUN_ALL_TESTS) is invoked, otherwise +behavior is undefined. + +See +[Registering tests programmatically](../advanced.md#registering-tests-programmatically) +for more information. + +### RUN_ALL_TESTS {#RUN_ALL_TESTS} + +`int RUN_ALL_TESTS()` + +Use this function in `main()` to run all tests. It returns `0` if all tests are +successful, or `1` otherwise. + +`RUN_ALL_TESTS()` should be invoked after the command line has been parsed by +[`InitGoogleTest()`](#InitGoogleTest). + +This function was formerly a macro; thus, it is in the global namespace and has +an all-caps name. + +### AssertionSuccess {#AssertionSuccess} + +`AssertionResult testing::AssertionSuccess()` + +Creates a successful assertion result. See +[`AssertionResult`](#AssertionResult). + +### AssertionFailure {#AssertionFailure} + +`AssertionResult testing::AssertionFailure()` + +Creates a failed assertion result. Use the `<<` operator to store a failure +message: + +```cpp +testing::AssertionFailure() << "My failure message"; +``` + +See [`AssertionResult`](#AssertionResult). + +### StaticAssertTypeEq {#StaticAssertTypeEq} + +`testing::StaticAssertTypeEq()` + +Compile-time assertion for type equality. Compiles if and only if `T1` and `T2` +are the same type. The value it returns is irrelevant. + +See [Type Assertions](../advanced.md#type-assertions) for more information. + +### PrintToString {#PrintToString} + +`std::string testing::PrintToString(x)` + +Prints any value `x` using GoogleTest's value printer. + +See +[Teaching GoogleTest How to Print Your Values](../advanced.md#teaching-googletest-how-to-print-your-values) +for more information. + +### PrintToStringParamName {#PrintToStringParamName} + +`std::string testing::PrintToStringParamName(TestParamInfo& info)` + +A built-in parameterized test name generator which returns the result of +[`PrintToString`](#PrintToString) called on `info.param`. Does not work when the +test parameter is a `std::string` or C string. See +[Specifying Names for Value-Parameterized Test Parameters](../advanced.md#specifying-names-for-value-parameterized-test-parameters) +for more information. + +See also [`TestParamInfo`](#TestParamInfo) and +[`INSTANTIATE_TEST_SUITE_P`](#INSTANTIATE_TEST_SUITE_P). diff --git a/vendor/googletest-1.14.0/docs/samples.md b/vendor/googletest-1.14.0/docs/samples.md new file mode 100644 index 00000000..dedc5909 --- /dev/null +++ b/vendor/googletest-1.14.0/docs/samples.md @@ -0,0 +1,22 @@ +# Googletest Samples + +If you're like us, you'd like to look at +[googletest samples.](https://github.com/google/googletest/blob/main/googletest/samples) +The sample directory has a number of well-commented samples showing how to use a +variety of googletest features. + +* Sample #1 shows the basic steps of using googletest to test C++ functions. +* Sample #2 shows a more complex unit test for a class with multiple member + functions. +* Sample #3 uses a test fixture. +* Sample #4 teaches you how to use googletest and `googletest.h` together to + get the best of both libraries. +* Sample #5 puts shared testing logic in a base test fixture, and reuses it in + derived fixtures. +* Sample #6 demonstrates type-parameterized tests. +* Sample #7 teaches the basics of value-parameterized tests. +* Sample #8 shows using `Combine()` in value-parameterized tests. +* Sample #9 shows use of the listener API to modify Google Test's console + output and the use of its reflection API to inspect test results. +* Sample #10 shows use of the listener API to implement a primitive memory + leak checker. diff --git a/vendor/googletest-1.14.0/googlemock/CMakeLists.txt b/vendor/googletest-1.14.0/googlemock/CMakeLists.txt new file mode 100644 index 00000000..a9aa0723 --- /dev/null +++ b/vendor/googletest-1.14.0/googlemock/CMakeLists.txt @@ -0,0 +1,209 @@ +######################################################################## +# Note: CMake support is community-based. The maintainers do not use CMake +# internally. +# +# CMake build script for Google Mock. +# +# To run the tests for Google Mock itself on Linux, use 'make test' or +# ctest. You can select which tests to run using 'ctest -R regex'. +# For more options, run 'ctest --help'. + +option(gmock_build_tests "Build all of Google Mock's own tests." OFF) + +# A directory to find Google Test sources. +if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/gtest/CMakeLists.txt") + set(gtest_dir gtest) +else() + set(gtest_dir ../googletest) +endif() + +# Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build(). +include("${gtest_dir}/cmake/hermetic_build.cmake" OPTIONAL) + +if (COMMAND pre_project_set_up_hermetic_build) + # Google Test also calls hermetic setup functions from add_subdirectory, + # although its changes will not affect things at the current scope. + pre_project_set_up_hermetic_build() +endif() + +######################################################################## +# +# Project-wide settings + +# Name of the project. +# +# CMake files in this project can refer to the root source directory +# as ${gmock_SOURCE_DIR} and to the root binary directory as +# ${gmock_BINARY_DIR}. +# Language "C" is required for find_package(Threads). +cmake_minimum_required(VERSION 3.13) +project(gmock VERSION ${GOOGLETEST_VERSION} LANGUAGES CXX C) + +if (COMMAND set_up_hermetic_build) + set_up_hermetic_build() +endif() + +# Instructs CMake to process Google Test's CMakeLists.txt and add its +# targets to the current scope. We are placing Google Test's binary +# directory in a subdirectory of our own as VC compilation may break +# if they are the same (the default). +add_subdirectory("${gtest_dir}" "${gmock_BINARY_DIR}/${gtest_dir}") + + +# These commands only run if this is the main project +if(CMAKE_PROJECT_NAME STREQUAL "gmock" OR CMAKE_PROJECT_NAME STREQUAL "googletest-distribution") + # BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to + # make it prominent in the GUI. + option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF) +else() + mark_as_advanced(gmock_build_tests) +endif() + +# Although Google Test's CMakeLists.txt calls this function, the +# changes there don't affect the current scope. Therefore we have to +# call it again here. +config_compiler_and_linker() # from ${gtest_dir}/cmake/internal_utils.cmake + +# Adds Google Mock's and Google Test's header directories to the search path. +set(gmock_build_include_dirs + "${gmock_SOURCE_DIR}/include" + "${gmock_SOURCE_DIR}" + "${gtest_SOURCE_DIR}/include" + # This directory is needed to build directly from Google Test sources. + "${gtest_SOURCE_DIR}") +include_directories(${gmock_build_include_dirs}) + +######################################################################## +# +# Defines the gmock & gmock_main libraries. User tests should link +# with one of them. + +# Google Mock libraries. We build them using more strict warnings than what +# are used for other targets, to ensure that Google Mock can be compiled by +# a user aggressive about warnings. +if (MSVC) + cxx_library(gmock + "${cxx_strict}" + "${gtest_dir}/src/gtest-all.cc" + src/gmock-all.cc) + + cxx_library(gmock_main + "${cxx_strict}" + "${gtest_dir}/src/gtest-all.cc" + src/gmock-all.cc + src/gmock_main.cc) +else() + cxx_library(gmock "${cxx_strict}" src/gmock-all.cc) + target_link_libraries(gmock PUBLIC gtest) + set_target_properties(gmock PROPERTIES VERSION ${GOOGLETEST_VERSION}) + cxx_library(gmock_main "${cxx_strict}" src/gmock_main.cc) + target_link_libraries(gmock_main PUBLIC gmock) + set_target_properties(gmock_main PROPERTIES VERSION ${GOOGLETEST_VERSION}) +endif() + +string(REPLACE ";" "$" dirs "${gmock_build_include_dirs}") +target_include_directories(gmock SYSTEM INTERFACE + "$" + "$/${CMAKE_INSTALL_INCLUDEDIR}>") +target_include_directories(gmock_main SYSTEM INTERFACE + "$" + "$/${CMAKE_INSTALL_INCLUDEDIR}>") + +######################################################################## +# +# Install rules +install_project(gmock gmock_main) + +######################################################################## +# +# Google Mock's own tests. +# +# You can skip this section if you aren't interested in testing +# Google Mock itself. +# +# The tests are not built by default. To build them, set the +# gmock_build_tests option to ON. You can do it by running ccmake +# or specifying the -Dgmock_build_tests=ON flag when running cmake. + +if (gmock_build_tests) + # This must be set in the root directory for the tests to be run by + # 'make test' or ctest. + enable_testing() + + if (MINGW OR CYGWIN) + add_compile_options("-Wa,-mbig-obj") + endif() + + ############################################################ + # C++ tests built with standard compiler flags. + + cxx_test(gmock-actions_test gmock_main) + cxx_test(gmock-cardinalities_test gmock_main) + cxx_test(gmock_ex_test gmock_main) + cxx_test(gmock-function-mocker_test gmock_main) + cxx_test(gmock-internal-utils_test gmock_main) + cxx_test(gmock-matchers-arithmetic_test gmock_main) + cxx_test(gmock-matchers-comparisons_test gmock_main) + cxx_test(gmock-matchers-containers_test gmock_main) + cxx_test(gmock-matchers-misc_test gmock_main) + cxx_test(gmock-more-actions_test gmock_main) + cxx_test(gmock-nice-strict_test gmock_main) + cxx_test(gmock-port_test gmock_main) + cxx_test(gmock-spec-builders_test gmock_main) + cxx_test(gmock_link_test gmock_main test/gmock_link2_test.cc) + cxx_test(gmock_test gmock_main) + + if (DEFINED GTEST_HAS_PTHREAD) + cxx_test(gmock_stress_test gmock) + endif() + + # gmock_all_test is commented to save time building and running tests. + # Uncomment if necessary. + # cxx_test(gmock_all_test gmock_main) + + ############################################################ + # C++ tests built with non-standard compiler flags. + + if (MSVC) + cxx_library(gmock_main_no_exception "${cxx_no_exception}" + "${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc) + + cxx_library(gmock_main_no_rtti "${cxx_no_rtti}" + "${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc) + + else() + cxx_library(gmock_main_no_exception "${cxx_no_exception}" src/gmock_main.cc) + target_link_libraries(gmock_main_no_exception PUBLIC gmock) + + cxx_library(gmock_main_no_rtti "${cxx_no_rtti}" src/gmock_main.cc) + target_link_libraries(gmock_main_no_rtti PUBLIC gmock) + endif() + cxx_test_with_flags(gmock-more-actions_no_exception_test "${cxx_no_exception}" + gmock_main_no_exception test/gmock-more-actions_test.cc) + + cxx_test_with_flags(gmock_no_rtti_test "${cxx_no_rtti}" + gmock_main_no_rtti test/gmock-spec-builders_test.cc) + + cxx_shared_library(shared_gmock_main "${cxx_default}" + "${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc) + + # Tests that a binary can be built with Google Mock as a shared library. On + # some system configurations, it may not possible to run the binary without + # knowing more details about the system configurations. We do not try to run + # this binary. To get a more robust shared library coverage, configure with + # -DBUILD_SHARED_LIBS=ON. + cxx_executable_with_flags(shared_gmock_test_ "${cxx_default}" + shared_gmock_main test/gmock-spec-builders_test.cc) + set_target_properties(shared_gmock_test_ + PROPERTIES + COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1") + + ############################################################ + # Python tests. + + cxx_executable(gmock_leak_test_ test gmock_main) + py_test(gmock_leak_test) + + cxx_executable(gmock_output_test_ test gmock) + py_test(gmock_output_test) +endif() diff --git a/vendor/googletest-1.14.0/googlemock/README.md b/vendor/googletest-1.14.0/googlemock/README.md new file mode 100644 index 00000000..7da60655 --- /dev/null +++ b/vendor/googletest-1.14.0/googlemock/README.md @@ -0,0 +1,40 @@ +# Googletest Mocking (gMock) Framework + +### Overview + +Google's framework for writing and using C++ mock classes. It can help you +derive better designs of your system and write better tests. + +It is inspired by: + +* [jMock](http://www.jmock.org/) +* [EasyMock](http://www.easymock.org/) +* [Hamcrest](http://code.google.com/p/hamcrest/) + +It is designed with C++'s specifics in mind. + +gMock: + +- Provides a declarative syntax for defining mocks. +- Can define partial (hybrid) mocks, which are a cross of real and mock + objects. +- Handles functions of arbitrary types and overloaded functions. +- Comes with a rich set of matchers for validating function arguments. +- Uses an intuitive syntax for controlling the behavior of a mock. +- Does automatic verification of expectations (no record-and-replay needed). +- Allows arbitrary (partial) ordering constraints on function calls to be + expressed. +- Lets a user extend it by defining new matchers and actions. +- Does not use exceptions. +- Is easy to learn and use. + +Details and examples can be found here: + +* [gMock for Dummies](https://google.github.io/googletest/gmock_for_dummies.html) +* [Legacy gMock FAQ](https://google.github.io/googletest/gmock_faq.html) +* [gMock Cookbook](https://google.github.io/googletest/gmock_cook_book.html) +* [gMock Cheat Sheet](https://google.github.io/googletest/gmock_cheat_sheet.html) + +GoogleMock is a part of +[GoogleTest C++ testing framework](http://github.com/google/googletest/) and a +subject to the same requirements. diff --git a/vendor/googletest-1.14.0/googlemock/cmake/gmock.pc.in b/vendor/googletest-1.14.0/googlemock/cmake/gmock.pc.in new file mode 100644 index 00000000..23c67b5c --- /dev/null +++ b/vendor/googletest-1.14.0/googlemock/cmake/gmock.pc.in @@ -0,0 +1,10 @@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ + +Name: gmock +Description: GoogleMock (without main() function) +Version: @PROJECT_VERSION@ +URL: https://github.com/google/googletest +Requires: gtest = @PROJECT_VERSION@ +Libs: -L${libdir} -lgmock @CMAKE_THREAD_LIBS_INIT@ +Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ diff --git a/vendor/googletest-1.14.0/googlemock/cmake/gmock_main.pc.in b/vendor/googletest-1.14.0/googlemock/cmake/gmock_main.pc.in new file mode 100644 index 00000000..66ffea7f --- /dev/null +++ b/vendor/googletest-1.14.0/googlemock/cmake/gmock_main.pc.in @@ -0,0 +1,10 @@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ + +Name: gmock_main +Description: GoogleMock (with main() function) +Version: @PROJECT_VERSION@ +URL: https://github.com/google/googletest +Requires: gmock = @PROJECT_VERSION@ +Libs: -L${libdir} -lgmock_main @CMAKE_THREAD_LIBS_INIT@ +Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ diff --git a/vendor/googletest-1.14.0/googlemock/docs/README.md b/vendor/googletest-1.14.0/googlemock/docs/README.md new file mode 100644 index 00000000..1bc57b79 --- /dev/null +++ b/vendor/googletest-1.14.0/googlemock/docs/README.md @@ -0,0 +1,4 @@ +# Content Moved + +We are working on updates to the GoogleTest documentation, which has moved to +the top-level [docs](../../docs) directory. diff --git a/vendor/googletest-1.14.0/googlemock/include/gmock/gmock-actions.h b/vendor/googletest-1.14.0/googlemock/include/gmock/gmock-actions.h new file mode 100644 index 00000000..bd9ba73e --- /dev/null +++ b/vendor/googletest-1.14.0/googlemock/include/gmock/gmock-actions.h @@ -0,0 +1,2297 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Google Mock - a framework for writing C++ mock classes. +// +// The ACTION* family of macros can be used in a namespace scope to +// define custom actions easily. The syntax: +// +// ACTION(name) { statements; } +// +// will define an action with the given name that executes the +// statements. The value returned by the statements will be used as +// the return value of the action. Inside the statements, you can +// refer to the K-th (0-based) argument of the mock function by +// 'argK', and refer to its type by 'argK_type'. For example: +// +// ACTION(IncrementArg1) { +// arg1_type temp = arg1; +// return ++(*temp); +// } +// +// allows you to write +// +// ...WillOnce(IncrementArg1()); +// +// You can also refer to the entire argument tuple and its type by +// 'args' and 'args_type', and refer to the mock function type and its +// return type by 'function_type' and 'return_type'. +// +// Note that you don't need to specify the types of the mock function +// arguments. However rest assured that your code is still type-safe: +// you'll get a compiler error if *arg1 doesn't support the ++ +// operator, or if the type of ++(*arg1) isn't compatible with the +// mock function's return type, for example. +// +// Sometimes you'll want to parameterize the action. For that you can use +// another macro: +// +// ACTION_P(name, param_name) { statements; } +// +// For example: +// +// ACTION_P(Add, n) { return arg0 + n; } +// +// will allow you to write: +// +// ...WillOnce(Add(5)); +// +// Note that you don't need to provide the type of the parameter +// either. If you need to reference the type of a parameter named +// 'foo', you can write 'foo_type'. For example, in the body of +// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type +// of 'n'. +// +// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support +// multi-parameter actions. +// +// For the purpose of typing, you can view +// +// ACTION_Pk(Foo, p1, ..., pk) { ... } +// +// as shorthand for +// +// template +// FooActionPk Foo(p1_type p1, ..., pk_type pk) { ... } +// +// In particular, you can provide the template type arguments +// explicitly when invoking Foo(), as in Foo(5, false); +// although usually you can rely on the compiler to infer the types +// for you automatically. You can assign the result of expression +// Foo(p1, ..., pk) to a variable of type FooActionPk. This can be useful when composing actions. +// +// You can also overload actions with different numbers of parameters: +// +// ACTION_P(Plus, a) { ... } +// ACTION_P2(Plus, a, b) { ... } +// +// While it's tempting to always use the ACTION* macros when defining +// a new action, you should also consider implementing ActionInterface +// or using MakePolymorphicAction() instead, especially if you need to +// use the action a lot. While these approaches require more work, +// they give you more control on the types of the mock function +// arguments and the action parameters, which in general leads to +// better compiler error messages that pay off in the long run. They +// also allow overloading actions based on parameter types (as opposed +// to just based on the number of parameters). +// +// CAVEAT: +// +// ACTION*() can only be used in a namespace scope as templates cannot be +// declared inside of a local class. +// Users can, however, define any local functors (e.g. a lambda) that +// can be used as actions. +// +// MORE INFORMATION: +// +// To learn more about using these macros, please search for 'ACTION' on +// https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md + +// IWYU pragma: private, include "gmock/gmock.h" +// IWYU pragma: friend gmock/.* + +#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ +#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ + +#ifndef _WIN32_WCE +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "gmock/internal/gmock-internal-utils.h" +#include "gmock/internal/gmock-port.h" +#include "gmock/internal/gmock-pp.h" + +GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100) + +namespace testing { + +// To implement an action Foo, define: +// 1. a class FooAction that implements the ActionInterface interface, and +// 2. a factory function that creates an Action object from a +// const FooAction*. +// +// The two-level delegation design follows that of Matcher, providing +// consistency for extension developers. It also eases ownership +// management as Action objects can now be copied like plain values. + +namespace internal { + +// BuiltInDefaultValueGetter::Get() returns a +// default-constructed T value. BuiltInDefaultValueGetter::Get() crashes with an error. +// +// This primary template is used when kDefaultConstructible is true. +template +struct BuiltInDefaultValueGetter { + static T Get() { return T(); } +}; +template +struct BuiltInDefaultValueGetter { + static T Get() { + Assert(false, __FILE__, __LINE__, + "Default action undefined for the function return type."); + return internal::Invalid(); + // The above statement will never be reached, but is required in + // order for this function to compile. + } +}; + +// BuiltInDefaultValue::Get() returns the "built-in" default value +// for type T, which is NULL when T is a raw pointer type, 0 when T is +// a numeric type, false when T is bool, or "" when T is string or +// std::string. In addition, in C++11 and above, it turns a +// default-constructed T value if T is default constructible. For any +// other type T, the built-in default T value is undefined, and the +// function will abort the process. +template +class BuiltInDefaultValue { + public: + // This function returns true if and only if type T has a built-in default + // value. + static bool Exists() { return ::std::is_default_constructible::value; } + + static T Get() { + return BuiltInDefaultValueGetter< + T, ::std::is_default_constructible::value>::Get(); + } +}; + +// This partial specialization says that we use the same built-in +// default value for T and const T. +template +class BuiltInDefaultValue { + public: + static bool Exists() { return BuiltInDefaultValue::Exists(); } + static T Get() { return BuiltInDefaultValue::Get(); } +}; + +// This partial specialization defines the default values for pointer +// types. +template +class BuiltInDefaultValue { + public: + static bool Exists() { return true; } + static T* Get() { return nullptr; } +}; + +// The following specializations define the default values for +// specific types we care about. +#define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value) \ + template <> \ + class BuiltInDefaultValue { \ + public: \ + static bool Exists() { return true; } \ + static type Get() { return value; } \ + } + +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void, ); // NOLINT +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string, ""); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(bool, false); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned char, '\0'); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed char, '\0'); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(char, '\0'); + +// There's no need for a default action for signed wchar_t, as that +// type is the same as wchar_t for gcc, and invalid for MSVC. +// +// There's also no need for a default action for unsigned wchar_t, as +// that type is the same as unsigned int for gcc, and invalid for +// MSVC. +#if GMOCK_WCHAR_T_IS_NATIVE_ +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(wchar_t, 0U); // NOLINT +#endif + +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned short, 0U); // NOLINT +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed short, 0); // NOLINT +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned int, 0U); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed int, 0); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long, 0UL); // NOLINT +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long, 0L); // NOLINT +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long long, 0); // NOLINT +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long long, 0); // NOLINT +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(float, 0); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(double, 0); + +#undef GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_ + +// Partial implementations of metaprogramming types from the standard library +// not available in C++11. + +template +struct negation + // NOLINTNEXTLINE + : std::integral_constant {}; + +// Base case: with zero predicates the answer is always true. +template +struct conjunction : std::true_type {}; + +// With a single predicate, the answer is that predicate. +template +struct conjunction : P1 {}; + +// With multiple predicates the answer is the first predicate if that is false, +// and we recurse otherwise. +template +struct conjunction + : std::conditional, P1>::type {}; + +template +struct disjunction : std::false_type {}; + +template +struct disjunction : P1 {}; + +template +struct disjunction + // NOLINTNEXTLINE + : std::conditional, P1>::type {}; + +template +using void_t = void; + +// Detects whether an expression of type `From` can be implicitly converted to +// `To` according to [conv]. In C++17, [conv]/3 defines this as follows: +// +// An expression e can be implicitly converted to a type T if and only if +// the declaration T t=e; is well-formed, for some invented temporary +// variable t ([dcl.init]). +// +// [conv]/2 implies we can use function argument passing to detect whether this +// initialization is valid. +// +// Note that this is distinct from is_convertible, which requires this be valid: +// +// To test() { +// return declval(); +// } +// +// In particular, is_convertible doesn't give the correct answer when `To` and +// `From` are the same non-moveable type since `declval` will be an rvalue +// reference, defeating the guaranteed copy elision that would otherwise make +// this function work. +// +// REQUIRES: `From` is not cv void. +template +struct is_implicitly_convertible { + private: + // A function that accepts a parameter of type T. This can be called with type + // U successfully only if U is implicitly convertible to T. + template + static void Accept(T); + + // A function that creates a value of type T. + template + static T Make(); + + // An overload be selected when implicit conversion from T to To is possible. + template (Make()))> + static std::true_type TestImplicitConversion(int); + + // A fallback overload selected in all other cases. + template + static std::false_type TestImplicitConversion(...); + + public: + using type = decltype(TestImplicitConversion(0)); + static constexpr bool value = type::value; +}; + +// Like std::invoke_result_t from C++17, but works only for objects with call +// operators (not e.g. member function pointers, which we don't need specific +// support for in OnceAction because std::function deals with them). +template +using call_result_t = decltype(std::declval()(std::declval()...)); + +template +struct is_callable_r_impl : std::false_type {}; + +// Specialize the struct for those template arguments where call_result_t is +// well-formed. When it's not, the generic template above is chosen, resulting +// in std::false_type. +template +struct is_callable_r_impl>, R, F, Args...> + : std::conditional< + std::is_void::value, // + std::true_type, // + is_implicitly_convertible, R>>::type {}; + +// Like std::is_invocable_r from C++17, but works only for objects with call +// operators. See the note on call_result_t. +template +using is_callable_r = is_callable_r_impl; + +// Like std::as_const from C++17. +template +typename std::add_const::type& as_const(T& t) { + return t; +} + +} // namespace internal + +// Specialized for function types below. +template +class OnceAction; + +// An action that can only be used once. +// +// This is accepted by WillOnce, which doesn't require the underlying action to +// be copy-constructible (only move-constructible), and promises to invoke it as +// an rvalue reference. This allows the action to work with move-only types like +// std::move_only_function in a type-safe manner. +// +// For example: +// +// // Assume we have some API that needs to accept a unique pointer to some +// // non-copyable object Foo. +// void AcceptUniquePointer(std::unique_ptr foo); +// +// // We can define an action that provides a Foo to that API. Because It +// // has to give away its unique pointer, it must not be called more than +// // once, so its call operator is &&-qualified. +// struct ProvideFoo { +// std::unique_ptr foo; +// +// void operator()() && { +// AcceptUniquePointer(std::move(Foo)); +// } +// }; +// +// // This action can be used with WillOnce. +// EXPECT_CALL(mock, Call) +// .WillOnce(ProvideFoo{std::make_unique(...)}); +// +// // But a call to WillRepeatedly will fail to compile. This is correct, +// // since the action cannot correctly be used repeatedly. +// EXPECT_CALL(mock, Call) +// .WillRepeatedly(ProvideFoo{std::make_unique(...)}); +// +// A less-contrived example would be an action that returns an arbitrary type, +// whose &&-qualified call operator is capable of dealing with move-only types. +template +class OnceAction final { + private: + // True iff we can use the given callable type (or lvalue reference) directly + // via StdFunctionAdaptor. + template + using IsDirectlyCompatible = internal::conjunction< + // It must be possible to capture the callable in StdFunctionAdaptor. + std::is_constructible::type, Callable>, + // The callable must be compatible with our signature. + internal::is_callable_r::type, + Args...>>; + + // True iff we can use the given callable type via StdFunctionAdaptor once we + // ignore incoming arguments. + template + using IsCompatibleAfterIgnoringArguments = internal::conjunction< + // It must be possible to capture the callable in a lambda. + std::is_constructible::type, Callable>, + // The callable must be invocable with zero arguments, returning something + // convertible to Result. + internal::is_callable_r::type>>; + + public: + // Construct from a callable that is directly compatible with our mocked + // signature: it accepts our function type's arguments and returns something + // convertible to our result type. + template ::type>>, + IsDirectlyCompatible> // + ::value, + int>::type = 0> + OnceAction(Callable&& callable) // NOLINT + : function_(StdFunctionAdaptor::type>( + {}, std::forward(callable))) {} + + // As above, but for a callable that ignores the mocked function's arguments. + template ::type>>, + // Exclude callables for which the overload above works. + // We'd rather provide the arguments if possible. + internal::negation>, + IsCompatibleAfterIgnoringArguments>::value, + int>::type = 0> + OnceAction(Callable&& callable) // NOLINT + // Call the constructor above with a callable + // that ignores the input arguments. + : OnceAction(IgnoreIncomingArguments::type>{ + std::forward(callable)}) {} + + // We are naturally copyable because we store only an std::function, but + // semantically we should not be copyable. + OnceAction(const OnceAction&) = delete; + OnceAction& operator=(const OnceAction&) = delete; + OnceAction(OnceAction&&) = default; + + // Invoke the underlying action callable with which we were constructed, + // handing it the supplied arguments. + Result Call(Args... args) && { + return function_(std::forward(args)...); + } + + private: + // An adaptor that wraps a callable that is compatible with our signature and + // being invoked as an rvalue reference so that it can be used as an + // StdFunctionAdaptor. This throws away type safety, but that's fine because + // this is only used by WillOnce, which we know calls at most once. + // + // Once we have something like std::move_only_function from C++23, we can do + // away with this. + template + class StdFunctionAdaptor final { + public: + // A tag indicating that the (otherwise universal) constructor is accepting + // the callable itself, instead of e.g. stealing calls for the move + // constructor. + struct CallableTag final {}; + + template + explicit StdFunctionAdaptor(CallableTag, F&& callable) + : callable_(std::make_shared(std::forward(callable))) {} + + // Rather than explicitly returning Result, we return whatever the wrapped + // callable returns. This allows for compatibility with existing uses like + // the following, when the mocked function returns void: + // + // EXPECT_CALL(mock_fn_, Call) + // .WillOnce([&] { + // [...] + // return 0; + // }); + // + // Such a callable can be turned into std::function. If we use an + // explicit return type of Result here then it *doesn't* work with + // std::function, because we'll get a "void function should not return a + // value" error. + // + // We need not worry about incompatible result types because the SFINAE on + // OnceAction already checks this for us. std::is_invocable_r_v itself makes + // the same allowance for void result types. + template + internal::call_result_t operator()( + ArgRefs&&... args) const { + return std::move(*callable_)(std::forward(args)...); + } + + private: + // We must put the callable on the heap so that we are copyable, which + // std::function needs. + std::shared_ptr callable_; + }; + + // An adaptor that makes a callable that accepts zero arguments callable with + // our mocked arguments. + template + struct IgnoreIncomingArguments { + internal::call_result_t operator()(Args&&...) { + return std::move(callable)(); + } + + Callable callable; + }; + + std::function function_; +}; + +// When an unexpected function call is encountered, Google Mock will +// let it return a default value if the user has specified one for its +// return type, or if the return type has a built-in default value; +// otherwise Google Mock won't know what value to return and will have +// to abort the process. +// +// The DefaultValue class allows a user to specify the +// default value for a type T that is both copyable and publicly +// destructible (i.e. anything that can be used as a function return +// type). The usage is: +// +// // Sets the default value for type T to be foo. +// DefaultValue::Set(foo); +template +class DefaultValue { + public: + // Sets the default value for type T; requires T to be + // copy-constructable and have a public destructor. + static void Set(T x) { + delete producer_; + producer_ = new FixedValueProducer(x); + } + + // Provides a factory function to be called to generate the default value. + // This method can be used even if T is only move-constructible, but it is not + // limited to that case. + typedef T (*FactoryFunction)(); + static void SetFactory(FactoryFunction factory) { + delete producer_; + producer_ = new FactoryValueProducer(factory); + } + + // Unsets the default value for type T. + static void Clear() { + delete producer_; + producer_ = nullptr; + } + + // Returns true if and only if the user has set the default value for type T. + static bool IsSet() { return producer_ != nullptr; } + + // Returns true if T has a default return value set by the user or there + // exists a built-in default value. + static bool Exists() { + return IsSet() || internal::BuiltInDefaultValue::Exists(); + } + + // Returns the default value for type T if the user has set one; + // otherwise returns the built-in default value. Requires that Exists() + // is true, which ensures that the return value is well-defined. + static T Get() { + return producer_ == nullptr ? internal::BuiltInDefaultValue::Get() + : producer_->Produce(); + } + + private: + class ValueProducer { + public: + virtual ~ValueProducer() = default; + virtual T Produce() = 0; + }; + + class FixedValueProducer : public ValueProducer { + public: + explicit FixedValueProducer(T value) : value_(value) {} + T Produce() override { return value_; } + + private: + const T value_; + FixedValueProducer(const FixedValueProducer&) = delete; + FixedValueProducer& operator=(const FixedValueProducer&) = delete; + }; + + class FactoryValueProducer : public ValueProducer { + public: + explicit FactoryValueProducer(FactoryFunction factory) + : factory_(factory) {} + T Produce() override { return factory_(); } + + private: + const FactoryFunction factory_; + FactoryValueProducer(const FactoryValueProducer&) = delete; + FactoryValueProducer& operator=(const FactoryValueProducer&) = delete; + }; + + static ValueProducer* producer_; +}; + +// This partial specialization allows a user to set default values for +// reference types. +template +class DefaultValue { + public: + // Sets the default value for type T&. + static void Set(T& x) { // NOLINT + address_ = &x; + } + + // Unsets the default value for type T&. + static void Clear() { address_ = nullptr; } + + // Returns true if and only if the user has set the default value for type T&. + static bool IsSet() { return address_ != nullptr; } + + // Returns true if T has a default return value set by the user or there + // exists a built-in default value. + static bool Exists() { + return IsSet() || internal::BuiltInDefaultValue::Exists(); + } + + // Returns the default value for type T& if the user has set one; + // otherwise returns the built-in default value if there is one; + // otherwise aborts the process. + static T& Get() { + return address_ == nullptr ? internal::BuiltInDefaultValue::Get() + : *address_; + } + + private: + static T* address_; +}; + +// This specialization allows DefaultValue::Get() to +// compile. +template <> +class DefaultValue { + public: + static bool Exists() { return true; } + static void Get() {} +}; + +// Points to the user-set default value for type T. +template +typename DefaultValue::ValueProducer* DefaultValue::producer_ = nullptr; + +// Points to the user-set default value for type T&. +template +T* DefaultValue::address_ = nullptr; + +// Implement this interface to define an action for function type F. +template +class ActionInterface { + public: + typedef typename internal::Function::Result Result; + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + ActionInterface() = default; + virtual ~ActionInterface() = default; + + // Performs the action. This method is not const, as in general an + // action can have side effects and be stateful. For example, a + // get-the-next-element-from-the-collection action will need to + // remember the current element. + virtual Result Perform(const ArgumentTuple& args) = 0; + + private: + ActionInterface(const ActionInterface&) = delete; + ActionInterface& operator=(const ActionInterface&) = delete; +}; + +template +class Action; + +// An Action is a copyable and IMMUTABLE (except by assignment) +// object that represents an action to be taken when a mock function of type +// R(Args...) is called. The implementation of Action is just a +// std::shared_ptr to const ActionInterface. Don't inherit from Action! You +// can view an object implementing ActionInterface as a concrete action +// (including its current state), and an Action object as a handle to it. +template +class Action { + private: + using F = R(Args...); + + // Adapter class to allow constructing Action from a legacy ActionInterface. + // New code should create Actions from functors instead. + struct ActionAdapter { + // Adapter must be copyable to satisfy std::function requirements. + ::std::shared_ptr> impl_; + + template + typename internal::Function::Result operator()(InArgs&&... args) { + return impl_->Perform( + ::std::forward_as_tuple(::std::forward(args)...)); + } + }; + + template + using IsCompatibleFunctor = std::is_constructible, G>; + + public: + typedef typename internal::Function::Result Result; + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + // Constructs a null Action. Needed for storing Action objects in + // STL containers. + Action() = default; + + // Construct an Action from a specified callable. + // This cannot take std::function directly, because then Action would not be + // directly constructible from lambda (it would require two conversions). + template < + typename G, + typename = typename std::enable_if, std::is_constructible, + G>>::value>::type> + Action(G&& fun) { // NOLINT + Init(::std::forward(fun), IsCompatibleFunctor()); + } + + // Constructs an Action from its implementation. + explicit Action(ActionInterface* impl) + : fun_(ActionAdapter{::std::shared_ptr>(impl)}) {} + + // This constructor allows us to turn an Action object into an + // Action, as long as F's arguments can be implicitly converted + // to Func's and Func's return type can be implicitly converted to F's. + template + Action(const Action& action) // NOLINT + : fun_(action.fun_) {} + + // Returns true if and only if this is the DoDefault() action. + bool IsDoDefault() const { return fun_ == nullptr; } + + // Performs the action. Note that this method is const even though + // the corresponding method in ActionInterface is not. The reason + // is that a const Action means that it cannot be re-bound to + // another concrete action, not that the concrete action it binds to + // cannot change state. (Think of the difference between a const + // pointer and a pointer to const.) + Result Perform(ArgumentTuple args) const { + if (IsDoDefault()) { + internal::IllegalDoDefault(__FILE__, __LINE__); + } + return internal::Apply(fun_, ::std::move(args)); + } + + // An action can be used as a OnceAction, since it's obviously safe to call it + // once. + operator OnceAction() const { // NOLINT + // Return a OnceAction-compatible callable that calls Perform with the + // arguments it is provided. We could instead just return fun_, but then + // we'd need to handle the IsDoDefault() case separately. + struct OA { + Action action; + + R operator()(Args... args) && { + return action.Perform( + std::forward_as_tuple(std::forward(args)...)); + } + }; + + return OA{*this}; + } + + private: + template + friend class Action; + + template + void Init(G&& g, ::std::true_type) { + fun_ = ::std::forward(g); + } + + template + void Init(G&& g, ::std::false_type) { + fun_ = IgnoreArgs::type>{::std::forward(g)}; + } + + template + struct IgnoreArgs { + template + Result operator()(const InArgs&...) const { + return function_impl(); + } + + FunctionImpl function_impl; + }; + + // fun_ is an empty function if and only if this is the DoDefault() action. + ::std::function fun_; +}; + +// The PolymorphicAction class template makes it easy to implement a +// polymorphic action (i.e. an action that can be used in mock +// functions of than one type, e.g. Return()). +// +// To define a polymorphic action, a user first provides a COPYABLE +// implementation class that has a Perform() method template: +// +// class FooAction { +// public: +// template +// Result Perform(const ArgumentTuple& args) const { +// // Processes the arguments and returns a result, using +// // std::get(args) to get the N-th (0-based) argument in the tuple. +// } +// ... +// }; +// +// Then the user creates the polymorphic action using +// MakePolymorphicAction(object) where object has type FooAction. See +// the definition of Return(void) and SetArgumentPointee(value) for +// complete examples. +template +class PolymorphicAction { + public: + explicit PolymorphicAction(const Impl& impl) : impl_(impl) {} + + template + operator Action() const { + return Action(new MonomorphicImpl(impl_)); + } + + private: + template + class MonomorphicImpl : public ActionInterface { + public: + typedef typename internal::Function::Result Result; + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} + + Result Perform(const ArgumentTuple& args) override { + return impl_.template Perform(args); + } + + private: + Impl impl_; + }; + + Impl impl_; +}; + +// Creates an Action from its implementation and returns it. The +// created Action object owns the implementation. +template +Action MakeAction(ActionInterface* impl) { + return Action(impl); +} + +// Creates a polymorphic action from its implementation. This is +// easier to use than the PolymorphicAction constructor as it +// doesn't require you to explicitly write the template argument, e.g. +// +// MakePolymorphicAction(foo); +// vs +// PolymorphicAction(foo); +template +inline PolymorphicAction MakePolymorphicAction(const Impl& impl) { + return PolymorphicAction(impl); +} + +namespace internal { + +// Helper struct to specialize ReturnAction to execute a move instead of a copy +// on return. Useful for move-only types, but could be used on any type. +template +struct ByMoveWrapper { + explicit ByMoveWrapper(T value) : payload(std::move(value)) {} + T payload; +}; + +// The general implementation of Return(R). Specializations follow below. +template +class ReturnAction final { + public: + explicit ReturnAction(R value) : value_(std::move(value)) {} + + template >, // + negation>, // + std::is_convertible, // + std::is_move_constructible>::value>::type> + operator OnceAction() && { // NOLINT + return Impl(std::move(value_)); + } + + template >, // + negation>, // + std::is_convertible, // + std::is_copy_constructible>::value>::type> + operator Action() const { // NOLINT + return Impl(value_); + } + + private: + // Implements the Return(x) action for a mock function that returns type U. + template + class Impl final { + public: + // The constructor used when the return value is allowed to move from the + // input value (i.e. we are converting to OnceAction). + explicit Impl(R&& input_value) + : state_(new State(std::move(input_value))) {} + + // The constructor used when the return value is not allowed to move from + // the input value (i.e. we are converting to Action). + explicit Impl(const R& input_value) : state_(new State(input_value)) {} + + U operator()() && { return std::move(state_->value); } + U operator()() const& { return state_->value; } + + private: + // We put our state on the heap so that the compiler-generated copy/move + // constructors work correctly even when U is a reference-like type. This is + // necessary only because we eagerly create State::value (see the note on + // that symbol for details). If we instead had only the input value as a + // member then the default constructors would work fine. + // + // For example, when R is std::string and U is std::string_view, value is a + // reference to the string backed by input_value. The copy constructor would + // copy both, so that we wind up with a new input_value object (with the + // same contents) and a reference to the *old* input_value object rather + // than the new one. + struct State { + explicit State(const R& input_value_in) + : input_value(input_value_in), + // Make an implicit conversion to Result before initializing the U + // object we store, avoiding calling any explicit constructor of U + // from R. + // + // This simulates the language rules: a function with return type U + // that does `return R()` requires R to be implicitly convertible to + // U, and uses that path for the conversion, even U Result has an + // explicit constructor from R. + value(ImplicitCast_(internal::as_const(input_value))) {} + + // As above, but for the case where we're moving from the ReturnAction + // object because it's being used as a OnceAction. + explicit State(R&& input_value_in) + : input_value(std::move(input_value_in)), + // For the same reason as above we make an implicit conversion to U + // before initializing the value. + // + // Unlike above we provide the input value as an rvalue to the + // implicit conversion because this is a OnceAction: it's fine if it + // wants to consume the input value. + value(ImplicitCast_(std::move(input_value))) {} + + // A copy of the value originally provided by the user. We retain this in + // addition to the value of the mock function's result type below in case + // the latter is a reference-like type. See the std::string_view example + // in the documentation on Return. + R input_value; + + // The value we actually return, as the type returned by the mock function + // itself. + // + // We eagerly initialize this here, rather than lazily doing the implicit + // conversion automatically each time Perform is called, for historical + // reasons: in 2009-11, commit a070cbd91c (Google changelist 13540126) + // made the Action conversion operator eagerly convert the R value to + // U, but without keeping the R alive. This broke the use case discussed + // in the documentation for Return, making reference-like types such as + // std::string_view not safe to use as U where the input type R is a + // value-like type such as std::string. + // + // The example the commit gave was not very clear, nor was the issue + // thread (https://github.com/google/googlemock/issues/86), but it seems + // the worry was about reference-like input types R that flatten to a + // value-like type U when being implicitly converted. An example of this + // is std::vector::reference, which is often a proxy type with an + // reference to the underlying vector: + // + // // Helper method: have the mock function return bools according + // // to the supplied script. + // void SetActions(MockFunction& mock, + // const std::vector& script) { + // for (size_t i = 0; i < script.size(); ++i) { + // EXPECT_CALL(mock, Call(i)).WillOnce(Return(script[i])); + // } + // } + // + // TEST(Foo, Bar) { + // // Set actions using a temporary vector, whose operator[] + // // returns proxy objects that references that will be + // // dangling once the call to SetActions finishes and the + // // vector is destroyed. + // MockFunction mock; + // SetActions(mock, {false, true}); + // + // EXPECT_FALSE(mock.AsStdFunction()(0)); + // EXPECT_TRUE(mock.AsStdFunction()(1)); + // } + // + // This eager conversion helps with a simple case like this, but doesn't + // fully make these types work in general. For example the following still + // uses a dangling reference: + // + // TEST(Foo, Baz) { + // MockFunction()> mock; + // + // // Return the same vector twice, and then the empty vector + // // thereafter. + // auto action = Return(std::initializer_list{ + // "taco", "burrito", + // }); + // + // EXPECT_CALL(mock, Call) + // .WillOnce(action) + // .WillOnce(action) + // .WillRepeatedly(Return(std::vector{})); + // + // EXPECT_THAT(mock.AsStdFunction()(), + // ElementsAre("taco", "burrito")); + // EXPECT_THAT(mock.AsStdFunction()(), + // ElementsAre("taco", "burrito")); + // EXPECT_THAT(mock.AsStdFunction()(), IsEmpty()); + // } + // + U value; + }; + + const std::shared_ptr state_; + }; + + R value_; +}; + +// A specialization of ReturnAction when R is ByMoveWrapper for some T. +// +// This version applies the type system-defeating hack of moving from T even in +// the const call operator, checking at runtime that it isn't called more than +// once, since the user has declared their intent to do so by using ByMove. +template +class ReturnAction> final { + public: + explicit ReturnAction(ByMoveWrapper wrapper) + : state_(new State(std::move(wrapper.payload))) {} + + T operator()() const { + GTEST_CHECK_(!state_->called) + << "A ByMove() action must be performed at most once."; + + state_->called = true; + return std::move(state_->value); + } + + private: + // We store our state on the heap so that we are copyable as required by + // Action, despite the fact that we are stateful and T may not be copyable. + struct State { + explicit State(T&& value_in) : value(std::move(value_in)) {} + + T value; + bool called = false; + }; + + const std::shared_ptr state_; +}; + +// Implements the ReturnNull() action. +class ReturnNullAction { + public: + // Allows ReturnNull() to be used in any pointer-returning function. In C++11 + // this is enforced by returning nullptr, and in non-C++11 by asserting a + // pointer type on compile time. + template + static Result Perform(const ArgumentTuple&) { + return nullptr; + } +}; + +// Implements the Return() action. +class ReturnVoidAction { + public: + // Allows Return() to be used in any void-returning function. + template + static void Perform(const ArgumentTuple&) { + static_assert(std::is_void::value, "Result should be void."); + } +}; + +// Implements the polymorphic ReturnRef(x) action, which can be used +// in any function that returns a reference to the type of x, +// regardless of the argument types. +template +class ReturnRefAction { + public: + // Constructs a ReturnRefAction object from the reference to be returned. + explicit ReturnRefAction(T& ref) : ref_(ref) {} // NOLINT + + // This template type conversion operator allows ReturnRef(x) to be + // used in ANY function that returns a reference to x's type. + template + operator Action() const { + typedef typename Function::Result Result; + // Asserts that the function return type is a reference. This + // catches the user error of using ReturnRef(x) when Return(x) + // should be used, and generates some helpful error message. + static_assert(std::is_reference::value, + "use Return instead of ReturnRef to return a value"); + return Action(new Impl(ref_)); + } + + private: + // Implements the ReturnRef(x) action for a particular function type F. + template + class Impl : public ActionInterface { + public: + typedef typename Function::Result Result; + typedef typename Function::ArgumentTuple ArgumentTuple; + + explicit Impl(T& ref) : ref_(ref) {} // NOLINT + + Result Perform(const ArgumentTuple&) override { return ref_; } + + private: + T& ref_; + }; + + T& ref_; +}; + +// Implements the polymorphic ReturnRefOfCopy(x) action, which can be +// used in any function that returns a reference to the type of x, +// regardless of the argument types. +template +class ReturnRefOfCopyAction { + public: + // Constructs a ReturnRefOfCopyAction object from the reference to + // be returned. + explicit ReturnRefOfCopyAction(const T& value) : value_(value) {} // NOLINT + + // This template type conversion operator allows ReturnRefOfCopy(x) to be + // used in ANY function that returns a reference to x's type. + template + operator Action() const { + typedef typename Function::Result Result; + // Asserts that the function return type is a reference. This + // catches the user error of using ReturnRefOfCopy(x) when Return(x) + // should be used, and generates some helpful error message. + static_assert(std::is_reference::value, + "use Return instead of ReturnRefOfCopy to return a value"); + return Action(new Impl(value_)); + } + + private: + // Implements the ReturnRefOfCopy(x) action for a particular function type F. + template + class Impl : public ActionInterface { + public: + typedef typename Function::Result Result; + typedef typename Function::ArgumentTuple ArgumentTuple; + + explicit Impl(const T& value) : value_(value) {} // NOLINT + + Result Perform(const ArgumentTuple&) override { return value_; } + + private: + T value_; + }; + + const T value_; +}; + +// Implements the polymorphic ReturnRoundRobin(v) action, which can be +// used in any function that returns the element_type of v. +template +class ReturnRoundRobinAction { + public: + explicit ReturnRoundRobinAction(std::vector values) { + GTEST_CHECK_(!values.empty()) + << "ReturnRoundRobin requires at least one element."; + state_->values = std::move(values); + } + + template + T operator()(Args&&...) const { + return state_->Next(); + } + + private: + struct State { + T Next() { + T ret_val = values[i++]; + if (i == values.size()) i = 0; + return ret_val; + } + + std::vector values; + size_t i = 0; + }; + std::shared_ptr state_ = std::make_shared(); +}; + +// Implements the polymorphic DoDefault() action. +class DoDefaultAction { + public: + // This template type conversion operator allows DoDefault() to be + // used in any function. + template + operator Action() const { + return Action(); + } // NOLINT +}; + +// Implements the Assign action to set a given pointer referent to a +// particular value. +template +class AssignAction { + public: + AssignAction(T1* ptr, T2 value) : ptr_(ptr), value_(value) {} + + template + void Perform(const ArgumentTuple& /* args */) const { + *ptr_ = value_; + } + + private: + T1* const ptr_; + const T2 value_; +}; + +#ifndef GTEST_OS_WINDOWS_MOBILE + +// Implements the SetErrnoAndReturn action to simulate return from +// various system calls and libc functions. +template +class SetErrnoAndReturnAction { + public: + SetErrnoAndReturnAction(int errno_value, T result) + : errno_(errno_value), result_(result) {} + template + Result Perform(const ArgumentTuple& /* args */) const { + errno = errno_; + return result_; + } + + private: + const int errno_; + const T result_; +}; + +#endif // !GTEST_OS_WINDOWS_MOBILE + +// Implements the SetArgumentPointee(x) action for any function +// whose N-th argument (0-based) is a pointer to x's type. +template +struct SetArgumentPointeeAction { + A value; + + template + void operator()(const Args&... args) const { + *::std::get(std::tie(args...)) = value; + } +}; + +// Implements the Invoke(object_ptr, &Class::Method) action. +template +struct InvokeMethodAction { + Class* const obj_ptr; + const MethodPtr method_ptr; + + template + auto operator()(Args&&... args) const + -> decltype((obj_ptr->*method_ptr)(std::forward(args)...)) { + return (obj_ptr->*method_ptr)(std::forward(args)...); + } +}; + +// Implements the InvokeWithoutArgs(f) action. The template argument +// FunctionImpl is the implementation type of f, which can be either a +// function pointer or a functor. InvokeWithoutArgs(f) can be used as an +// Action as long as f's type is compatible with F. +template +struct InvokeWithoutArgsAction { + FunctionImpl function_impl; + + // Allows InvokeWithoutArgs(f) to be used as any action whose type is + // compatible with f. + template + auto operator()(const Args&...) -> decltype(function_impl()) { + return function_impl(); + } +}; + +// Implements the InvokeWithoutArgs(object_ptr, &Class::Method) action. +template +struct InvokeMethodWithoutArgsAction { + Class* const obj_ptr; + const MethodPtr method_ptr; + + using ReturnType = + decltype((std::declval()->*std::declval())()); + + template + ReturnType operator()(const Args&...) const { + return (obj_ptr->*method_ptr)(); + } +}; + +// Implements the IgnoreResult(action) action. +template +class IgnoreResultAction { + public: + explicit IgnoreResultAction(const A& action) : action_(action) {} + + template + operator Action() const { + // Assert statement belongs here because this is the best place to verify + // conditions on F. It produces the clearest error messages + // in most compilers. + // Impl really belongs in this scope as a local class but can't + // because MSVC produces duplicate symbols in different translation units + // in this case. Until MS fixes that bug we put Impl into the class scope + // and put the typedef both here (for use in assert statement) and + // in the Impl class. But both definitions must be the same. + typedef typename internal::Function::Result Result; + + // Asserts at compile time that F returns void. + static_assert(std::is_void::value, "Result type should be void."); + + return Action(new Impl(action_)); + } + + private: + template + class Impl : public ActionInterface { + public: + typedef typename internal::Function::Result Result; + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + explicit Impl(const A& action) : action_(action) {} + + void Perform(const ArgumentTuple& args) override { + // Performs the action and ignores its result. + action_.Perform(args); + } + + private: + // Type OriginalFunction is the same as F except that its return + // type is IgnoredValue. + typedef + typename internal::Function::MakeResultIgnoredValue OriginalFunction; + + const Action action_; + }; + + const A action_; +}; + +template +struct WithArgsAction { + InnerAction inner_action; + + // The signature of the function as seen by the inner action, given an out + // action with the given result and argument types. + template + using InnerSignature = + R(typename std::tuple_element>::type...); + + // Rather than a call operator, we must define conversion operators to + // particular action types. This is necessary for embedded actions like + // DoDefault(), which rely on an action conversion operators rather than + // providing a call operator because even with a particular set of arguments + // they don't have a fixed return type. + + template < + typename R, typename... Args, + typename std::enable_if< + std::is_convertible>...)>>::value, + int>::type = 0> + operator OnceAction() && { // NOLINT + struct OA { + OnceAction> inner_action; + + R operator()(Args&&... args) && { + return std::move(inner_action) + .Call(std::get( + std::forward_as_tuple(std::forward(args)...))...); + } + }; + + return OA{std::move(inner_action)}; + } + + template < + typename R, typename... Args, + typename std::enable_if< + std::is_convertible>...)>>::value, + int>::type = 0> + operator Action() const { // NOLINT + Action> converted(inner_action); + + return [converted](Args&&... args) -> R { + return converted.Perform(std::forward_as_tuple( + std::get(std::forward_as_tuple(std::forward(args)...))...)); + }; + } +}; + +template +class DoAllAction; + +// Base case: only a single action. +template +class DoAllAction { + public: + struct UserConstructorTag {}; + + template + explicit DoAllAction(UserConstructorTag, T&& action) + : final_action_(std::forward(action)) {} + + // Rather than a call operator, we must define conversion operators to + // particular action types. This is necessary for embedded actions like + // DoDefault(), which rely on an action conversion operators rather than + // providing a call operator because even with a particular set of arguments + // they don't have a fixed return type. + + template >::value, + int>::type = 0> + operator OnceAction() && { // NOLINT + return std::move(final_action_); + } + + template < + typename R, typename... Args, + typename std::enable_if< + std::is_convertible>::value, + int>::type = 0> + operator Action() const { // NOLINT + return final_action_; + } + + private: + FinalAction final_action_; +}; + +// Recursive case: support N actions by calling the initial action and then +// calling through to the base class containing N-1 actions. +template +class DoAllAction + : private DoAllAction { + private: + using Base = DoAllAction; + + // The type of reference that should be provided to an initial action for a + // mocked function parameter of type T. + // + // There are two quirks here: + // + // * Unlike most forwarding functions, we pass scalars through by value. + // This isn't strictly necessary because an lvalue reference would work + // fine too and be consistent with other non-reference types, but it's + // perhaps less surprising. + // + // For example if the mocked function has signature void(int), then it + // might seem surprising for the user's initial action to need to be + // convertible to Action. This is perhaps less + // surprising for a non-scalar type where there may be a performance + // impact, or it might even be impossible, to pass by value. + // + // * More surprisingly, `const T&` is often not a const reference type. + // By the reference collapsing rules in C++17 [dcl.ref]/6, if T refers to + // U& or U&& for some non-scalar type U, then InitialActionArgType is + // U&. In other words, we may hand over a non-const reference. + // + // So for example, given some non-scalar type Obj we have the following + // mappings: + // + // T InitialActionArgType + // ------- ----------------------- + // Obj const Obj& + // Obj& Obj& + // Obj&& Obj& + // const Obj const Obj& + // const Obj& const Obj& + // const Obj&& const Obj& + // + // In other words, the initial actions get a mutable view of an non-scalar + // argument if and only if the mock function itself accepts a non-const + // reference type. They are never given an rvalue reference to an + // non-scalar type. + // + // This situation makes sense if you imagine use with a matcher that is + // designed to write through a reference. For example, if the caller wants + // to fill in a reference argument and then return a canned value: + // + // EXPECT_CALL(mock, Call) + // .WillOnce(DoAll(SetArgReferee<0>(17), Return(19))); + // + template + using InitialActionArgType = + typename std::conditional::value, T, const T&>::type; + + public: + struct UserConstructorTag {}; + + template + explicit DoAllAction(UserConstructorTag, T&& initial_action, + U&&... other_actions) + : Base({}, std::forward(other_actions)...), + initial_action_(std::forward(initial_action)) {} + + template ...)>>, + std::is_convertible>>::value, + int>::type = 0> + operator OnceAction() && { // NOLINT + // Return an action that first calls the initial action with arguments + // filtered through InitialActionArgType, then forwards arguments directly + // to the base class to deal with the remaining actions. + struct OA { + OnceAction...)> initial_action; + OnceAction remaining_actions; + + R operator()(Args... args) && { + std::move(initial_action) + .Call(static_cast>(args)...); + + return std::move(remaining_actions).Call(std::forward(args)...); + } + }; + + return OA{ + std::move(initial_action_), + std::move(static_cast(*this)), + }; + } + + template < + typename R, typename... Args, + typename std::enable_if< + conjunction< + // Both the initial action and the rest must support conversion to + // Action. + std::is_convertible...)>>, + std::is_convertible>>::value, + int>::type = 0> + operator Action() const { // NOLINT + // Return an action that first calls the initial action with arguments + // filtered through InitialActionArgType, then forwards arguments directly + // to the base class to deal with the remaining actions. + struct OA { + Action...)> initial_action; + Action remaining_actions; + + R operator()(Args... args) const { + initial_action.Perform(std::forward_as_tuple( + static_cast>(args)...)); + + return remaining_actions.Perform( + std::forward_as_tuple(std::forward(args)...)); + } + }; + + return OA{ + initial_action_, + static_cast(*this), + }; + } + + private: + InitialAction initial_action_; +}; + +template +struct ReturnNewAction { + T* operator()() const { + return internal::Apply( + [](const Params&... unpacked_params) { + return new T(unpacked_params...); + }, + params); + } + std::tuple params; +}; + +template +struct ReturnArgAction { + template ::type> + auto operator()(Args&&... args) const -> decltype(std::get( + std::forward_as_tuple(std::forward(args)...))) { + return std::get(std::forward_as_tuple(std::forward(args)...)); + } +}; + +template +struct SaveArgAction { + Ptr pointer; + + template + void operator()(const Args&... args) const { + *pointer = std::get(std::tie(args...)); + } +}; + +template +struct SaveArgPointeeAction { + Ptr pointer; + + template + void operator()(const Args&... args) const { + *pointer = *std::get(std::tie(args...)); + } +}; + +template +struct SetArgRefereeAction { + T value; + + template + void operator()(Args&&... args) const { + using argk_type = + typename ::std::tuple_element>::type; + static_assert(std::is_lvalue_reference::value, + "Argument must be a reference type."); + std::get(std::tie(args...)) = value; + } +}; + +template +struct SetArrayArgumentAction { + I1 first; + I2 last; + + template + void operator()(const Args&... args) const { + auto value = std::get(std::tie(args...)); + for (auto it = first; it != last; ++it, (void)++value) { + *value = *it; + } + } +}; + +template +struct DeleteArgAction { + template + void operator()(const Args&... args) const { + delete std::get(std::tie(args...)); + } +}; + +template +struct ReturnPointeeAction { + Ptr pointer; + template + auto operator()(const Args&...) const -> decltype(*pointer) { + return *pointer; + } +}; + +#if GTEST_HAS_EXCEPTIONS +template +struct ThrowAction { + T exception; + // We use a conversion operator to adapt to any return type. + template + operator Action() const { // NOLINT + T copy = exception; + return [copy](Args...) -> R { throw copy; }; + } +}; +#endif // GTEST_HAS_EXCEPTIONS + +} // namespace internal + +// An Unused object can be implicitly constructed from ANY value. +// This is handy when defining actions that ignore some or all of the +// mock function arguments. For example, given +// +// MOCK_METHOD3(Foo, double(const string& label, double x, double y)); +// MOCK_METHOD3(Bar, double(int index, double x, double y)); +// +// instead of +// +// double DistanceToOriginWithLabel(const string& label, double x, double y) { +// return sqrt(x*x + y*y); +// } +// double DistanceToOriginWithIndex(int index, double x, double y) { +// return sqrt(x*x + y*y); +// } +// ... +// EXPECT_CALL(mock, Foo("abc", _, _)) +// .WillOnce(Invoke(DistanceToOriginWithLabel)); +// EXPECT_CALL(mock, Bar(5, _, _)) +// .WillOnce(Invoke(DistanceToOriginWithIndex)); +// +// you could write +// +// // We can declare any uninteresting argument as Unused. +// double DistanceToOrigin(Unused, double x, double y) { +// return sqrt(x*x + y*y); +// } +// ... +// EXPECT_CALL(mock, Foo("abc", _, _)).WillOnce(Invoke(DistanceToOrigin)); +// EXPECT_CALL(mock, Bar(5, _, _)).WillOnce(Invoke(DistanceToOrigin)); +typedef internal::IgnoredValue Unused; + +// Creates an action that does actions a1, a2, ..., sequentially in +// each invocation. All but the last action will have a readonly view of the +// arguments. +template +internal::DoAllAction::type...> DoAll( + Action&&... action) { + return internal::DoAllAction::type...>( + {}, std::forward(action)...); +} + +// WithArg(an_action) creates an action that passes the k-th +// (0-based) argument of the mock function to an_action and performs +// it. It adapts an action accepting one argument to one that accepts +// multiple arguments. For convenience, we also provide +// WithArgs(an_action) (defined below) as a synonym. +template +internal::WithArgsAction::type, k> WithArg( + InnerAction&& action) { + return {std::forward(action)}; +} + +// WithArgs(an_action) creates an action that passes +// the selected arguments of the mock function to an_action and +// performs it. It serves as an adaptor between actions with +// different argument lists. +template +internal::WithArgsAction::type, k, ks...> +WithArgs(InnerAction&& action) { + return {std::forward(action)}; +} + +// WithoutArgs(inner_action) can be used in a mock function with a +// non-empty argument list to perform inner_action, which takes no +// argument. In other words, it adapts an action accepting no +// argument to one that accepts (and ignores) arguments. +template +internal::WithArgsAction::type> WithoutArgs( + InnerAction&& action) { + return {std::forward(action)}; +} + +// Creates an action that returns a value. +// +// The returned type can be used with a mock function returning a non-void, +// non-reference type U as follows: +// +// * If R is convertible to U and U is move-constructible, then the action can +// be used with WillOnce. +// +// * If const R& is convertible to U and U is copy-constructible, then the +// action can be used with both WillOnce and WillRepeatedly. +// +// The mock expectation contains the R value from which the U return value is +// constructed (a move/copy of the argument to Return). This means that the R +// value will survive at least until the mock object's expectations are cleared +// or the mock object is destroyed, meaning that U can safely be a +// reference-like type such as std::string_view: +// +// // The mock function returns a view of a copy of the string fed to +// // Return. The view is valid even after the action is performed. +// MockFunction mock; +// EXPECT_CALL(mock, Call).WillOnce(Return(std::string("taco"))); +// const std::string_view result = mock.AsStdFunction()(); +// EXPECT_EQ("taco", result); +// +template +internal::ReturnAction Return(R value) { + return internal::ReturnAction(std::move(value)); +} + +// Creates an action that returns NULL. +inline PolymorphicAction ReturnNull() { + return MakePolymorphicAction(internal::ReturnNullAction()); +} + +// Creates an action that returns from a void function. +inline PolymorphicAction Return() { + return MakePolymorphicAction(internal::ReturnVoidAction()); +} + +// Creates an action that returns the reference to a variable. +template +inline internal::ReturnRefAction ReturnRef(R& x) { // NOLINT + return internal::ReturnRefAction(x); +} + +// Prevent using ReturnRef on reference to temporary. +template +internal::ReturnRefAction ReturnRef(R&&) = delete; + +// Creates an action that returns the reference to a copy of the +// argument. The copy is created when the action is constructed and +// lives as long as the action. +template +inline internal::ReturnRefOfCopyAction ReturnRefOfCopy(const R& x) { + return internal::ReturnRefOfCopyAction(x); +} + +// DEPRECATED: use Return(x) directly with WillOnce. +// +// Modifies the parent action (a Return() action) to perform a move of the +// argument instead of a copy. +// Return(ByMove()) actions can only be executed once and will assert this +// invariant. +template +internal::ByMoveWrapper ByMove(R x) { + return internal::ByMoveWrapper(std::move(x)); +} + +// Creates an action that returns an element of `vals`. Calling this action will +// repeatedly return the next value from `vals` until it reaches the end and +// will restart from the beginning. +template +internal::ReturnRoundRobinAction ReturnRoundRobin(std::vector vals) { + return internal::ReturnRoundRobinAction(std::move(vals)); +} + +// Creates an action that returns an element of `vals`. Calling this action will +// repeatedly return the next value from `vals` until it reaches the end and +// will restart from the beginning. +template +internal::ReturnRoundRobinAction ReturnRoundRobin( + std::initializer_list vals) { + return internal::ReturnRoundRobinAction(std::vector(vals)); +} + +// Creates an action that does the default action for the give mock function. +inline internal::DoDefaultAction DoDefault() { + return internal::DoDefaultAction(); +} + +// Creates an action that sets the variable pointed by the N-th +// (0-based) function argument to 'value'. +template +internal::SetArgumentPointeeAction SetArgPointee(T value) { + return {std::move(value)}; +} + +// The following version is DEPRECATED. +template +internal::SetArgumentPointeeAction SetArgumentPointee(T value) { + return {std::move(value)}; +} + +// Creates an action that sets a pointer referent to a given value. +template +PolymorphicAction> Assign(T1* ptr, T2 val) { + return MakePolymorphicAction(internal::AssignAction(ptr, val)); +} + +#ifndef GTEST_OS_WINDOWS_MOBILE + +// Creates an action that sets errno and returns the appropriate error. +template +PolymorphicAction> SetErrnoAndReturn( + int errval, T result) { + return MakePolymorphicAction( + internal::SetErrnoAndReturnAction(errval, result)); +} + +#endif // !GTEST_OS_WINDOWS_MOBILE + +// Various overloads for Invoke(). + +// Legacy function. +// Actions can now be implicitly constructed from callables. No need to create +// wrapper objects. +// This function exists for backwards compatibility. +template +typename std::decay::type Invoke(FunctionImpl&& function_impl) { + return std::forward(function_impl); +} + +// Creates an action that invokes the given method on the given object +// with the mock function's arguments. +template +internal::InvokeMethodAction Invoke(Class* obj_ptr, + MethodPtr method_ptr) { + return {obj_ptr, method_ptr}; +} + +// Creates an action that invokes 'function_impl' with no argument. +template +internal::InvokeWithoutArgsAction::type> +InvokeWithoutArgs(FunctionImpl function_impl) { + return {std::move(function_impl)}; +} + +// Creates an action that invokes the given method on the given object +// with no argument. +template +internal::InvokeMethodWithoutArgsAction InvokeWithoutArgs( + Class* obj_ptr, MethodPtr method_ptr) { + return {obj_ptr, method_ptr}; +} + +// Creates an action that performs an_action and throws away its +// result. In other words, it changes the return type of an_action to +// void. an_action MUST NOT return void, or the code won't compile. +template +inline internal::IgnoreResultAction IgnoreResult(const A& an_action) { + return internal::IgnoreResultAction(an_action); +} + +// Creates a reference wrapper for the given L-value. If necessary, +// you can explicitly specify the type of the reference. For example, +// suppose 'derived' is an object of type Derived, ByRef(derived) +// would wrap a Derived&. If you want to wrap a const Base& instead, +// where Base is a base class of Derived, just write: +// +// ByRef(derived) +// +// N.B. ByRef is redundant with std::ref, std::cref and std::reference_wrapper. +// However, it may still be used for consistency with ByMove(). +template +inline ::std::reference_wrapper ByRef(T& l_value) { // NOLINT + return ::std::reference_wrapper(l_value); +} + +// The ReturnNew(a1, a2, ..., a_k) action returns a pointer to a new +// instance of type T, constructed on the heap with constructor arguments +// a1, a2, ..., and a_k. The caller assumes ownership of the returned value. +template +internal::ReturnNewAction::type...> ReturnNew( + Params&&... params) { + return {std::forward_as_tuple(std::forward(params)...)}; +} + +// Action ReturnArg() returns the k-th argument of the mock function. +template +internal::ReturnArgAction ReturnArg() { + return {}; +} + +// Action SaveArg(pointer) saves the k-th (0-based) argument of the +// mock function to *pointer. +template +internal::SaveArgAction SaveArg(Ptr pointer) { + return {pointer}; +} + +// Action SaveArgPointee(pointer) saves the value pointed to +// by the k-th (0-based) argument of the mock function to *pointer. +template +internal::SaveArgPointeeAction SaveArgPointee(Ptr pointer) { + return {pointer}; +} + +// Action SetArgReferee(value) assigns 'value' to the variable +// referenced by the k-th (0-based) argument of the mock function. +template +internal::SetArgRefereeAction::type> SetArgReferee( + T&& value) { + return {std::forward(value)}; +} + +// Action SetArrayArgument(first, last) copies the elements in +// source range [first, last) to the array pointed to by the k-th +// (0-based) argument, which can be either a pointer or an +// iterator. The action does not take ownership of the elements in the +// source range. +template +internal::SetArrayArgumentAction SetArrayArgument(I1 first, + I2 last) { + return {first, last}; +} + +// Action DeleteArg() deletes the k-th (0-based) argument of the mock +// function. +template +internal::DeleteArgAction DeleteArg() { + return {}; +} + +// This action returns the value pointed to by 'pointer'. +template +internal::ReturnPointeeAction ReturnPointee(Ptr pointer) { + return {pointer}; +} + +// Action Throw(exception) can be used in a mock function of any type +// to throw the given exception. Any copyable value can be thrown. +#if GTEST_HAS_EXCEPTIONS +template +internal::ThrowAction::type> Throw(T&& exception) { + return {std::forward(exception)}; +} +#endif // GTEST_HAS_EXCEPTIONS + +namespace internal { + +// A macro from the ACTION* family (defined later in gmock-generated-actions.h) +// defines an action that can be used in a mock function. Typically, +// these actions only care about a subset of the arguments of the mock +// function. For example, if such an action only uses the second +// argument, it can be used in any mock function that takes >= 2 +// arguments where the type of the second argument is compatible. +// +// Therefore, the action implementation must be prepared to take more +// arguments than it needs. The ExcessiveArg type is used to +// represent those excessive arguments. In order to keep the compiler +// error messages tractable, we define it in the testing namespace +// instead of testing::internal. However, this is an INTERNAL TYPE +// and subject to change without notice, so a user MUST NOT USE THIS +// TYPE DIRECTLY. +struct ExcessiveArg {}; + +// Builds an implementation of an Action<> for some particular signature, using +// a class defined by an ACTION* macro. +template +struct ActionImpl; + +template +struct ImplBase { + struct Holder { + // Allows each copy of the Action<> to get to the Impl. + explicit operator const Impl&() const { return *ptr; } + std::shared_ptr ptr; + }; + using type = typename std::conditional::value, + Impl, Holder>::type; +}; + +template +struct ActionImpl : ImplBase::type { + using Base = typename ImplBase::type; + using function_type = R(Args...); + using args_type = std::tuple; + + ActionImpl() = default; // Only defined if appropriate for Base. + explicit ActionImpl(std::shared_ptr impl) : Base{std::move(impl)} {} + + R operator()(Args&&... arg) const { + static constexpr size_t kMaxArgs = + sizeof...(Args) <= 10 ? sizeof...(Args) : 10; + return Apply(MakeIndexSequence{}, + MakeIndexSequence<10 - kMaxArgs>{}, + args_type{std::forward(arg)...}); + } + + template + R Apply(IndexSequence, IndexSequence, + const args_type& args) const { + // Impl need not be specific to the signature of action being implemented; + // only the implementing function body needs to have all of the specific + // types instantiated. Up to 10 of the args that are provided by the + // args_type get passed, followed by a dummy of unspecified type for the + // remainder up to 10 explicit args. + static constexpr ExcessiveArg kExcessArg{}; + return static_cast(*this) + .template gmock_PerformImpl< + /*function_type=*/function_type, /*return_type=*/R, + /*args_type=*/args_type, + /*argN_type=*/ + typename std::tuple_element::type...>( + /*args=*/args, std::get(args)..., + ((void)excess_id, kExcessArg)...); + } +}; + +// Stores a default-constructed Impl as part of the Action<>'s +// std::function<>. The Impl should be trivial to copy. +template +::testing::Action MakeAction() { + return ::testing::Action(ActionImpl()); +} + +// Stores just the one given instance of Impl. +template +::testing::Action MakeAction(std::shared_ptr impl) { + return ::testing::Action(ActionImpl(std::move(impl))); +} + +#define GMOCK_INTERNAL_ARG_UNUSED(i, data, el) \ + , const arg##i##_type& arg##i GTEST_ATTRIBUTE_UNUSED_ +#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_ \ + const args_type& args GTEST_ATTRIBUTE_UNUSED_ GMOCK_PP_REPEAT( \ + GMOCK_INTERNAL_ARG_UNUSED, , 10) + +#define GMOCK_INTERNAL_ARG(i, data, el) , const arg##i##_type& arg##i +#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_ \ + const args_type& args GMOCK_PP_REPEAT(GMOCK_INTERNAL_ARG, , 10) + +#define GMOCK_INTERNAL_TEMPLATE_ARG(i, data, el) , typename arg##i##_type +#define GMOCK_ACTION_TEMPLATE_ARGS_NAMES_ \ + GMOCK_PP_TAIL(GMOCK_PP_REPEAT(GMOCK_INTERNAL_TEMPLATE_ARG, , 10)) + +#define GMOCK_INTERNAL_TYPENAME_PARAM(i, data, param) , typename param##_type +#define GMOCK_ACTION_TYPENAME_PARAMS_(params) \ + GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPENAME_PARAM, , params)) + +#define GMOCK_INTERNAL_TYPE_PARAM(i, data, param) , param##_type +#define GMOCK_ACTION_TYPE_PARAMS_(params) \ + GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPE_PARAM, , params)) + +#define GMOCK_INTERNAL_TYPE_GVALUE_PARAM(i, data, param) \ + , param##_type gmock_p##i +#define GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params) \ + GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPE_GVALUE_PARAM, , params)) + +#define GMOCK_INTERNAL_GVALUE_PARAM(i, data, param) \ + , std::forward(gmock_p##i) +#define GMOCK_ACTION_GVALUE_PARAMS_(params) \ + GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GVALUE_PARAM, , params)) + +#define GMOCK_INTERNAL_INIT_PARAM(i, data, param) \ + , param(::std::forward(gmock_p##i)) +#define GMOCK_ACTION_INIT_PARAMS_(params) \ + GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_INIT_PARAM, , params)) + +#define GMOCK_INTERNAL_FIELD_PARAM(i, data, param) param##_type param; +#define GMOCK_ACTION_FIELD_PARAMS_(params) \ + GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_FIELD_PARAM, , params) + +#define GMOCK_INTERNAL_ACTION(name, full_name, params) \ + template \ + class full_name { \ + public: \ + explicit full_name(GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) \ + : impl_(std::make_shared( \ + GMOCK_ACTION_GVALUE_PARAMS_(params))) {} \ + full_name(const full_name&) = default; \ + full_name(full_name&&) noexcept = default; \ + template \ + operator ::testing::Action() const { \ + return ::testing::internal::MakeAction(impl_); \ + } \ + \ + private: \ + class gmock_Impl { \ + public: \ + explicit gmock_Impl(GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) \ + : GMOCK_ACTION_INIT_PARAMS_(params) {} \ + template \ + return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const; \ + GMOCK_ACTION_FIELD_PARAMS_(params) \ + }; \ + std::shared_ptr impl_; \ + }; \ + template \ + inline full_name name( \ + GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) GTEST_MUST_USE_RESULT_; \ + template \ + inline full_name name( \ + GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) { \ + return full_name( \ + GMOCK_ACTION_GVALUE_PARAMS_(params)); \ + } \ + template \ + template \ + return_type \ + full_name::gmock_Impl::gmock_PerformImpl( \ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +} // namespace internal + +// Similar to GMOCK_INTERNAL_ACTION, but no bound parameters are stored. +#define ACTION(name) \ + class name##Action { \ + public: \ + explicit name##Action() noexcept {} \ + name##Action(const name##Action&) noexcept {} \ + template \ + operator ::testing::Action() const { \ + return ::testing::internal::MakeAction(); \ + } \ + \ + private: \ + class gmock_Impl { \ + public: \ + template \ + return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const; \ + }; \ + }; \ + inline name##Action name() GTEST_MUST_USE_RESULT_; \ + inline name##Action name() { return name##Action(); } \ + template \ + return_type name##Action::gmock_Impl::gmock_PerformImpl( \ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +#define ACTION_P(name, ...) \ + GMOCK_INTERNAL_ACTION(name, name##ActionP, (__VA_ARGS__)) + +#define ACTION_P2(name, ...) \ + GMOCK_INTERNAL_ACTION(name, name##ActionP2, (__VA_ARGS__)) + +#define ACTION_P3(name, ...) \ + GMOCK_INTERNAL_ACTION(name, name##ActionP3, (__VA_ARGS__)) + +#define ACTION_P4(name, ...) \ + GMOCK_INTERNAL_ACTION(name, name##ActionP4, (__VA_ARGS__)) + +#define ACTION_P5(name, ...) \ + GMOCK_INTERNAL_ACTION(name, name##ActionP5, (__VA_ARGS__)) + +#define ACTION_P6(name, ...) \ + GMOCK_INTERNAL_ACTION(name, name##ActionP6, (__VA_ARGS__)) + +#define ACTION_P7(name, ...) \ + GMOCK_INTERNAL_ACTION(name, name##ActionP7, (__VA_ARGS__)) + +#define ACTION_P8(name, ...) \ + GMOCK_INTERNAL_ACTION(name, name##ActionP8, (__VA_ARGS__)) + +#define ACTION_P9(name, ...) \ + GMOCK_INTERNAL_ACTION(name, name##ActionP9, (__VA_ARGS__)) + +#define ACTION_P10(name, ...) \ + GMOCK_INTERNAL_ACTION(name, name##ActionP10, (__VA_ARGS__)) + +} // namespace testing + +GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100 + +#endif // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ diff --git a/vendor/googletest-1.14.0/googlemock/include/gmock/gmock-cardinalities.h b/vendor/googletest-1.14.0/googlemock/include/gmock/gmock-cardinalities.h new file mode 100644 index 00000000..533e604f --- /dev/null +++ b/vendor/googletest-1.14.0/googlemock/include/gmock/gmock-cardinalities.h @@ -0,0 +1,159 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some commonly used cardinalities. More +// cardinalities can be defined by the user implementing the +// CardinalityInterface interface if necessary. + +// IWYU pragma: private, include "gmock/gmock.h" +// IWYU pragma: friend gmock/.* + +#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ +#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ + +#include + +#include +#include // NOLINT + +#include "gmock/internal/gmock-port.h" +#include "gtest/gtest.h" + +GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ +/* class A needs to have dll-interface to be used by clients of class B */) + +namespace testing { + +// To implement a cardinality Foo, define: +// 1. a class FooCardinality that implements the +// CardinalityInterface interface, and +// 2. a factory function that creates a Cardinality object from a +// const FooCardinality*. +// +// The two-level delegation design follows that of Matcher, providing +// consistency for extension developers. It also eases ownership +// management as Cardinality objects can now be copied like plain values. + +// The implementation of a cardinality. +class CardinalityInterface { + public: + virtual ~CardinalityInterface() = default; + + // Conservative estimate on the lower/upper bound of the number of + // calls allowed. + virtual int ConservativeLowerBound() const { return 0; } + virtual int ConservativeUpperBound() const { return INT_MAX; } + + // Returns true if and only if call_count calls will satisfy this + // cardinality. + virtual bool IsSatisfiedByCallCount(int call_count) const = 0; + + // Returns true if and only if call_count calls will saturate this + // cardinality. + virtual bool IsSaturatedByCallCount(int call_count) const = 0; + + // Describes self to an ostream. + virtual void DescribeTo(::std::ostream* os) const = 0; +}; + +// A Cardinality is a copyable and IMMUTABLE (except by assignment) +// object that specifies how many times a mock function is expected to +// be called. The implementation of Cardinality is just a std::shared_ptr +// to const CardinalityInterface. Don't inherit from Cardinality! +class GTEST_API_ Cardinality { + public: + // Constructs a null cardinality. Needed for storing Cardinality + // objects in STL containers. + Cardinality() = default; + + // Constructs a Cardinality from its implementation. + explicit Cardinality(const CardinalityInterface* impl) : impl_(impl) {} + + // Conservative estimate on the lower/upper bound of the number of + // calls allowed. + int ConservativeLowerBound() const { return impl_->ConservativeLowerBound(); } + int ConservativeUpperBound() const { return impl_->ConservativeUpperBound(); } + + // Returns true if and only if call_count calls will satisfy this + // cardinality. + bool IsSatisfiedByCallCount(int call_count) const { + return impl_->IsSatisfiedByCallCount(call_count); + } + + // Returns true if and only if call_count calls will saturate this + // cardinality. + bool IsSaturatedByCallCount(int call_count) const { + return impl_->IsSaturatedByCallCount(call_count); + } + + // Returns true if and only if call_count calls will over-saturate this + // cardinality, i.e. exceed the maximum number of allowed calls. + bool IsOverSaturatedByCallCount(int call_count) const { + return impl_->IsSaturatedByCallCount(call_count) && + !impl_->IsSatisfiedByCallCount(call_count); + } + + // Describes self to an ostream + void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } + + // Describes the given actual call count to an ostream. + static void DescribeActualCallCountTo(int actual_call_count, + ::std::ostream* os); + + private: + std::shared_ptr impl_; +}; + +// Creates a cardinality that allows at least n calls. +GTEST_API_ Cardinality AtLeast(int n); + +// Creates a cardinality that allows at most n calls. +GTEST_API_ Cardinality AtMost(int n); + +// Creates a cardinality that allows any number of calls. +GTEST_API_ Cardinality AnyNumber(); + +// Creates a cardinality that allows between min and max calls. +GTEST_API_ Cardinality Between(int min, int max); + +// Creates a cardinality that allows exactly n calls. +GTEST_API_ Cardinality Exactly(int n); + +// Creates a cardinality from its implementation. +inline Cardinality MakeCardinality(const CardinalityInterface* c) { + return Cardinality(c); +} + +} // namespace testing + +GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 + +#endif // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ diff --git a/vendor/googletest-1.14.0/googlemock/include/gmock/gmock-function-mocker.h b/vendor/googletest-1.14.0/googlemock/include/gmock/gmock-function-mocker.h new file mode 100644 index 00000000..1a1f126e --- /dev/null +++ b/vendor/googletest-1.14.0/googlemock/include/gmock/gmock-function-mocker.h @@ -0,0 +1,518 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements MOCK_METHOD. + +// IWYU pragma: private, include "gmock/gmock.h" +// IWYU pragma: friend gmock/.* + +#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_ +#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_ + +#include // IWYU pragma: keep +#include // IWYU pragma: keep + +#include "gmock/gmock-spec-builders.h" +#include "gmock/internal/gmock-internal-utils.h" +#include "gmock/internal/gmock-pp.h" + +namespace testing { +namespace internal { +template +using identity_t = T; + +template +struct ThisRefAdjuster { + template + using AdjustT = typename std::conditional< + std::is_const::type>::value, + typename std::conditional::value, + const T&, const T&&>::type, + typename std::conditional::value, T&, + T&&>::type>::type; + + template + static AdjustT Adjust(const MockType& mock) { + return static_cast>(const_cast(mock)); + } +}; + +constexpr bool PrefixOf(const char* a, const char* b) { + return *a == 0 || (*a == *b && internal::PrefixOf(a + 1, b + 1)); +} + +template +constexpr bool StartsWith(const char (&prefix)[N], const char (&str)[M]) { + return N <= M && internal::PrefixOf(prefix, str); +} + +template +constexpr bool EndsWith(const char (&suffix)[N], const char (&str)[M]) { + return N <= M && internal::PrefixOf(suffix, str + M - N); +} + +template +constexpr bool Equals(const char (&a)[N], const char (&b)[M]) { + return N == M && internal::PrefixOf(a, b); +} + +template +constexpr bool ValidateSpec(const char (&spec)[N]) { + return internal::Equals("const", spec) || + internal::Equals("override", spec) || + internal::Equals("final", spec) || + internal::Equals("noexcept", spec) || + (internal::StartsWith("noexcept(", spec) && + internal::EndsWith(")", spec)) || + internal::Equals("ref(&)", spec) || + internal::Equals("ref(&&)", spec) || + (internal::StartsWith("Calltype(", spec) && + internal::EndsWith(")", spec)); +} + +} // namespace internal + +// The style guide prohibits "using" statements in a namespace scope +// inside a header file. However, the FunctionMocker class template +// is meant to be defined in the ::testing namespace. The following +// line is just a trick for working around a bug in MSVC 8.0, which +// cannot handle it if we define FunctionMocker in ::testing. +using internal::FunctionMocker; +} // namespace testing + +#define MOCK_METHOD(...) \ + GMOCK_INTERNAL_WARNING_PUSH() \ + GMOCK_INTERNAL_WARNING_CLANG(ignored, "-Wunused-member-function") \ + GMOCK_PP_VARIADIC_CALL(GMOCK_INTERNAL_MOCK_METHOD_ARG_, __VA_ARGS__) \ + GMOCK_INTERNAL_WARNING_POP() + +#define GMOCK_INTERNAL_MOCK_METHOD_ARG_1(...) \ + GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) + +#define GMOCK_INTERNAL_MOCK_METHOD_ARG_2(...) \ + GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) + +#define GMOCK_INTERNAL_MOCK_METHOD_ARG_3(_Ret, _MethodName, _Args) \ + GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, ()) + +#define GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, _Spec) \ + GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Args); \ + GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Spec); \ + GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \ + GMOCK_PP_NARG0 _Args, GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)); \ + GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \ + GMOCK_INTERNAL_MOCK_METHOD_IMPL( \ + GMOCK_PP_NARG0 _Args, _MethodName, GMOCK_INTERNAL_HAS_CONST(_Spec), \ + GMOCK_INTERNAL_HAS_OVERRIDE(_Spec), GMOCK_INTERNAL_HAS_FINAL(_Spec), \ + GMOCK_INTERNAL_GET_NOEXCEPT_SPEC(_Spec), \ + GMOCK_INTERNAL_GET_CALLTYPE_SPEC(_Spec), \ + GMOCK_INTERNAL_GET_REF_SPEC(_Spec), \ + (GMOCK_INTERNAL_SIGNATURE(_Ret, _Args))) + +#define GMOCK_INTERNAL_MOCK_METHOD_ARG_5(...) \ + GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) + +#define GMOCK_INTERNAL_MOCK_METHOD_ARG_6(...) \ + GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) + +#define GMOCK_INTERNAL_MOCK_METHOD_ARG_7(...) \ + GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) + +#define GMOCK_INTERNAL_WRONG_ARITY(...) \ + static_assert( \ + false, \ + "MOCK_METHOD must be called with 3 or 4 arguments. _Ret, " \ + "_MethodName, _Args and optionally _Spec. _Args and _Spec must be " \ + "enclosed in parentheses. If _Ret is a type with unprotected commas, " \ + "it must also be enclosed in parentheses.") + +#define GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Tuple) \ + static_assert( \ + GMOCK_PP_IS_ENCLOSED_PARENS(_Tuple), \ + GMOCK_PP_STRINGIZE(_Tuple) " should be enclosed in parentheses.") + +#define GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE(_N, ...) \ + static_assert( \ + std::is_function<__VA_ARGS__>::value, \ + "Signature must be a function type, maybe return type contains " \ + "unprotected comma."); \ + static_assert( \ + ::testing::tuple_size::ArgumentTuple>::value == _N, \ + "This method does not take " GMOCK_PP_STRINGIZE( \ + _N) " arguments. Parenthesize all types with unprotected commas.") + +#define GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \ + GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT, ~, _Spec) + +#define GMOCK_INTERNAL_MOCK_METHOD_IMPL(_N, _MethodName, _Constness, \ + _Override, _Final, _NoexceptSpec, \ + _CallType, _RefSpec, _Signature) \ + typename ::testing::internal::Function::Result \ + GMOCK_INTERNAL_EXPAND(_CallType) \ + _MethodName(GMOCK_PP_REPEAT(GMOCK_INTERNAL_PARAMETER, _Signature, _N)) \ + GMOCK_PP_IF(_Constness, const, ) \ + _RefSpec _NoexceptSpec GMOCK_PP_IF(_Override, override, ) \ + GMOCK_PP_IF(_Final, final, ) { \ + GMOCK_MOCKER_(_N, _Constness, _MethodName) \ + .SetOwnerAndName(this, #_MethodName); \ + return GMOCK_MOCKER_(_N, _Constness, _MethodName) \ + .Invoke(GMOCK_PP_REPEAT(GMOCK_INTERNAL_FORWARD_ARG, _Signature, _N)); \ + } \ + ::testing::MockSpec gmock_##_MethodName( \ + GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_PARAMETER, _Signature, _N)) \ + GMOCK_PP_IF(_Constness, const, ) _RefSpec { \ + GMOCK_MOCKER_(_N, _Constness, _MethodName).RegisterOwner(this); \ + return GMOCK_MOCKER_(_N, _Constness, _MethodName) \ + .With(GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_ARGUMENT, , _N)); \ + } \ + ::testing::MockSpec gmock_##_MethodName( \ + const ::testing::internal::WithoutMatchers&, \ + GMOCK_PP_IF(_Constness, const, )::testing::internal::Function< \ + GMOCK_PP_REMOVE_PARENS(_Signature)>*) const _RefSpec _NoexceptSpec { \ + return ::testing::internal::ThisRefAdjuster::Adjust(*this) \ + .gmock_##_MethodName(GMOCK_PP_REPEAT( \ + GMOCK_INTERNAL_A_MATCHER_ARGUMENT, _Signature, _N)); \ + } \ + mutable ::testing::FunctionMocker \ + GMOCK_MOCKER_(_N, _Constness, _MethodName) + +#define GMOCK_INTERNAL_EXPAND(...) __VA_ARGS__ + +// Valid modifiers. +#define GMOCK_INTERNAL_HAS_CONST(_Tuple) \ + GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_CONST, ~, _Tuple)) + +#define GMOCK_INTERNAL_HAS_OVERRIDE(_Tuple) \ + GMOCK_PP_HAS_COMMA( \ + GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_OVERRIDE, ~, _Tuple)) + +#define GMOCK_INTERNAL_HAS_FINAL(_Tuple) \ + GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_FINAL, ~, _Tuple)) + +#define GMOCK_INTERNAL_GET_NOEXCEPT_SPEC(_Tuple) \ + GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_NOEXCEPT_SPEC_IF_NOEXCEPT, ~, _Tuple) + +#define GMOCK_INTERNAL_NOEXCEPT_SPEC_IF_NOEXCEPT(_i, _, _elem) \ + GMOCK_PP_IF( \ + GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)), \ + _elem, ) + +#define GMOCK_INTERNAL_GET_CALLTYPE_SPEC(_Tuple) \ + GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_CALLTYPE_SPEC_IF_CALLTYPE, ~, _Tuple) + +#define GMOCK_INTERNAL_CALLTYPE_SPEC_IF_CALLTYPE(_i, _, _elem) \ + GMOCK_PP_IF( \ + GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CALLTYPE(_i, _, _elem)), \ + GMOCK_PP_CAT(GMOCK_INTERNAL_UNPACK_, _elem), ) + +#define GMOCK_INTERNAL_GET_REF_SPEC(_Tuple) \ + GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_REF_SPEC_IF_REF, ~, _Tuple) + +#define GMOCK_INTERNAL_REF_SPEC_IF_REF(_i, _, _elem) \ + GMOCK_PP_IF(GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_REF(_i, _, _elem)), \ + GMOCK_PP_CAT(GMOCK_INTERNAL_UNPACK_, _elem), ) + +#ifdef GMOCK_INTERNAL_STRICT_SPEC_ASSERT +#define GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT(_i, _, _elem) \ + static_assert( \ + ::testing::internal::ValidateSpec(GMOCK_PP_STRINGIZE(_elem)), \ + "Token \'" GMOCK_PP_STRINGIZE( \ + _elem) "\' cannot be recognized as a valid specification " \ + "modifier. Is a ',' missing?"); +#else +#define GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT(_i, _, _elem) \ + static_assert( \ + (GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem)) + \ + GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem)) + \ + GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem)) + \ + GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)) + \ + GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_REF(_i, _, _elem)) + \ + GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CALLTYPE(_i, _, _elem))) == 1, \ + GMOCK_PP_STRINGIZE( \ + _elem) " cannot be recognized as a valid specification modifier."); +#endif // GMOCK_INTERNAL_STRICT_SPEC_ASSERT + +// Modifiers implementation. +#define GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem) \ + GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_CONST_I_, _elem) + +#define GMOCK_INTERNAL_DETECT_CONST_I_const , + +#define GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem) \ + GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_OVERRIDE_I_, _elem) + +#define GMOCK_INTERNAL_DETECT_OVERRIDE_I_override , + +#define GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem) \ + GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_FINAL_I_, _elem) + +#define GMOCK_INTERNAL_DETECT_FINAL_I_final , + +#define GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem) \ + GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_NOEXCEPT_I_, _elem) + +#define GMOCK_INTERNAL_DETECT_NOEXCEPT_I_noexcept , + +#define GMOCK_INTERNAL_DETECT_REF(_i, _, _elem) \ + GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_REF_I_, _elem) + +#define GMOCK_INTERNAL_DETECT_REF_I_ref , + +#define GMOCK_INTERNAL_UNPACK_ref(x) x + +#define GMOCK_INTERNAL_DETECT_CALLTYPE(_i, _, _elem) \ + GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_CALLTYPE_I_, _elem) + +#define GMOCK_INTERNAL_DETECT_CALLTYPE_I_Calltype , + +#define GMOCK_INTERNAL_UNPACK_Calltype(...) __VA_ARGS__ + +// Note: The use of `identity_t` here allows _Ret to represent return types that +// would normally need to be specified in a different way. For example, a method +// returning a function pointer must be written as +// +// fn_ptr_return_t (*method(method_args_t...))(fn_ptr_args_t...) +// +// But we only support placing the return type at the beginning. To handle this, +// we wrap all calls in identity_t, so that a declaration will be expanded to +// +// identity_t method(method_args_t...) +// +// This allows us to work around the syntactic oddities of function/method +// types. +#define GMOCK_INTERNAL_SIGNATURE(_Ret, _Args) \ + ::testing::internal::identity_t( \ + GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GET_TYPE, _, _Args)) + +#define GMOCK_INTERNAL_GET_TYPE(_i, _, _elem) \ + GMOCK_PP_COMMA_IF(_i) \ + GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(_elem), GMOCK_PP_REMOVE_PARENS, \ + GMOCK_PP_IDENTITY) \ + (_elem) + +#define GMOCK_INTERNAL_PARAMETER(_i, _Signature, _) \ + GMOCK_PP_COMMA_IF(_i) \ + GMOCK_INTERNAL_ARG_O(_i, GMOCK_PP_REMOVE_PARENS(_Signature)) \ + gmock_a##_i + +#define GMOCK_INTERNAL_FORWARD_ARG(_i, _Signature, _) \ + GMOCK_PP_COMMA_IF(_i) \ + ::std::forward(gmock_a##_i) + +#define GMOCK_INTERNAL_MATCHER_PARAMETER(_i, _Signature, _) \ + GMOCK_PP_COMMA_IF(_i) \ + GMOCK_INTERNAL_MATCHER_O(_i, GMOCK_PP_REMOVE_PARENS(_Signature)) \ + gmock_a##_i + +#define GMOCK_INTERNAL_MATCHER_ARGUMENT(_i, _1, _2) \ + GMOCK_PP_COMMA_IF(_i) \ + gmock_a##_i + +#define GMOCK_INTERNAL_A_MATCHER_ARGUMENT(_i, _Signature, _) \ + GMOCK_PP_COMMA_IF(_i) \ + ::testing::A() + +#define GMOCK_INTERNAL_ARG_O(_i, ...) \ + typename ::testing::internal::Function<__VA_ARGS__>::template Arg<_i>::type + +#define GMOCK_INTERNAL_MATCHER_O(_i, ...) \ + const ::testing::Matcher::template Arg<_i>::type>& + +#define MOCK_METHOD0(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 0, __VA_ARGS__) +#define MOCK_METHOD1(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 1, __VA_ARGS__) +#define MOCK_METHOD2(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 2, __VA_ARGS__) +#define MOCK_METHOD3(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 3, __VA_ARGS__) +#define MOCK_METHOD4(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 4, __VA_ARGS__) +#define MOCK_METHOD5(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 5, __VA_ARGS__) +#define MOCK_METHOD6(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 6, __VA_ARGS__) +#define MOCK_METHOD7(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 7, __VA_ARGS__) +#define MOCK_METHOD8(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 8, __VA_ARGS__) +#define MOCK_METHOD9(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 9, __VA_ARGS__) +#define MOCK_METHOD10(m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(, , m, 10, __VA_ARGS__) + +#define MOCK_CONST_METHOD0(m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, , m, 0, __VA_ARGS__) +#define MOCK_CONST_METHOD1(m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, , m, 1, __VA_ARGS__) +#define MOCK_CONST_METHOD2(m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, , m, 2, __VA_ARGS__) +#define MOCK_CONST_METHOD3(m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, , m, 3, __VA_ARGS__) +#define MOCK_CONST_METHOD4(m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, , m, 4, __VA_ARGS__) +#define MOCK_CONST_METHOD5(m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, , m, 5, __VA_ARGS__) +#define MOCK_CONST_METHOD6(m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, , m, 6, __VA_ARGS__) +#define MOCK_CONST_METHOD7(m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, , m, 7, __VA_ARGS__) +#define MOCK_CONST_METHOD8(m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, , m, 8, __VA_ARGS__) +#define MOCK_CONST_METHOD9(m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, , m, 9, __VA_ARGS__) +#define MOCK_CONST_METHOD10(m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, , m, 10, __VA_ARGS__) + +#define MOCK_METHOD0_T(m, ...) MOCK_METHOD0(m, __VA_ARGS__) +#define MOCK_METHOD1_T(m, ...) MOCK_METHOD1(m, __VA_ARGS__) +#define MOCK_METHOD2_T(m, ...) MOCK_METHOD2(m, __VA_ARGS__) +#define MOCK_METHOD3_T(m, ...) MOCK_METHOD3(m, __VA_ARGS__) +#define MOCK_METHOD4_T(m, ...) MOCK_METHOD4(m, __VA_ARGS__) +#define MOCK_METHOD5_T(m, ...) MOCK_METHOD5(m, __VA_ARGS__) +#define MOCK_METHOD6_T(m, ...) MOCK_METHOD6(m, __VA_ARGS__) +#define MOCK_METHOD7_T(m, ...) MOCK_METHOD7(m, __VA_ARGS__) +#define MOCK_METHOD8_T(m, ...) MOCK_METHOD8(m, __VA_ARGS__) +#define MOCK_METHOD9_T(m, ...) MOCK_METHOD9(m, __VA_ARGS__) +#define MOCK_METHOD10_T(m, ...) MOCK_METHOD10(m, __VA_ARGS__) + +#define MOCK_CONST_METHOD0_T(m, ...) MOCK_CONST_METHOD0(m, __VA_ARGS__) +#define MOCK_CONST_METHOD1_T(m, ...) MOCK_CONST_METHOD1(m, __VA_ARGS__) +#define MOCK_CONST_METHOD2_T(m, ...) MOCK_CONST_METHOD2(m, __VA_ARGS__) +#define MOCK_CONST_METHOD3_T(m, ...) MOCK_CONST_METHOD3(m, __VA_ARGS__) +#define MOCK_CONST_METHOD4_T(m, ...) MOCK_CONST_METHOD4(m, __VA_ARGS__) +#define MOCK_CONST_METHOD5_T(m, ...) MOCK_CONST_METHOD5(m, __VA_ARGS__) +#define MOCK_CONST_METHOD6_T(m, ...) MOCK_CONST_METHOD6(m, __VA_ARGS__) +#define MOCK_CONST_METHOD7_T(m, ...) MOCK_CONST_METHOD7(m, __VA_ARGS__) +#define MOCK_CONST_METHOD8_T(m, ...) MOCK_CONST_METHOD8(m, __VA_ARGS__) +#define MOCK_CONST_METHOD9_T(m, ...) MOCK_CONST_METHOD9(m, __VA_ARGS__) +#define MOCK_CONST_METHOD10_T(m, ...) MOCK_CONST_METHOD10(m, __VA_ARGS__) + +#define MOCK_METHOD0_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 0, __VA_ARGS__) +#define MOCK_METHOD1_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 1, __VA_ARGS__) +#define MOCK_METHOD2_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 2, __VA_ARGS__) +#define MOCK_METHOD3_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 3, __VA_ARGS__) +#define MOCK_METHOD4_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 4, __VA_ARGS__) +#define MOCK_METHOD5_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 5, __VA_ARGS__) +#define MOCK_METHOD6_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 6, __VA_ARGS__) +#define MOCK_METHOD7_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 7, __VA_ARGS__) +#define MOCK_METHOD8_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 8, __VA_ARGS__) +#define MOCK_METHOD9_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 9, __VA_ARGS__) +#define MOCK_METHOD10_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 10, __VA_ARGS__) + +#define MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 0, __VA_ARGS__) +#define MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 1, __VA_ARGS__) +#define MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 2, __VA_ARGS__) +#define MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 3, __VA_ARGS__) +#define MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 4, __VA_ARGS__) +#define MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 5, __VA_ARGS__) +#define MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 6, __VA_ARGS__) +#define MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 7, __VA_ARGS__) +#define MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 8, __VA_ARGS__) +#define MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 9, __VA_ARGS__) +#define MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 10, __VA_ARGS__) + +#define MOCK_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_METHOD0_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_METHOD1_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_METHOD2_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_METHOD3_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_METHOD4_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_METHOD5_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_METHOD6_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_METHOD7_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_METHOD8_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_METHOD9_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_METHOD10_WITH_CALLTYPE(ct, m, __VA_ARGS__) + +#define MOCK_CONST_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \ + MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, __VA_ARGS__) + +#define GMOCK_INTERNAL_MOCK_METHODN(constness, ct, Method, args_num, ...) \ + GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \ + args_num, ::testing::internal::identity_t<__VA_ARGS__>); \ + GMOCK_INTERNAL_MOCK_METHOD_IMPL( \ + args_num, Method, GMOCK_PP_NARG0(constness), 0, 0, , ct, , \ + (::testing::internal::identity_t<__VA_ARGS__>)) + +#define GMOCK_MOCKER_(arity, constness, Method) \ + GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__) + +#endif // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_ diff --git a/vendor/googletest-1.14.0/googlemock/include/gmock/gmock-matchers.h b/vendor/googletest-1.14.0/googlemock/include/gmock/gmock-matchers.h new file mode 100644 index 00000000..0f677137 --- /dev/null +++ b/vendor/googletest-1.14.0/googlemock/include/gmock/gmock-matchers.h @@ -0,0 +1,5623 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Google Mock - a framework for writing C++ mock classes. +// +// The MATCHER* family of macros can be used in a namespace scope to +// define custom matchers easily. +// +// Basic Usage +// =========== +// +// The syntax +// +// MATCHER(name, description_string) { statements; } +// +// defines a matcher with the given name that executes the statements, +// which must return a bool to indicate if the match succeeds. Inside +// the statements, you can refer to the value being matched by 'arg', +// and refer to its type by 'arg_type'. +// +// The description string documents what the matcher does, and is used +// to generate the failure message when the match fails. Since a +// MATCHER() is usually defined in a header file shared by multiple +// C++ source files, we require the description to be a C-string +// literal to avoid possible side effects. It can be empty, in which +// case we'll use the sequence of words in the matcher name as the +// description. +// +// For example: +// +// MATCHER(IsEven, "") { return (arg % 2) == 0; } +// +// allows you to write +// +// // Expects mock_foo.Bar(n) to be called where n is even. +// EXPECT_CALL(mock_foo, Bar(IsEven())); +// +// or, +// +// // Verifies that the value of some_expression is even. +// EXPECT_THAT(some_expression, IsEven()); +// +// If the above assertion fails, it will print something like: +// +// Value of: some_expression +// Expected: is even +// Actual: 7 +// +// where the description "is even" is automatically calculated from the +// matcher name IsEven. +// +// Argument Type +// ============= +// +// Note that the type of the value being matched (arg_type) is +// determined by the context in which you use the matcher and is +// supplied to you by the compiler, so you don't need to worry about +// declaring it (nor can you). This allows the matcher to be +// polymorphic. For example, IsEven() can be used to match any type +// where the value of "(arg % 2) == 0" can be implicitly converted to +// a bool. In the "Bar(IsEven())" example above, if method Bar() +// takes an int, 'arg_type' will be int; if it takes an unsigned long, +// 'arg_type' will be unsigned long; and so on. +// +// Parameterizing Matchers +// ======================= +// +// Sometimes you'll want to parameterize the matcher. For that you +// can use another macro: +// +// MATCHER_P(name, param_name, description_string) { statements; } +// +// For example: +// +// MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } +// +// will allow you to write: +// +// EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); +// +// which may lead to this message (assuming n is 10): +// +// Value of: Blah("a") +// Expected: has absolute value 10 +// Actual: -9 +// +// Note that both the matcher description and its parameter are +// printed, making the message human-friendly. +// +// In the matcher definition body, you can write 'foo_type' to +// reference the type of a parameter named 'foo'. For example, in the +// body of MATCHER_P(HasAbsoluteValue, value) above, you can write +// 'value_type' to refer to the type of 'value'. +// +// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P$n to +// support multi-parameter matchers. +// +// Describing Parameterized Matchers +// ================================= +// +// The last argument to MATCHER*() is a string-typed expression. The +// expression can reference all of the matcher's parameters and a +// special bool-typed variable named 'negation'. When 'negation' is +// false, the expression should evaluate to the matcher's description; +// otherwise it should evaluate to the description of the negation of +// the matcher. For example, +// +// using testing::PrintToString; +// +// MATCHER_P2(InClosedRange, low, hi, +// std::string(negation ? "is not" : "is") + " in range [" + +// PrintToString(low) + ", " + PrintToString(hi) + "]") { +// return low <= arg && arg <= hi; +// } +// ... +// EXPECT_THAT(3, InClosedRange(4, 6)); +// EXPECT_THAT(3, Not(InClosedRange(2, 4))); +// +// would generate two failures that contain the text: +// +// Expected: is in range [4, 6] +// ... +// Expected: is not in range [2, 4] +// +// If you specify "" as the description, the failure message will +// contain the sequence of words in the matcher name followed by the +// parameter values printed as a tuple. For example, +// +// MATCHER_P2(InClosedRange, low, hi, "") { ... } +// ... +// EXPECT_THAT(3, InClosedRange(4, 6)); +// EXPECT_THAT(3, Not(InClosedRange(2, 4))); +// +// would generate two failures that contain the text: +// +// Expected: in closed range (4, 6) +// ... +// Expected: not (in closed range (2, 4)) +// +// Types of Matcher Parameters +// =========================== +// +// For the purpose of typing, you can view +// +// MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } +// +// as shorthand for +// +// template +// FooMatcherPk +// Foo(p1_type p1, ..., pk_type pk) { ... } +// +// When you write Foo(v1, ..., vk), the compiler infers the types of +// the parameters v1, ..., and vk for you. If you are not happy with +// the result of the type inference, you can specify the types by +// explicitly instantiating the template, as in Foo(5, +// false). As said earlier, you don't get to (or need to) specify +// 'arg_type' as that's determined by the context in which the matcher +// is used. You can assign the result of expression Foo(p1, ..., pk) +// to a variable of type FooMatcherPk. This +// can be useful when composing matchers. +// +// While you can instantiate a matcher template with reference types, +// passing the parameters by pointer usually makes your code more +// readable. If, however, you still want to pass a parameter by +// reference, be aware that in the failure message generated by the +// matcher you will see the value of the referenced object but not its +// address. +// +// Explaining Match Results +// ======================== +// +// Sometimes the matcher description alone isn't enough to explain why +// the match has failed or succeeded. For example, when expecting a +// long string, it can be very helpful to also print the diff between +// the expected string and the actual one. To achieve that, you can +// optionally stream additional information to a special variable +// named result_listener, whose type is a pointer to class +// MatchResultListener: +// +// MATCHER_P(EqualsLongString, str, "") { +// if (arg == str) return true; +// +// *result_listener << "the difference: " +/// << DiffStrings(str, arg); +// return false; +// } +// +// Overloading Matchers +// ==================== +// +// You can overload matchers with different numbers of parameters: +// +// MATCHER_P(Blah, a, description_string1) { ... } +// MATCHER_P2(Blah, a, b, description_string2) { ... } +// +// Caveats +// ======= +// +// When defining a new matcher, you should also consider implementing +// MatcherInterface or using MakePolymorphicMatcher(). These +// approaches require more work than the MATCHER* macros, but also +// give you more control on the types of the value being matched and +// the matcher parameters, which may leads to better compiler error +// messages when the matcher is used wrong. They also allow +// overloading matchers based on parameter types (as opposed to just +// based on the number of parameters). +// +// MATCHER*() can only be used in a namespace scope as templates cannot be +// declared inside of a local class. +// +// More Information +// ================ +// +// To learn more about using these macros, please search for 'MATCHER' +// on +// https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md +// +// This file also implements some commonly used argument matchers. More +// matchers can be defined by the user implementing the +// MatcherInterface interface if necessary. +// +// See googletest/include/gtest/gtest-matchers.h for the definition of class +// Matcher, class MatcherInterface, and others. + +// IWYU pragma: private, include "gmock/gmock.h" +// IWYU pragma: friend gmock/.* + +#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ +#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // NOLINT +#include +#include +#include +#include +#include + +#include "gmock/internal/gmock-internal-utils.h" +#include "gmock/internal/gmock-port.h" +#include "gmock/internal/gmock-pp.h" +#include "gtest/gtest.h" + +// MSVC warning C5046 is new as of VS2017 version 15.8. +#if defined(_MSC_VER) && _MSC_VER >= 1915 +#define GMOCK_MAYBE_5046_ 5046 +#else +#define GMOCK_MAYBE_5046_ +#endif + +GTEST_DISABLE_MSC_WARNINGS_PUSH_( + 4251 GMOCK_MAYBE_5046_ /* class A needs to have dll-interface to be used by + clients of class B */ + /* Symbol involving type with internal linkage not defined */) + +namespace testing { + +// To implement a matcher Foo for type T, define: +// 1. a class FooMatcherImpl that implements the +// MatcherInterface interface, and +// 2. a factory function that creates a Matcher object from a +// FooMatcherImpl*. +// +// The two-level delegation design makes it possible to allow a user +// to write "v" instead of "Eq(v)" where a Matcher is expected, which +// is impossible if we pass matchers by pointers. It also eases +// ownership management as Matcher objects can now be copied like +// plain values. + +// A match result listener that stores the explanation in a string. +class StringMatchResultListener : public MatchResultListener { + public: + StringMatchResultListener() : MatchResultListener(&ss_) {} + + // Returns the explanation accumulated so far. + std::string str() const { return ss_.str(); } + + // Clears the explanation accumulated so far. + void Clear() { ss_.str(""); } + + private: + ::std::stringstream ss_; + + StringMatchResultListener(const StringMatchResultListener&) = delete; + StringMatchResultListener& operator=(const StringMatchResultListener&) = + delete; +}; + +// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION +// and MUST NOT BE USED IN USER CODE!!! +namespace internal { + +// The MatcherCastImpl class template is a helper for implementing +// MatcherCast(). We need this helper in order to partially +// specialize the implementation of MatcherCast() (C++ allows +// class/struct templates to be partially specialized, but not +// function templates.). + +// This general version is used when MatcherCast()'s argument is a +// polymorphic matcher (i.e. something that can be converted to a +// Matcher but is not one yet; for example, Eq(value)) or a value (for +// example, "hello"). +template +class MatcherCastImpl { + public: + static Matcher Cast(const M& polymorphic_matcher_or_value) { + // M can be a polymorphic matcher, in which case we want to use + // its conversion operator to create Matcher. Or it can be a value + // that should be passed to the Matcher's constructor. + // + // We can't call Matcher(polymorphic_matcher_or_value) when M is a + // polymorphic matcher because it'll be ambiguous if T has an implicit + // constructor from M (this usually happens when T has an implicit + // constructor from any type). + // + // It won't work to unconditionally implicit_cast + // polymorphic_matcher_or_value to Matcher because it won't trigger + // a user-defined conversion from M to T if one exists (assuming M is + // a value). + return CastImpl(polymorphic_matcher_or_value, + std::is_convertible>{}, + std::is_convertible{}); + } + + private: + template + static Matcher CastImpl(const M& polymorphic_matcher_or_value, + std::true_type /* convertible_to_matcher */, + std::integral_constant) { + // M is implicitly convertible to Matcher, which means that either + // M is a polymorphic matcher or Matcher has an implicit constructor + // from M. In both cases using the implicit conversion will produce a + // matcher. + // + // Even if T has an implicit constructor from M, it won't be called because + // creating Matcher would require a chain of two user-defined conversions + // (first to create T from M and then to create Matcher from T). + return polymorphic_matcher_or_value; + } + + // M can't be implicitly converted to Matcher, so M isn't a polymorphic + // matcher. It's a value of a type implicitly convertible to T. Use direct + // initialization to create a matcher. + static Matcher CastImpl(const M& value, + std::false_type /* convertible_to_matcher */, + std::true_type /* convertible_to_T */) { + return Matcher(ImplicitCast_(value)); + } + + // M can't be implicitly converted to either Matcher or T. Attempt to use + // polymorphic matcher Eq(value) in this case. + // + // Note that we first attempt to perform an implicit cast on the value and + // only fall back to the polymorphic Eq() matcher afterwards because the + // latter calls bool operator==(const Lhs& lhs, const Rhs& rhs) in the end + // which might be undefined even when Rhs is implicitly convertible to Lhs + // (e.g. std::pair vs. std::pair). + // + // We don't define this method inline as we need the declaration of Eq(). + static Matcher CastImpl(const M& value, + std::false_type /* convertible_to_matcher */, + std::false_type /* convertible_to_T */); +}; + +// This more specialized version is used when MatcherCast()'s argument +// is already a Matcher. This only compiles when type T can be +// statically converted to type U. +template +class MatcherCastImpl> { + public: + static Matcher Cast(const Matcher& source_matcher) { + return Matcher(new Impl(source_matcher)); + } + + private: + class Impl : public MatcherInterface { + public: + explicit Impl(const Matcher& source_matcher) + : source_matcher_(source_matcher) {} + + // We delegate the matching logic to the source matcher. + bool MatchAndExplain(T x, MatchResultListener* listener) const override { + using FromType = typename std::remove_cv::type>::type>::type; + using ToType = typename std::remove_cv::type>::type>::type; + // Do not allow implicitly converting base*/& to derived*/&. + static_assert( + // Do not trigger if only one of them is a pointer. That implies a + // regular conversion and not a down_cast. + (std::is_pointer::type>::value != + std::is_pointer::type>::value) || + std::is_same::value || + !std::is_base_of::value, + "Can't implicitly convert from to "); + + // Do the cast to `U` explicitly if necessary. + // Otherwise, let implicit conversions do the trick. + using CastType = + typename std::conditional::value, + T&, U>::type; + + return source_matcher_.MatchAndExplain(static_cast(x), + listener); + } + + void DescribeTo(::std::ostream* os) const override { + source_matcher_.DescribeTo(os); + } + + void DescribeNegationTo(::std::ostream* os) const override { + source_matcher_.DescribeNegationTo(os); + } + + private: + const Matcher source_matcher_; + }; +}; + +// This even more specialized version is used for efficiently casting +// a matcher to its own type. +template +class MatcherCastImpl> { + public: + static Matcher Cast(const Matcher& matcher) { return matcher; } +}; + +// Template specialization for parameterless Matcher. +template +class MatcherBaseImpl { + public: + MatcherBaseImpl() = default; + + template + operator ::testing::Matcher() const { // NOLINT(runtime/explicit) + return ::testing::Matcher(new + typename Derived::template gmock_Impl()); + } +}; + +// Template specialization for Matcher with parameters. +template