diff --git a/reactos/CMakeLists.txt b/reactos/CMakeLists.txt index 661c5389d68..3b2cfc46ca0 100644 --- a/reactos/CMakeLists.txt +++ b/reactos/CMakeLists.txt @@ -85,9 +85,9 @@ if(NOT CMAKE_CROSSCOMPILING) add_subdirectory(lib) if(NOT MSVC) - export(TARGETS bin2c cat widl gendib cabman cdmake mkhive obj2bin spec2def geninc rsym mkshelllink utf16le FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- ) + export(TARGETS bin2c widl gendib cabman cdmake mkhive obj2bin spec2def geninc rsym mkshelllink utf16le FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- ) else() - export(TARGETS bin2c cat widl gendib cabman cdmake mkhive obj2bin spec2def geninc mkshelllink utf16le FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- ) + export(TARGETS bin2c widl gendib cabman cdmake mkhive obj2bin spec2def geninc mkshelllink utf16le FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- ) endif() else() diff --git a/reactos/cmake/CMakeMacros.cmake b/reactos/cmake/CMakeMacros.cmake index 5028dcf87b5..1def11f74a5 100644 --- a/reactos/cmake/CMakeMacros.cmake +++ b/reactos/cmake/CMakeMacros.cmake @@ -504,12 +504,27 @@ elseif(USE_FOLDER_STRUCTURE) endfunction() endif() -macro(concatenate_files _output) - add_custom_command( - OUTPUT ${_output} - COMMAND native-cat ${ARGN} > ${_output} - DEPENDS ${ARGN} native-cat) -endmacro() +if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") + function(concatenate_files _output _file1) + file(TO_NATIVE_PATH "${_output}" _real_output) + file(TO_NATIVE_PATH "${_file1}" _file_list) + foreach(_file ${ARGN}) + file(TO_NATIVE_PATH "${_file}" _real_file) + set(_file_list "${_file_list} + ${_real_file}") + endforeach() + add_custom_command( + OUTPUT ${_output} + COMMAND cmd.exe /C "copy /Y /B ${_file_list} ${_real_output} > nul" + DEPENDS ${_file1} ${ARGN}) + endfunction() +else() + macro(concatenate_files _output) + add_custom_command( + OUTPUT ${_output} + COMMAND cat ${ARGN} > ${_output} + DEPENDS ${ARGN}) + endmacro() +endif() function(add_importlibs _module) add_dependency_node(${_module}) diff --git a/reactos/tools/CMakeLists.txt b/reactos/tools/CMakeLists.txt index 245e893ec89..7c2981610ce 100644 --- a/reactos/tools/CMakeLists.txt +++ b/reactos/tools/CMakeLists.txt @@ -6,7 +6,6 @@ if(MSVC) endif() add_executable(bin2c bin2c.c) -add_executable(cat cat.c) add_executable(gendib gendib/gendib.c) add_executable(geninc geninc/geninc.c) add_executable(mkshelllink mkshelllink/mkshelllink.c) diff --git a/reactos/tools/cat.c b/reactos/tools/cat.c deleted file mode 100644 index f0530aaa4ad..00000000000 --- a/reactos/tools/cat.c +++ /dev/null @@ -1,128 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS conCATenation tool - * FILE: tools/cat.c - * PURPOSE: Concatenates STDIN or an arbitrary number of files to STDOUT - * PROGRAMMERS: David Welch - * Semyon Novikov (tappak) - * Hermès Bélusca - Maïto - */ - -#include - -#ifdef _WIN32 -#include -#else -#define O_TEXT 0x4000 -#define O_BINARY 0x8000 -#define setmode(fd, mode) // This function is useless in *nix world. -#define stricmp strcasecmp -#endif - -#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0])) - -void help(void) -{ - fprintf(stdout, - "\n" - "ReactOS File Concatenation Tool\n" - "\n" - "Usage: cat [options] [file [...]]\n" - "options - Currently ignored\n"); -} - -int main(int argc, char* argv[]) -{ - int i; - FILE* in; - unsigned char buff[512]; - size_t cnt, readcnt; - - if (argc >= 2) - { - if (stricmp(argv[1], "-h" ) == 0 || - stricmp(argv[1], "--help") == 0 || - stricmp(argv[1], "/?" ) == 0 || - stricmp(argv[1], "/help" ) == 0) - { - help(); - return 0; - } - } - - /* Set STDOUT to binary */ - setmode(fileno(stdout), O_BINARY); - - /* Special case where we run 'cat' without any argument: we use STDIN */ - if (argc <= 1) - { - unsigned int ch; - - /* Set STDIN to binary */ - setmode(fileno(stdin), O_BINARY); - -#if 0 // Version using feof() - ch = fgetc(stdin); - while (!feof(stdin)) - { - putchar(ch); - ch = fgetc(stdin); - } -#else - while ((ch = fgetc(stdin)) != EOF) - { - putchar(ch); - } -#endif - - return 0; - } - - /* We have files: read them and output them to STDOUT */ - for (i = 1; i < argc; i++) - { - /* Open the file in binary read mode */ - in = fopen(argv[i], "rb"); - if (in == NULL) - { - fprintf(stderr, "Failed to open file '%s'\n", argv[i]); - return -1; - } - - /* Dump the file to STDOUT */ - cnt = 0; readcnt = 0; - while (readcnt == cnt) - { - /* Read data from the input file */ - cnt = ARRAYSIZE(buff); - readcnt = fread(&buff, sizeof(buff[0]), cnt, in); - if (readcnt != cnt) - { - /* - * The real number of read bytes differs from the number of bytes - * we wanted to read, so either a reading error occurred, or EOF - * was reached while reading. Bail out if it is a reading error. - */ - if (!feof(in)) - { - fprintf(stderr, "Error while reading file '%s'\n", argv[i]); - fclose(in); - return -1; - } - } - - /* Nothing to be read anymore, so we can gracefully break */ - if (readcnt == 0) break; - - /* Write data to STDOUT */ - fwrite(&buff, sizeof(buff[0]), readcnt, stdout); - } - - /* Finally close the file */ - fclose(in); - } - - return 0; -} - -/* EOF */