| cmake_minimum_required(VERSION 3.10) | |
| project(StringFileTest) | |
| include_directories(${StringFileTest_BINARY_DIR}) | |
| # Read file test | |
| file(READ "${CMAKE_CURRENT_SOURCE_DIR}/InputFile.h.in" infile) | |
| # Test reading a binary file into hex representation | |
| file(READ "${CMAKE_CURRENT_SOURCE_DIR}/test.bin" hexContents HEX) | |
| if("${hexContents}" STREQUAL "0001027700") | |
| message("file(READ HEX) correctly read [${hexContents}]") | |
| else() | |
| message(SEND_ERROR "file(READ HEX) incorrectly read [${hexContents}], but expected was [0001027700]") | |
| endif() | |
| # file(STRINGS) test | |
| file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/InputFile.h.in" infile_strings | |
| LIMIT_COUNT 1 LIMIT_INPUT 1024 LIMIT_OUTPUT 1024 | |
| LENGTH_MINIMUM 10 LENGTH_MAXIMUM 23 REGEX include NEWLINE_CONSUME) | |
| set(infile_strings_goal "#include \"includefile\"\n") | |
| if("${infile_strings}" STREQUAL "${infile_strings_goal}") | |
| message("file(STRINGS) correctly read [${infile_strings}]") | |
| else() | |
| message(SEND_ERROR | |
| "file(STRINGS) incorrectly read [${infile_strings}]") | |
| endif() | |
| # test reading a file and getting its binary data as hex string | |
| file(READ "${CMAKE_CURRENT_SOURCE_DIR}/main.srec" infilehex LIMIT 4 HEX) | |
| if(NOT "${infilehex}" STREQUAL "53313036") | |
| message(SEND_ERROR | |
| "file(READ ... HEX) error, read: \"${infilehex}\", expected \"53313036\"") | |
| endif() | |
| # test that file(STRINGS) also work with Intel hex and Motorola S-record files | |
| # this file has been created with "sdcc main.c" | |
| file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/main.ihx" infile_strings REGEX INFO) | |
| set(infile_strings_goal "INFO:compiler\\[SDCC-HEX\\]") | |
| if("${infile_strings}" MATCHES "${infile_strings_goal}") | |
| message("file(STRINGS) correctly read from hex file [${infile_strings}]") | |
| else() | |
| message(SEND_ERROR | |
| "file(STRINGS) incorrectly read from hex file [${infile_strings}]") | |
| endif() | |
| # this file has been created with "sdcc main.c --out-fmt-s19" | |
| file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/main.srec" infile_strings REGEX INFO) | |
| set(infile_strings_goal "INFO:compiler\\[SDCC-SREC\\]") | |
| if("${infile_strings}" MATCHES "${infile_strings_goal}") | |
| message("file(STRINGS) correctly read from srec file [${infile_strings}]") | |
| else() | |
| message(SEND_ERROR | |
| "file(STRINGS) incorrectly read from srec file [${infile_strings}]") | |
| endif() | |
| # this file is crafted to contain the maximum line length and trigger a buffer | |
| # overflow | |
| file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/s1-max-length.srec" infile_strings) | |
| #this file has utf-8 content | |
| file(STRINGS test.utf8 infile_strings ENCODING UTF-8) | |
| list(LENGTH infile_strings content_len) | |
| if(content_len MATCHES "3") | |
| message("file(STRINGS) correctly read from utf8 file [${infile_strings}]") | |
| else() | |
| message(SEND_ERROR | |
| "file(STRINGS) incorrectly read from utf8 file [${infile_strings}]") | |
| endif() | |
| # String test | |
| string(REGEX MATCH "[cC][mM][aA][kK][eE]" rmvar "CMake is great") | |
| string(REGEX MATCHALL "[cC][mM][aA][kK][eE]" rmallvar "CMake is better than cmake or CMake") | |
| string(REGEX REPLACE "[Aa][uU][tT][oO]([cC][oO][nN][fF]|[mM][aA][kK][eE])" | |
| "CMake" rrepvar "People should use Autoconf and Automake") | |
| string(COMPARE EQUAL "CMake" "Autoconf" nceqvar) | |
| string(COMPARE EQUAL "CMake" "CMake" ceqvar) | |
| string(COMPARE NOTEQUAL "CMake" "Autoconf" cneqvar) | |
| string(COMPARE NOTEQUAL "CMake" "CMake" ncneqvar) | |
| string(COMPARE LESS "before" "after" nclvar) | |
| string(COMPARE LESS "max" "min" clvar) | |
| string(COMPARE GREATER "before" "after" cgvar) | |
| string(COMPARE GREATER "max" "min" ncgvar) | |
| string(ASCII 67 109 97 107 101 savar) | |
| string(TOUPPER "CMake" tuvar) | |
| string(TOLOWER "CMake" tlvar) | |
| string(REPLACE "Autoconf" "CMake" repvar "People should use Autoconf") | |
| if("abc" STREQUAL "xyz") | |
| message(SEND_ERROR "Problem with the if(STREQUAL), \"abc\" and \"xyz\" considered equal") | |
| endif() | |
| if("CMake is cool" MATCHES "(CMake) (is).+") | |
| if(NOT "${CMAKE_MATCH_0}" STREQUAL "CMake is cool") | |
| message(SEND_ERROR "CMAKE_MATCH_0 wrong: \"${CMAKE_MATCH_0}\", expected \"CMake is cool\"") | |
| endif() | |
| if(NOT "${CMAKE_MATCH_1}" STREQUAL "CMake") | |
| message(SEND_ERROR "CMAKE_MATCH_1 wrong: \"${CMAKE_MATCH_1}\", expected \"CMake\"") | |
| endif() | |
| if(NOT "${CMAKE_MATCH_2}" STREQUAL "is") | |
| message(SEND_ERROR "CMAKE_MATCH_2 wrong: \"${CMAKE_MATCH_2}\", expected \"is\"") | |
| endif() | |
| else() | |
| message(SEND_ERROR "Problem with the if(MATCHES), no match found") | |
| endif() | |
| string(REGEX MATCH "(People).+CMake" matchResultVar "People should use CMake") | |
| if(NOT "${matchResultVar}" STREQUAL "People should use CMake") | |
| message(SEND_ERROR "string(REGEX MATCH) problem: \"${matchResultVar}\", expected \"People should use CMake\"") | |
| endif() | |
| if(NOT "${CMAKE_MATCH_0}" STREQUAL "People should use CMake") | |
| message(SEND_ERROR "CMAKE_MATCH_0 wrong: \"${CMAKE_MATCH_0}\", expected \"People should use CMake\"") | |
| endif() | |
| if(NOT "${CMAKE_MATCH_1}" STREQUAL "People") | |
| message(SEND_ERROR "CMAKE_MATCH_1 wrong: \"${CMAKE_MATCH_1}\", expected \"People\"") | |
| endif() | |
| if(NOT "${CMAKE_MATCH_2}" STREQUAL "") | |
| message(SEND_ERROR "CMAKE_MATCH_2 wrong: \"${CMAKE_MATCH_2}\", expected empty string") | |
| endif() | |
| set(regex_quote "ab|c+12?3[x-z]$(y)\\t\\r\\n.cma*ke^[:alpha:]") | |
| string(REGEX QUOTE regex_quote_output "${regex_quote}") | |
| if(NOT regex_quote MATCHES "^${regex_quote_output}$") | |
| message(SEND_ERROR "string(REGEX QUOTE) problem: \"${regex_quote}\" does not match against \"^${regex_quote_output}$\"") | |
| endif() | |
| string(REPLACE "." "a" nomatch_regex_quote "${regex_quote}") | |
| if(nomatch_regex_quote MATCHES "^${regex_quote_output}$") | |
| message(SEND_ERROR "string(REGEX QUOTE) problem: \"${nomatch_regex_quote}\" matches against \"^${regex_quote_output}$\"") | |
| endif() | |
| string(REGEX QUOTE multi_regex_quote ${regex_quote} ${regex_quote}) | |
| if(NOT "${regex_quote}${regex_quote}" MATCHES "^${multi_regex_quote}$") | |
| message(SEND_ERROR "string(REGEX QUOTE) problem: \"${regex_quote}${regex_quote}\" does not match against \"^${multi_regex_quote}$\"") | |
| endif() | |
| string(STRIP " | |
| ST1 | |
| " ST1) | |
| string(STRIP "ST2 " ST2) | |
| string(STRIP " ST3" ST3) | |
| foreach(var ST1 ST2 ST3) | |
| if("x${var}" STREQUAL "x${${var}}") | |
| message("[${var}] == [${${var}}]") | |
| else() | |
| message(SEND_ERROR "Problem with the STRIP command for ${var}: [${${var}}]") | |
| endif() | |
| endforeach() | |
| string(SUBSTRING "People should use Autoconf" 7 10 substringres) | |
| set(substringres "Everybody ${substringres} CMake") | |
| string(LENGTH ${substringres} lengthres) | |
| file(RELATIVE_PATH relpath "/usr/local/bin" "/usr/X11R6/bin/xnest") | |
| # Make-style unquoted argument test | |
| set(var $(VAR1)$(VAR2)/$(VAR3)) | |
| message("Output: [${var}]") | |
| string(COMPARE EQUAL "${var}" "$(VAR1)$(VAR2)/$(VAR3)" result) | |
| if(NOT result) | |
| message(SEND_ERROR "Unquoted $(VAR) syntax is broken.") | |
| endif() | |
| # Make directories test | |
| file(MAKE_DIRECTORY | |
| "${CMAKE_CURRENT_BINARY_DIR}/Includes" | |
| "${CMAKE_CURRENT_BINARY_DIR}/Directory1" | |
| "${CMAKE_CURRENT_BINARY_DIR}/Directory2" | |
| ) | |
| # Write results to the file (test write file) | |
| set(file "${CMAKE_CURRENT_BINARY_DIR}/Includes/Values.h") | |
| file(WRITE "${file}" "/* this file is generated */\n") | |
| foreach(var | |
| rmvar | |
| rmallvar | |
| rrepvar | |
| repvar | |
| relpath | |
| substringres | |
| lengthres | |
| nceqvar | |
| ceqvar | |
| cneqvar | |
| ncneqvar | |
| nclvar | |
| clvar | |
| cgvar | |
| ncgvar | |
| savar | |
| tuvar | |
| tlvar) | |
| file(APPEND "${file}" "#define ${var} \"${${var}}\"\n") | |
| endforeach() | |
| # Verify that the file was created recently. | |
| if(NOT "${file}" IS_NEWER_THAN "${CMAKE_CURRENT_SOURCE_DIR}/InputFile.h.in") | |
| message(FATAL_ERROR "if(FILE_IS_NEWER) does not seem to work.") | |
| endif() | |
| # Test configuration of the string | |
| set(TEST_DEFINED 123) | |
| set(TEST_NOT_DEFINED) | |
| string(CONFIGURE "${infile}" infile+-/out @ONLY) | |
| set(infile "${infile+-/out}") | |
| # Write include file to a file | |
| string(REGEX REPLACE "includefile" "Includes/Values.h" outfile "${infile}") | |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/OutputFile.h-tmp" "${outfile}") | |
| file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/OutputFile.h-tmp" | |
| "${CMAKE_CURRENT_BINARY_DIR}/OutputFile.h") | |
| # Test file copy with relative paths | |
| file(COPY . | |
| DESTINATION src | |
| FILE_PERMISSIONS OWNER_READ # test no OWNER_WRITE | |
| DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE | |
| FILES_MATCHING PATTERN *.cxx # Only copy the main source file | |
| REGEX /src$ EXCLUDE # Block recursion for in-source build | |
| ) | |
| # Test file glob | |
| file(GLOB_RECURSE src_files "${CMAKE_CURRENT_SOURCE_DIR}/*") | |
| message("Files in ${CMAKE_CURRENT_SOURCE_DIR} are ${src_files}") | |
| set(expr "${CMAKE_CURRENT_BINARY_DIR}/src/[sS][!a-su-zA-Z0-9][^a-qs-zA-Z0-9]ing?ile*.cxx") | |
| message("Glob expression is [${expr}].") | |
| file(GLOB src_files "${expr}") | |
| message("Globbed files [${src_files}].") | |
| add_executable(StringFileTest ${src_files}) | |
| set(expr "${CMAKE_CURRENT_SOURCE_DIR}/../*.cxx") | |
| file(GLOB_RECURSE rel_src_files RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/.." "${expr}") | |
| message("Globbed files [${rel_src_files}].") | |
| # Test FOREACH range | |
| message("Cheack if FOREACH with RANGE works") | |
| macro(TEST_RANGE ARGS CHECK) | |
| set(r) | |
| foreach(a RANGE ${ARGS}) | |
| set(r ${r} ${a}) | |
| endforeach() | |
| message("FOREACH with RANGE ${ARGS} produces ${r}") | |
| if("x${r}x" MATCHES "^x${CHECK}x$") | |
| else() | |
| message(SEND_ERROR "The range resulted in: ${r} should be ${CHECK}") | |
| endif() | |
| endmacro() | |
| TEST_RANGE("5" "0;1;2;3;4;5") | |
| TEST_RANGE("3;5" "3;4;5") | |
| TEST_RANGE("5;3" "5;4;3") | |
| TEST_RANGE("3;10;2" "3;5;7;9") | |
| TEST_RANGE("10;0;-3" "10;7;4;1") | |
| # Test FOREACH IN signature | |
| set(list1 "" a "") | |
| set(list2 a "" b) | |
| set(var_) | |
| set(var_a) | |
| set(var_b) | |
| foreach(item IN LISTS list1 list2 ITEMS "" a "") | |
| set(var_${item} "${var_${item}}x") | |
| endforeach() | |
| if(NOT "${var_}" STREQUAL "xxxxx") | |
| message(FATAL_ERROR "count incorrect for \"\": [${var_}]") | |
| endif() | |
| if(NOT "${var_a}" STREQUAL "xxx") | |
| message(FATAL_ERROR "count incorrect for \"a\": [${var_a}]") | |
| endif() | |
| if(NOT "${var_b}" STREQUAL "x") | |
| message(FATAL_ERROR "count incorrect \"b\": [${var_b}]") | |
| endif() | |
| # Test SUBSTRING command | |
| set(ST_INPUTSTRING "0123456789") | |
| string(SUBSTRING ${ST_INPUTSTRING} 3 0 ST_EMPTY) | |
| string(SUBSTRING ${ST_INPUTSTRING} 1 1 ST_ONE) | |
| string(SUBSTRING ${ST_INPUTSTRING} 0 10 ST_ALL) | |
| string(SUBSTRING ${ST_INPUTSTRING} 0 -1 ST_ALL_MINUS) | |
| string(SUBSTRING ${ST_INPUTSTRING} 9 -1 ST_NINE) | |
| if(ST_EMPTY) | |
| message(SEND_ERROR "SUBSTRING with length 0 does not return an empty string") | |
| endif() | |
| if(NOT ST_ONE STREQUAL "1") | |
| message(SEND_ERROR "SUBSTING command does not cut the correct selected character, was \"" ${ST_ONE} "\", should be \"1\"") | |
| endif() | |
| if(NOT ST_INPUTSTRING STREQUAL ST_ALL) | |
| message(SEND_ERROR "SUBSTRING does not return the whole string when selected with length") | |
| endif() | |
| if(NOT ST_INPUTSTRING STREQUAL ST_ALL_MINUS) | |
| message(SEND_ERROR "SUBSTRING does not return the whole string when selected with -1") | |
| endif() | |
| if(NOT ST_NINE STREQUAL "9") | |
| message(SEND_ERROR "SUBSTRING does not return the tail when selected with -1") | |
| endif() | |
| string(MAKE_C_IDENTIFIER "1one-two$" MCI_1) | |
| if(NOT MCI_1 STREQUAL _1one_two_) | |
| message(SEND_ERROR "MAKE_C_IDENTIFIER did not create expected result.") | |
| endif() | |
| string(GENEX_STRIP "one;$<1:two;three>;four;$<TARGET_OBJECTS:some_target>" strip_result) | |
| if (NOT strip_result STREQUAL "one;four") | |
| message(SEND_ERROR "GENEX_STRIP did not create expected result: ${strip_result}") | |
| endif() |