summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Cole <david.cole@kitware.com>2011-01-27 20:45:25 (GMT)
committerDavid Cole <david.cole@kitware.com>2011-01-27 23:28:36 (GMT)
commit008d116b1767cb93c043e399ab607bcc8db5c175 (patch)
treebdce62f475073f365cfdc5fe291dcd2c2fc9c9de
parent8f9919d93cad64de58775e4a7609b0ffb37d061e (diff)
downloadCMake-008d116b1767cb93c043e399ab607bcc8db5c175.zip
CMake-008d116b1767cb93c043e399ab607bcc8db5c175.tar.gz
CMake-008d116b1767cb93c043e399ab607bcc8db5c175.tar.bz2
VSResource: Avoid windres /D with quoted spaces (#11695)
Improve test: print out what's happening along the way.
-rw-r--r--Tests/VSResource/CMakeLists.txt25
-rw-r--r--Tests/VSResource/main.cpp84
-rw-r--r--Tests/VSResource/test.rc11
-rw-r--r--Tests/VSResource/test.txt2
4 files changed, 109 insertions, 13 deletions
diff --git a/Tests/VSResource/CMakeLists.txt b/Tests/VSResource/CMakeLists.txt
index 5fbd572..5d7d14e 100644
--- a/Tests/VSResource/CMakeLists.txt
+++ b/Tests/VSResource/CMakeLists.txt
@@ -5,12 +5,31 @@ string(REPLACE "/INCREMENTAL:YES" ""
CMAKE_EXE_LINKER_FLAGS_DEBUG
"${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
-if(MSVC60 OR CYGWIN)
- # VS6 and Cygwin rc compilers do not deal well with spaces in a "/D" value
+message(STATUS "CMAKE_RC_COMPILER='${CMAKE_RC_COMPILER}'")
+
+# Because of the following avoidance techniques required for windres and VS6,
+# we recommend using a configured header file, and defining preprocessor
+# symbols via #define code and including that header in the rc file. Using
+# add_definitions is fine for simple definitions (with no spaces and no
+# quoting), but requires avoidance or work-arounds beyond that...
+
+if(CMAKE_RC_COMPILER MATCHES windres)
+ # windres rc compiler does not properly define quoted /D values as strings
+ message(STATUS "CMAKE_RC_COMPILER MATCHES windres")
+ add_definitions(/DCMAKE_RCDEFINE=test.txt)
+ add_definitions(/DCMAKE_RCDEFINE_NO_QUOTED_STRINGS)
+elseif(MSVC60)
+ # VS6 rc compiler does not deal well with spaces in a "/D" value, but it can
+ # handle the quoting
+ message(STATUS "MSVC60")
add_definitions(/DCMAKE_RCDEFINE="test.txt")
else()
+ # expected case -- rc compiler is "capable enough"
+ message(STATUS
+ "rc compiler handles quoted strings with spaces in values via /D")
+ set(TEXTFILE_FROM_SOURCE_DIR "textfile, spaces in name, from binary dir")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/test.txt
- "${CMAKE_CURRENT_BINARY_DIR}/test with spaces.txt" COPYONLY)
+ "${CMAKE_CURRENT_BINARY_DIR}/test with spaces.txt" @ONLY)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_definitions(/DCMAKE_RCDEFINE="test with spaces.txt")
endif()
diff --git a/Tests/VSResource/main.cpp b/Tests/VSResource/main.cpp
index 6f68df3..7ee0c74 100644
--- a/Tests/VSResource/main.cpp
+++ b/Tests/VSResource/main.cpp
@@ -1,10 +1,80 @@
#include <windows.h>
+#include <stdio.h>
-int main(int argc, char** argv) {
- HRSRC hello = ::FindResource(0, "hello", "TEXT");
- if(hello) {
- return 0;
- } else {
- return 1;
- }
+struct x
+{
+ const char *txt;
+};
+
+int main(int argc, char** argv)
+{
+ int ret = 1;
+
+ fprintf(stdout, "CTEST_FULL_OUTPUT (Avoid ctest truncation of output)\n");
+
+#ifdef CMAKE_RCDEFINE
+ fprintf(stdout, "CMAKE_RCDEFINE defined\n");
+#endif
+
+#ifdef CMAKE_RCDEFINE_NO_QUOTED_STRINGS
+ // Expect CMAKE_RCDEFINE to preprocess to exactly test.txt
+ x test;
+ test.txt = "*exactly* test.txt";
+ fprintf(stdout, "CMAKE_RCDEFINE_NO_QUOTED_STRINGS defined\n");
+ fprintf(stdout, "CMAKE_RCDEFINE is %s, and is *not* a string constant\n",
+ CMAKE_RCDEFINE);
+#else
+ // Expect CMAKE_RCDEFINE to be a string:
+ fprintf(stdout, "CMAKE_RCDEFINE='%s', and is a string constant\n",
+ CMAKE_RCDEFINE);
+#endif
+
+ HRSRC hello = ::FindResource(NULL, MAKEINTRESOURCE(1025), "TEXTFILE");
+ if(hello)
+ {
+ fprintf(stdout, "FindResource worked\n");
+ HGLOBAL hgbl = ::LoadResource(NULL, hello);
+ int datasize = (int) ::SizeofResource(NULL, hello);
+ if(hgbl && datasize>0)
+ {
+ fprintf(stdout, "LoadResource worked\n");
+ fprintf(stdout, "SizeofResource returned datasize='%d'\n", datasize);
+ void *data = ::LockResource(hgbl);
+ if (data)
+ {
+ fprintf(stdout, "LockResource worked\n");
+ char *str = (char *) malloc(datasize+4);
+ if (str)
+ {
+ memcpy(str, data, datasize);
+ str[datasize] = 'E';
+ str[datasize+1] = 'O';
+ str[datasize+2] = 'R';
+ str[datasize+3] = 0;
+ fprintf(stdout, "str='%s'\n", str);
+ free(str);
+
+ ret = 0;
+
+#ifdef CMAKE_RCDEFINE_NO_QUOTED_STRINGS
+ fprintf(stdout, "LoadString skipped\n");
+#else
+ char buf[256];
+ if (::LoadString(NULL, 1026, buf, sizeof(buf)) > 0)
+ {
+ fprintf(stdout, "LoadString worked\n");
+ fprintf(stdout, "buf='%s'\n", buf);
+ }
+ else
+ {
+ fprintf(stdout, "LoadString failed\n");
+ ret = 1;
+ }
+#endif
+ }
+ }
+ }
+ }
+
+ return ret;
}
diff --git a/Tests/VSResource/test.rc b/Tests/VSResource/test.rc
index 2e87a68..4ce4b53 100644
--- a/Tests/VSResource/test.rc
+++ b/Tests/VSResource/test.rc
@@ -1,10 +1,17 @@
#ifdef CMAKE_RCDEFINE
-hello TEXT DISCARDABLE CMAKE_RCDEFINE
+// This line can compile with either an unquoted or a quoted string
+1025 TEXTFILE CMAKE_RCDEFINE
+
+#ifndef CMAKE_RCDEFINE_NO_QUOTED_STRINGS
+// This block can only be compiled if CMAKE_RCDEFINE preprocesses
+// to a double quoted string
STRINGTABLE
BEGIN
- 1 CMAKE_RCDEFINE
+ 1026 CMAKE_RCDEFINE
END
+#endif
+
#else
#error "resource compiler did not get defines from command line!"
#endif
diff --git a/Tests/VSResource/test.txt b/Tests/VSResource/test.txt
index 980a0d5..c27c68d 100644
--- a/Tests/VSResource/test.txt
+++ b/Tests/VSResource/test.txt
@@ -1 +1 @@
-Hello World!
+Hello World! (@TEXTFILE_FROM_SOURCE_DIR@)