Re: [CMake] avoid rebuilding targets depending on generated source files
if(${GrammarSource}/test.g IS_NEWER_THAN ${PROJECT_BINARY_DIR}/test.g) ADD_CUSTOM_TARGET(...) ADD_CUSTOM_COMMAND(...) i.e I am totally avoiding the process of rebuilding the test.g file and copying the generated files to build/parser *IF* test.g has not been modified. ...and if test.g is once modified, you won't have a custom target which regenerates the source files and copies them to the parser directory - I'm pretty sure this is not what you intend. Recall the difference between configuration time and build time in CMakified projects. You are right. Once test.g is modified, just running make wont rebuild it. I have to run cmake again and then make since the IF is evaluated only when cmake is run. Thanks Ajay On Sun, Mar 4, 2012 at 7:35 PM, Michael Hertling mhertl...@online.dewrote: On 03/05/2012 01:59 AM, Ajay Panyala wrote: I use cmake version 2.8.3. If I use CMakeLists from your previous reply, it avoids overwriting files when X=0. I have attached the output of your script. Actually, this is exactly what I was talking about: The second make X=0 invocation rewrites the source files - i.e., they receive a new timestamp - but their contents do not change. Thus, the destination files in the parser directory are *not* touched by the second make X=0, and this can be seen clearly by reference to the timestamps. It's the subsequent make X=1 which provides for a new content of the source files and makes cmake -E copy_if_different copy the sources to the destinations. That's why I said everything works as expected, but you wrote: It does not work. The files are still overwritten. So, my question again: What exactly does not work? I.e., does cmake -E copy_if_different - copy a file although the destination exists and has the same content as the source, or - not copy a file although the destination does not exist or does not have the same content as the source? It works for my CMakeLists as well now. What I did now is if(${GrammarSource}/test.g IS_NEWER_THAN ${PROJECT_BINARY_DIR}/test.g) ADD_CUSTOM_TARGET(...) ADD_CUSTOM_COMMAND(...) i.e I am totally avoiding the process of rebuilding the test.g file and copying the generated files to build/parser *IF* test.g has not been modified. ...and if test.g is once modified, you won't have a custom target which regenerates the source files and copies them to the parser directory - I'm pretty sure this is not what you intend. Recall the difference between configuration time and build time in CMakified projects. PS: Could you set up your e-mail client so that it marks quoted text in some way? Currently, one can't distinguish between the lines you are writing and the lines written by others. Sorry. I did not realize that. I use gmail and when I checked my sent emails, quoted text appears to be clearly marked. Is the quoted text in this email marked properly. Yes, it is. Regards, Michael On Sun, Mar 4, 2012 at 4:05 PM, Michael Hertling mhertl...@online.de wrote: On 03/04/2012 08:02 PM, Ajay Panyala wrote: The following project is a boiled-down version of yours but doesn't need any programs except for CMake - that's what I actually meant with minimal but complete as I don't have the org.antlr.Tool Java program: I am sorry. I was mainly trying to cleanup the big CMakeLists file I had and removed about 10 different targets - all of which were rebuilt because the 5 files (test*.*) were overwritten. If you want to try running the test project on your system test.g is at http://pastie.org/private/agzor3ibzoa5pom6q31qq org.antlr.Tool is at www.antlr.org/download/antlr-3.4-complete.jar After configuration, you can run the target by make X=0 and check the timestamps by ls -l --full-time test.tokens parser src. Issuing make X=0 again reveals that the copied files aren't rewritten as it happens after make X=1. Thus, AFAICS, everything works as expected. Could you check if the above-noted example also works on your system? It does not work. The files are still overwritten. Could you run the following shell script in a build tree configured with the CMakeLists.txt from my previous reply and post the output? # check.sh: make X=0 21 /dev/null echo After make X=0 (1): echo --- echo ls --full-time test.tokens src parser echo -ne \n\n sleep 3 make X=0 21 /dev/null echo After make X=0 (2): echo --- echo ls --full-time test.tokens src parser echo -ne \n\n sleep 3 make X=1 21 /dev/null echo After make X=1: echo --- echo ls --full-time test.tokens src parser # End of check.sh BTW, which CMake version do you use? Regards, Michael PS: Could you set up your e-mail client so that it marks quoted text in some way? Currently, one can't distinguish between the lines you are writing and the lines written by
Re: [CMake] avoid rebuilding targets depending on generated source files
On 03/04/2012 01:06 AM, Ajay Panyala wrote: Please provide a minimal but complete example for this issue. Please find it in the following link http://pastie.org/private/pd13u33s9xpfihf2dbzc1q The following project is a boiled-down version of yours but doesn't need any programs except for CMake - that's what I actually meant with minimal but complete as I don't have the org.antlr.Tool Java program: CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) PROJECT(P NONE) SET(CMAKE_VERBOSE_MAKEFILE ON) SET(GrammarSource ${PROJECT_BINARY_DIR}/src) FILE(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/src) ADD_CUSTOM_TARGET(GrammarBuild ALL COMMAND ${CMAKE_COMMAND} -E echo \${X} ${GrammarSource}/testLexer.h COMMAND ${CMAKE_COMMAND} -E echo \${X} ${GrammarSource}/testLexer.c COMMAND ${CMAKE_COMMAND} -E echo \${X} ${GrammarSource}/testParser.h COMMAND ${CMAKE_COMMAND} -E echo \${X} ${GrammarSource}/testParser.c COMMAND ${CMAKE_COMMAND} -E echo \${X} ${PROJECT_BINARY_DIR}/test.tokens ) ADD_CUSTOM_COMMAND(TARGET GrammarBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${GrammarSource}/testLexer.h ${PROJECT_BINARY_DIR}/parser/testLexer.h COMMAND ${CMAKE_COMMAND} -E copy_if_different ${GrammarSource}/testLexer.c ${PROJECT_BINARY_DIR}/parser/testLexer.c COMMAND ${CMAKE_COMMAND} -E copy_if_different ${GrammarSource}/testParser.h ${PROJECT_BINARY_DIR}/parser/testParser.h COMMAND ${CMAKE_COMMAND} -E copy_if_different ${GrammarSource}/testParser.c ${PROJECT_BINARY_DIR}/parser/testParser.c COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_BINARY_DIR}/test.tokens ${PROJECT_BINARY_DIR}/parser/test.tokens ) After configuration, you can run the target by make X=0 and check the timestamps by ls -l --full-time test.tokens parser src. Issuing make X=0 again reveals that the copied files aren't rewritten as it happens after make X=1. Thus, AFAICS, everything works as expected. Could you check if the above-noted example also works on your system? What exactly does not work with your example? You wrote: I have 4 cmake -E copy_if_different commands, one for each file. Only the last file is not copied (if similar). [...] Does this mean that the last file out of four - in fact, your example handles five files - is not copied *although* the source file and the destination file are different, i.e. similar but not equal? You wrote further: [...] The others are copied even if they are the same. I verfied that they are the same with a diff. Does this mean that source files are copied *although* they are equal to their respective destination file? How do you determine that they have been copied? Do you check the timestamps? With --full-time? Regards, Michael PS: Does org.antlr.Tool write to the source tree? If so: Don't do that. On Sat, Mar 3, 2012 at 3:54 PM, Michael Hertling mhertl...@online.dewrote: On 03/04/2012 12:14 AM, Ajay Panyala wrote: No, it wouldn't; check it out: % touch a % rm -f b % ls b ls: cannot access b: No such file or directory % cmake -E copy_if_different a b % ls b b % cksum a b 4294967295 0 a 4294967295 0 b It works with one file, but I have 4 files that are generated. I have 4 cmake -E copy_if_different commands, one for each file. Only the last file is not copied (if similar). The others are copied even if they are the same. I verfied that they are the same with a diff. Any idea what might be happening here ? Please provide a minimal but complete example for this issue. Regards, Michael On Sat, Mar 3, 2012 at 2:47 PM, Michael Hertling mhertl...@online.de wrote: On 03/03/2012 10:36 PM, Ajay Panyala wrote: Try cmake -E copy_if_different ... cmake -E copy_if_different build/test1.c build/tests/test1.c That would work when make is run atleast once. When running make for the 1st time test1.c was never copied to build/tests before. So I would be comparing a file with another non-existant file and that would result in an error halting the make process. No, it wouldn't; check it out: % touch a % rm -f b % ls b ls: cannot access b: No such file or directory % cmake -E copy_if_different a b % ls b b % cksum a b 4294967295 0 a 4294967295 0 b Regards, Michael On Sat, Mar 3, 2012 at 1:20 PM, Hendrik Sattler p...@hendrik-sattler.de wrote: Am Samstag, 3. März 2012, 21:41:49 schrieb Ajay Panyala: I have a custom target which runs a command to generate a C source file say test1.c ADD_CUSTOM_TARGET(TestGen ALL COMMAND genExec ${PROJECT_SOURCE_DIR}/Main.java DEPENDS ${PROJECT_SOURCE_DIR}/Main.java ) And I have a custom command that moves the generated *test1.c * to a new directory inside the build directory. ADD_CUSTOM_COMMAND( TARGET TestGen POST_BUILD COMMAND mv ARGS ${PROJECT_BINARY_DIR}/test1.c ${PROJECT_BINARY_DIR}/tests/ ) Each time I run make, the custom
Re: [CMake] avoid rebuilding targets depending on generated source files
The following project is a boiled-down version of yours but doesn't need any programs except for CMake - that's what I actually meant with minimal but complete as I don't have the org.antlr.Tool Java program: I am sorry. I was mainly trying to cleanup the big CMakeLists file I had and removed about 10 different targets - all of which were rebuilt because the 5 files (test*.*) were overwritten. If you want to try running the test project on your system test.g is at http://pastie.org/private/agzor3ibzoa5pom6q31qq org.antlr.Tool is at www.antlr.org/download/antlr-3.4-complete.jar After configuration, you can run the target by make X=0 and check the timestamps by ls -l --full-time test.tokens parser src. Issuing make X=0 again reveals that the copied files aren't rewritten as it happens after make X=1. Thus, AFAICS, everything works as expected. Could you check if the above-noted example also works on your system? It does not work. The files are still overwritten. What exactly does not work with your example? You wrote: I have 4 cmake -E copy_if_different commands, one for each file. Only the last file is not copied (if similar). [...] Does this mean that the last file out of four - in fact, your example handles five files - is not copied *although* the source file and the destination file are different, i.e. similar but not equal? Yes the file test.tokens is not copied overwritten since they are exactly (diff) similar files. This is the case with the other 4 files as well, but they are still copied over and rewritten. You wrote further: [...] The others are copied even if they are the same. I verfied that they are the same with a diff. Does this mean that source files are copied *although* they are equal to their respective destination file? How do you determine that they have been copied? Do you check the timestamps? With --full-time? Yes, I do check with ls -l --full-time. Except test.tokens, all the other files are copied over (rewritten) even though they are exactly the same (diff same I mean). This is what is confusing me about the behavior of copy_if_different. that is why it works only with test.tokens and not others. PS: Does org.antlr.Tool write to the source tree? If so: Don't do that. Yes, it generates the files in the source dir itself (where test.g is present) I now modified CMakeLists to copy test.g to the project build folder and run it there. The new CMakeLists is at http://pastie.org/private/p1yi0l8so9cqimqlywfmhw Thank You Ajay On Sun, Mar 4, 2012 at 12:52 AM, Michael Hertling mhertl...@online.dewrote: On 03/04/2012 01:06 AM, Ajay Panyala wrote: Please provide a minimal but complete example for this issue. Please find it in the following link http://pastie.org/private/pd13u33s9xpfihf2dbzc1q The following project is a boiled-down version of yours but doesn't need any programs except for CMake - that's what I actually meant with minimal but complete as I don't have the org.antlr.Tool Java program: CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) PROJECT(P NONE) SET(CMAKE_VERBOSE_MAKEFILE ON) SET(GrammarSource ${PROJECT_BINARY_DIR}/src) FILE(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/src) ADD_CUSTOM_TARGET(GrammarBuild ALL COMMAND ${CMAKE_COMMAND} -E echo \${X} ${GrammarSource}/testLexer.h COMMAND ${CMAKE_COMMAND} -E echo \${X} ${GrammarSource}/testLexer.c COMMAND ${CMAKE_COMMAND} -E echo \${X} ${GrammarSource}/testParser.h COMMAND ${CMAKE_COMMAND} -E echo \${X} ${GrammarSource}/testParser.c COMMAND ${CMAKE_COMMAND} -E echo \${X} ${PROJECT_BINARY_DIR}/test.tokens ) ADD_CUSTOM_COMMAND(TARGET GrammarBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${GrammarSource}/testLexer.h ${PROJECT_BINARY_DIR}/parser/testLexer.h COMMAND ${CMAKE_COMMAND} -E copy_if_different ${GrammarSource}/testLexer.c ${PROJECT_BINARY_DIR}/parser/testLexer.c COMMAND ${CMAKE_COMMAND} -E copy_if_different ${GrammarSource}/testParser.h ${PROJECT_BINARY_DIR}/parser/testParser.h COMMAND ${CMAKE_COMMAND} -E copy_if_different ${GrammarSource}/testParser.c ${PROJECT_BINARY_DIR}/parser/testParser.c COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_BINARY_DIR}/test.tokens ${PROJECT_BINARY_DIR}/parser/test.tokens ) After configuration, you can run the target by make X=0 and check the timestamps by ls -l --full-time test.tokens parser src. Issuing make X=0 again reveals that the copied files aren't rewritten as it happens after make X=1. Thus, AFAICS, everything works as expected. Could you check if the above-noted example also works on your system? What exactly does not work with your example? You wrote: I have 4 cmake -E copy_if_different commands, one for each file. Only the last file is not copied (if similar). [...] Does this mean that the last file out of four - in fact, your
Re: [CMake] avoid rebuilding targets depending on generated source files
On 03/04/2012 08:02 PM, Ajay Panyala wrote: The following project is a boiled-down version of yours but doesn't need any programs except for CMake - that's what I actually meant with minimal but complete as I don't have the org.antlr.Tool Java program: I am sorry. I was mainly trying to cleanup the big CMakeLists file I had and removed about 10 different targets - all of which were rebuilt because the 5 files (test*.*) were overwritten. If you want to try running the test project on your system test.g is at http://pastie.org/private/agzor3ibzoa5pom6q31qq org.antlr.Tool is at www.antlr.org/download/antlr-3.4-complete.jar After configuration, you can run the target by make X=0 and check the timestamps by ls -l --full-time test.tokens parser src. Issuing make X=0 again reveals that the copied files aren't rewritten as it happens after make X=1. Thus, AFAICS, everything works as expected. Could you check if the above-noted example also works on your system? It does not work. The files are still overwritten. Could you run the following shell script in a build tree configured with the CMakeLists.txt from my previous reply and post the output? # check.sh: make X=0 21 /dev/null echo After make X=0 (1): echo --- echo ls --full-time test.tokens src parser echo -ne \n\n sleep 3 make X=0 21 /dev/null echo After make X=0 (2): echo --- echo ls --full-time test.tokens src parser echo -ne \n\n sleep 3 make X=1 21 /dev/null echo After make X=1: echo --- echo ls --full-time test.tokens src parser # End of check.sh BTW, which CMake version do you use? Regards, Michael PS: Could you set up your e-mail client so that it marks quoted text in some way? Currently, one can't distinguish between the lines you are writing and the lines written by others. What exactly does not work with your example? You wrote: I have 4 cmake -E copy_if_different commands, one for each file. Only the last file is not copied (if similar). [...] Does this mean that the last file out of four - in fact, your example handles five files - is not copied *although* the source file and the destination file are different, i.e. similar but not equal? Yes the file test.tokens is not copied overwritten since they are exactly (diff) similar files. This is the case with the other 4 files as well, but they are still copied over and rewritten. You wrote further: [...] The others are copied even if they are the same. I verfied that they are the same with a diff. Does this mean that source files are copied *although* they are equal to their respective destination file? How do you determine that they have been copied? Do you check the timestamps? With --full-time? Yes, I do check with ls -l --full-time. Except test.tokens, all the other files are copied over (rewritten) even though they are exactly the same (diff same I mean). This is what is confusing me about the behavior of copy_if_different. that is why it works only with test.tokens and not others. PS: Does org.antlr.Tool write to the source tree? If so: Don't do that. Yes, it generates the files in the source dir itself (where test.g is present) I now modified CMakeLists to copy test.g to the project build folder and run it there. The new CMakeLists is at http://pastie.org/private/p1yi0l8so9cqimqlywfmhw Thank You Ajay On Sun, Mar 4, 2012 at 12:52 AM, Michael Hertling mhertl...@online.dewrote: On 03/04/2012 01:06 AM, Ajay Panyala wrote: Please provide a minimal but complete example for this issue. Please find it in the following link http://pastie.org/private/pd13u33s9xpfihf2dbzc1q The following project is a boiled-down version of yours but doesn't need any programs except for CMake - that's what I actually meant with minimal but complete as I don't have the org.antlr.Tool Java program: CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) PROJECT(P NONE) SET(CMAKE_VERBOSE_MAKEFILE ON) SET(GrammarSource ${PROJECT_BINARY_DIR}/src) FILE(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/src) ADD_CUSTOM_TARGET(GrammarBuild ALL COMMAND ${CMAKE_COMMAND} -E echo \${X} ${GrammarSource}/testLexer.h COMMAND ${CMAKE_COMMAND} -E echo \${X} ${GrammarSource}/testLexer.c COMMAND ${CMAKE_COMMAND} -E echo \${X} ${GrammarSource}/testParser.h COMMAND ${CMAKE_COMMAND} -E echo \${X} ${GrammarSource}/testParser.c COMMAND ${CMAKE_COMMAND} -E echo \${X} ${PROJECT_BINARY_DIR}/test.tokens ) ADD_CUSTOM_COMMAND(TARGET GrammarBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${GrammarSource}/testLexer.h ${PROJECT_BINARY_DIR}/parser/testLexer.h COMMAND ${CMAKE_COMMAND} -E copy_if_different ${GrammarSource}/testLexer.c ${PROJECT_BINARY_DIR}/parser/testLexer.c COMMAND ${CMAKE_COMMAND} -E copy_if_different ${GrammarSource}/testParser.h
Re: [CMake] avoid rebuilding targets depending on generated source files
I use cmake version 2.8.3. If I use CMakeLists from your previous reply, it avoids overwriting files when X=0. I have attached the output of your script. It works for my CMakeLists as well now. What I did now is if(${GrammarSource}/test.g IS_NEWER_THAN ${PROJECT_BINARY_DIR}/test.g) ADD_CUSTOM_TARGET(...) ADD_CUSTOM_COMMAND(...) i.e I am totally avoiding the process of rebuilding the test.g file and copying the generated files to build/parser *IF* test.g has not been modified. Thank you very much Ajay PS: Could you set up your e-mail client so that it marks quoted text in some way? Currently, one can't distinguish between the lines you are writing and the lines written by others. Sorry. I did not realize that. I use gmail and when I checked my sent emails, quoted text appears to be clearly marked. Is the quoted text in this email marked properly. On Sun, Mar 4, 2012 at 4:05 PM, Michael Hertling mhertl...@online.dewrote: On 03/04/2012 08:02 PM, Ajay Panyala wrote: The following project is a boiled-down version of yours but doesn't need any programs except for CMake - that's what I actually meant with minimal but complete as I don't have the org.antlr.Tool Java program: I am sorry. I was mainly trying to cleanup the big CMakeLists file I had and removed about 10 different targets - all of which were rebuilt because the 5 files (test*.*) were overwritten. If you want to try running the test project on your system test.g is at http://pastie.org/private/agzor3ibzoa5pom6q31qq org.antlr.Tool is at www.antlr.org/download/antlr-3.4-complete.jar After configuration, you can run the target by make X=0 and check the timestamps by ls -l --full-time test.tokens parser src. Issuing make X=0 again reveals that the copied files aren't rewritten as it happens after make X=1. Thus, AFAICS, everything works as expected. Could you check if the above-noted example also works on your system? It does not work. The files are still overwritten. Could you run the following shell script in a build tree configured with the CMakeLists.txt from my previous reply and post the output? # check.sh: make X=0 21 /dev/null echo After make X=0 (1): echo --- echo ls --full-time test.tokens src parser echo -ne \n\n sleep 3 make X=0 21 /dev/null echo After make X=0 (2): echo --- echo ls --full-time test.tokens src parser echo -ne \n\n sleep 3 make X=1 21 /dev/null echo After make X=1: echo --- echo ls --full-time test.tokens src parser # End of check.sh BTW, which CMake version do you use? Regards, Michael PS: Could you set up your e-mail client so that it marks quoted text in some way? Currently, one can't distinguish between the lines you are writing and the lines written by others. What exactly does not work with your example? You wrote: I have 4 cmake -E copy_if_different commands, one for each file. Only the last file is not copied (if similar). [...] Does this mean that the last file out of four - in fact, your example handles five files - is not copied *although* the source file and the destination file are different, i.e. similar but not equal? Yes the file test.tokens is not copied overwritten since they are exactly (diff) similar files. This is the case with the other 4 files as well, but they are still copied over and rewritten. You wrote further: [...] The others are copied even if they are the same. I verfied that they are the same with a diff. Does this mean that source files are copied *although* they are equal to their respective destination file? How do you determine that they have been copied? Do you check the timestamps? With --full-time? Yes, I do check with ls -l --full-time. Except test.tokens, all the other files are copied over (rewritten) even though they are exactly the same (diff same I mean). This is what is confusing me about the behavior of copy_if_different. that is why it works only with test.tokens and not others. PS: Does org.antlr.Tool write to the source tree? If so: Don't do that. Yes, it generates the files in the source dir itself (where test.g is present) I now modified CMakeLists to copy test.g to the project build folder and run it there. The new CMakeLists is at http://pastie.org/private/p1yi0l8so9cqimqlywfmhw Thank You Ajay On Sun, Mar 4, 2012 at 12:52 AM, Michael Hertling mhertl...@online.de wrote: On 03/04/2012 01:06 AM, Ajay Panyala wrote: Please provide a minimal but complete example for this issue. Please find it in the following link http://pastie.org/private/pd13u33s9xpfihf2dbzc1q The following project is a boiled-down version of yours but doesn't need any programs except for CMake - that's what I actually meant with minimal but complete as I don't have the org.antlr.Tool Java program:
Re: [CMake] avoid rebuilding targets depending on generated source files
On 03/05/2012 01:59 AM, Ajay Panyala wrote: I use cmake version 2.8.3. If I use CMakeLists from your previous reply, it avoids overwriting files when X=0. I have attached the output of your script. Actually, this is exactly what I was talking about: The second make X=0 invocation rewrites the source files - i.e., they receive a new timestamp - but their contents do not change. Thus, the destination files in the parser directory are *not* touched by the second make X=0, and this can be seen clearly by reference to the timestamps. It's the subsequent make X=1 which provides for a new content of the source files and makes cmake -E copy_if_different copy the sources to the destinations. That's why I said everything works as expected, but you wrote: It does not work. The files are still overwritten. So, my question again: What exactly does not work? I.e., does cmake -E copy_if_different - copy a file although the destination exists and has the same content as the source, or - not copy a file although the destination does not exist or does not have the same content as the source? It works for my CMakeLists as well now. What I did now is if(${GrammarSource}/test.g IS_NEWER_THAN ${PROJECT_BINARY_DIR}/test.g) ADD_CUSTOM_TARGET(...) ADD_CUSTOM_COMMAND(...) i.e I am totally avoiding the process of rebuilding the test.g file and copying the generated files to build/parser *IF* test.g has not been modified. ...and if test.g is once modified, you won't have a custom target which regenerates the source files and copies them to the parser directory - I'm pretty sure this is not what you intend. Recall the difference between configuration time and build time in CMakified projects. PS: Could you set up your e-mail client so that it marks quoted text in some way? Currently, one can't distinguish between the lines you are writing and the lines written by others. Sorry. I did not realize that. I use gmail and when I checked my sent emails, quoted text appears to be clearly marked. Is the quoted text in this email marked properly. Yes, it is. Regards, Michael On Sun, Mar 4, 2012 at 4:05 PM, Michael Hertling mhertl...@online.dewrote: On 03/04/2012 08:02 PM, Ajay Panyala wrote: The following project is a boiled-down version of yours but doesn't need any programs except for CMake - that's what I actually meant with minimal but complete as I don't have the org.antlr.Tool Java program: I am sorry. I was mainly trying to cleanup the big CMakeLists file I had and removed about 10 different targets - all of which were rebuilt because the 5 files (test*.*) were overwritten. If you want to try running the test project on your system test.g is at http://pastie.org/private/agzor3ibzoa5pom6q31qq org.antlr.Tool is at www.antlr.org/download/antlr-3.4-complete.jar After configuration, you can run the target by make X=0 and check the timestamps by ls -l --full-time test.tokens parser src. Issuing make X=0 again reveals that the copied files aren't rewritten as it happens after make X=1. Thus, AFAICS, everything works as expected. Could you check if the above-noted example also works on your system? It does not work. The files are still overwritten. Could you run the following shell script in a build tree configured with the CMakeLists.txt from my previous reply and post the output? # check.sh: make X=0 21 /dev/null echo After make X=0 (1): echo --- echo ls --full-time test.tokens src parser echo -ne \n\n sleep 3 make X=0 21 /dev/null echo After make X=0 (2): echo --- echo ls --full-time test.tokens src parser echo -ne \n\n sleep 3 make X=1 21 /dev/null echo After make X=1: echo --- echo ls --full-time test.tokens src parser # End of check.sh BTW, which CMake version do you use? Regards, Michael PS: Could you set up your e-mail client so that it marks quoted text in some way? Currently, one can't distinguish between the lines you are writing and the lines written by others. What exactly does not work with your example? You wrote: I have 4 cmake -E copy_if_different commands, one for each file. Only the last file is not copied (if similar). [...] Does this mean that the last file out of four - in fact, your example handles five files - is not copied *although* the source file and the destination file are different, i.e. similar but not equal? Yes the file test.tokens is not copied overwritten since they are exactly (diff) similar files. This is the case with the other 4 files as well, but they are still copied over and rewritten. You wrote further: [...] The others are copied even if they are the same. I verfied that they are the same with a diff. Does this mean that source files are copied *although* they are equal to their respective destination file? How do you determine that they have been copied? Do you check the timestamps? With --full-time?
Re: [CMake] avoid rebuilding targets depending on generated source files
So, my question again: What exactly does not work? I.e., does cmake -E copy_if_different - copy a file although the destination exists and has the same content as the source, or Sorry for the confusion. I thought something like the above mentioned happened, but in reality nothing like it happened. I must have done something wrong by overlooking some detail. It works now. *I did not initially run the CMakeLists you had provided.* I had run my own version of CMakeLists by inserting some rules from the CMakeLists file you had provided and I did something wrong there. Hence, that did not work. It works for my CMakeLists as well now. What I did now is if(${GrammarSource}/test.g IS_NEWER_THAN ${PROJECT_BINARY_DIR}/test.g) ADD_CUSTOM_TARGET(...) ADD_CUSTOM_COMMAND(...) i.e I am totally avoiding the process of rebuilding the test.g file and copying the generated files to build/parser *IF* test.g has not been modified. ...and if test.g is once modified, you won't have a custom target which regenerates the source files and copies them to the parser directory - I'm pretty sure this is not what you intend. Recall the difference between configuration time and build time in CMakified projects. No, if test.g is modified the *if* condition is true and the new version is copied over to the build directory; the custom target builds it and the custom command moves the generated files into build/parser. For the initial run of make test.g is not present in the build folder, since it was never copied before. For this case, I have another IF(EXISTS build/test.g) conditional which copies it from src to build folder and then executes it. Thanks Ajay On Sun, Mar 4, 2012 at 7:35 PM, Michael Hertling mhertl...@online.dewrote: On 03/05/2012 01:59 AM, Ajay Panyala wrote: I use cmake version 2.8.3. If I use CMakeLists from your previous reply, it avoids overwriting files when X=0. I have attached the output of your script. Actually, this is exactly what I was talking about: The second make X=0 invocation rewrites the source files - i.e., they receive a new timestamp - but their contents do not change. Thus, the destination files in the parser directory are *not* touched by the second make X=0, and this can be seen clearly by reference to the timestamps. It's the subsequent make X=1 which provides for a new content of the source files and makes cmake -E copy_if_different copy the sources to the destinations. That's why I said everything works as expected, but you wrote: It does not work. The files are still overwritten. So, my question again: What exactly does not work? I.e., does cmake -E copy_if_different - copy a file although the destination exists and has the same content as the source, or - not copy a file although the destination does not exist or does not have the same content as the source? It works for my CMakeLists as well now. What I did now is if(${GrammarSource}/test.g IS_NEWER_THAN ${PROJECT_BINARY_DIR}/test.g) ADD_CUSTOM_TARGET(...) ADD_CUSTOM_COMMAND(...) i.e I am totally avoiding the process of rebuilding the test.g file and copying the generated files to build/parser *IF* test.g has not been modified. ...and if test.g is once modified, you won't have a custom target which regenerates the source files and copies them to the parser directory - I'm pretty sure this is not what you intend. Recall the difference between configuration time and build time in CMakified projects. PS: Could you set up your e-mail client so that it marks quoted text in some way? Currently, one can't distinguish between the lines you are writing and the lines written by others. Sorry. I did not realize that. I use gmail and when I checked my sent emails, quoted text appears to be clearly marked. Is the quoted text in this email marked properly. Yes, it is. Regards, Michael On Sun, Mar 4, 2012 at 4:05 PM, Michael Hertling mhertl...@online.de wrote: On 03/04/2012 08:02 PM, Ajay Panyala wrote: The following project is a boiled-down version of yours but doesn't need any programs except for CMake - that's what I actually meant with minimal but complete as I don't have the org.antlr.Tool Java program: I am sorry. I was mainly trying to cleanup the big CMakeLists file I had and removed about 10 different targets - all of which were rebuilt because the 5 files (test*.*) were overwritten. If you want to try running the test project on your system test.g is at http://pastie.org/private/agzor3ibzoa5pom6q31qq org.antlr.Tool is at www.antlr.org/download/antlr-3.4-complete.jar After configuration, you can run the target by make X=0 and check the timestamps by ls -l --full-time test.tokens parser src. Issuing make X=0 again reveals that the copied files aren't rewritten as it happens after make X=1. Thus, AFAICS, everything works as expected. Could you check if the above-noted example
Re: [CMake] avoid rebuilding targets depending on generated source files
Am Samstag, 3. März 2012, 21:41:49 schrieb Ajay Panyala: I have a custom target which runs a command to generate a C source file say test1.c ADD_CUSTOM_TARGET(TestGen ALL COMMAND genExec ${PROJECT_SOURCE_DIR}/Main.java DEPENDS ${PROJECT_SOURCE_DIR}/Main.java ) And I have a custom command that moves the generated *test1.c * to a new directory inside the build directory. ADD_CUSTOM_COMMAND( TARGET TestGen POST_BUILD COMMAND mv ARGS ${PROJECT_BINARY_DIR}/test1.c ${PROJECT_BINARY_DIR}/tests/ ) Each time I run make, the custom target is run (since custom targets are always out-of-date). But I want to avoid moving the new test1.c generated each time if build/test1.c is the same as build/tests/test1.c since there are other targets like add_executable and add_library later in the CMakelists file that are re-built each time since they depend on test1.c Try cmake -E copy_if_different ... HS -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake
Re: [CMake] avoid rebuilding targets depending on generated source files
Try cmake -E copy_if_different ... cmake -E copy_if_different build/test1.c build/tests/test1.c That would work when make is run atleast once. When running make for the 1st time test1.c was never copied to build/tests before. So I would be comparing a file with another non-existant file and that would result in an error halting the make process. Thanks Ajay On Sat, Mar 3, 2012 at 1:20 PM, Hendrik Sattler p...@hendrik-sattler.dewrote: Am Samstag, 3. März 2012, 21:41:49 schrieb Ajay Panyala: I have a custom target which runs a command to generate a C source file say test1.c ADD_CUSTOM_TARGET(TestGen ALL COMMAND genExec ${PROJECT_SOURCE_DIR}/Main.java DEPENDS ${PROJECT_SOURCE_DIR}/Main.java ) And I have a custom command that moves the generated *test1.c * to a new directory inside the build directory. ADD_CUSTOM_COMMAND( TARGET TestGen POST_BUILD COMMAND mv ARGS ${PROJECT_BINARY_DIR}/test1.c ${PROJECT_BINARY_DIR}/tests/ ) Each time I run make, the custom target is run (since custom targets are always out-of-date). But I want to avoid moving the new test1.c generated each time if build/test1.c is the same as build/tests/test1.c since there are other targets like add_executable and add_library later in the CMakelists file that are re-built each time since they depend on test1.c Try cmake -E copy_if_different ... HS -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake
Re: [CMake] avoid rebuilding targets depending on generated source files
On 03/03/2012 10:36 PM, Ajay Panyala wrote: Try cmake -E copy_if_different ... cmake -E copy_if_different build/test1.c build/tests/test1.c That would work when make is run atleast once. When running make for the 1st time test1.c was never copied to build/tests before. So I would be comparing a file with another non-existant file and that would result in an error halting the make process. No, it wouldn't; check it out: % touch a % rm -f b % ls b ls: cannot access b: No such file or directory % cmake -E copy_if_different a b % ls b b % cksum a b 4294967295 0 a 4294967295 0 b Regards, Michael On Sat, Mar 3, 2012 at 1:20 PM, Hendrik Sattler p...@hendrik-sattler.dewrote: Am Samstag, 3. März 2012, 21:41:49 schrieb Ajay Panyala: I have a custom target which runs a command to generate a C source file say test1.c ADD_CUSTOM_TARGET(TestGen ALL COMMAND genExec ${PROJECT_SOURCE_DIR}/Main.java DEPENDS ${PROJECT_SOURCE_DIR}/Main.java ) And I have a custom command that moves the generated *test1.c * to a new directory inside the build directory. ADD_CUSTOM_COMMAND( TARGET TestGen POST_BUILD COMMAND mv ARGS ${PROJECT_BINARY_DIR}/test1.c ${PROJECT_BINARY_DIR}/tests/ ) Each time I run make, the custom target is run (since custom targets are always out-of-date). But I want to avoid moving the new test1.c generated each time if build/test1.c is the same as build/tests/test1.c since there are other targets like add_executable and add_library later in the CMakelists file that are re-built each time since they depend on test1.c Try cmake -E copy_if_different ... HS -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake
Re: [CMake] avoid rebuilding targets depending on generated source files
No, it wouldn't; Thanks. It works now. I might have done something wrong earlier. - Ajay On Sat, Mar 3, 2012 at 2:47 PM, Michael Hertling mhertl...@online.dewrote: On 03/03/2012 10:36 PM, Ajay Panyala wrote: Try cmake -E copy_if_different ... cmake -E copy_if_different build/test1.c build/tests/test1.c That would work when make is run atleast once. When running make for the 1st time test1.c was never copied to build/tests before. So I would be comparing a file with another non-existant file and that would result in an error halting the make process. No, it wouldn't; check it out: % touch a % rm -f b % ls b ls: cannot access b: No such file or directory % cmake -E copy_if_different a b % ls b b % cksum a b 4294967295 0 a 4294967295 0 b Regards, Michael On Sat, Mar 3, 2012 at 1:20 PM, Hendrik Sattler p...@hendrik-sattler.de wrote: Am Samstag, 3. März 2012, 21:41:49 schrieb Ajay Panyala: I have a custom target which runs a command to generate a C source file say test1.c ADD_CUSTOM_TARGET(TestGen ALL COMMAND genExec ${PROJECT_SOURCE_DIR}/Main.java DEPENDS ${PROJECT_SOURCE_DIR}/Main.java ) And I have a custom command that moves the generated *test1.c * to a new directory inside the build directory. ADD_CUSTOM_COMMAND( TARGET TestGen POST_BUILD COMMAND mv ARGS ${PROJECT_BINARY_DIR}/test1.c ${PROJECT_BINARY_DIR}/tests/ ) Each time I run make, the custom target is run (since custom targets are always out-of-date). But I want to avoid moving the new test1.c generated each time if build/test1.c is the same as build/tests/test1.c since there are other targets like add_executable and add_library later in the CMakelists file that are re-built each time since they depend on test1.c Try cmake -E copy_if_different ... HS -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake
Re: [CMake] avoid rebuilding targets depending on generated source files
No, it wouldn't; check it out: % touch a % rm -f b % ls b ls: cannot access b: No such file or directory % cmake -E copy_if_different a b % ls b b % cksum a b 4294967295 0 a 4294967295 0 b It works with one file, but I have 4 files that are generated. I have 4 cmake -E copy_if_different commands, one for each file. Only the last file is not copied (if similar). The others are copied even if they are the same. I verfied that they are the same with a diff. Any idea what might be happening here ? Thank You Ajay On Sat, Mar 3, 2012 at 2:47 PM, Michael Hertling mhertl...@online.dewrote: On 03/03/2012 10:36 PM, Ajay Panyala wrote: Try cmake -E copy_if_different ... cmake -E copy_if_different build/test1.c build/tests/test1.c That would work when make is run atleast once. When running make for the 1st time test1.c was never copied to build/tests before. So I would be comparing a file with another non-existant file and that would result in an error halting the make process. No, it wouldn't; check it out: % touch a % rm -f b % ls b ls: cannot access b: No such file or directory % cmake -E copy_if_different a b % ls b b % cksum a b 4294967295 0 a 4294967295 0 b Regards, Michael On Sat, Mar 3, 2012 at 1:20 PM, Hendrik Sattler p...@hendrik-sattler.de wrote: Am Samstag, 3. März 2012, 21:41:49 schrieb Ajay Panyala: I have a custom target which runs a command to generate a C source file say test1.c ADD_CUSTOM_TARGET(TestGen ALL COMMAND genExec ${PROJECT_SOURCE_DIR}/Main.java DEPENDS ${PROJECT_SOURCE_DIR}/Main.java ) And I have a custom command that moves the generated *test1.c * to a new directory inside the build directory. ADD_CUSTOM_COMMAND( TARGET TestGen POST_BUILD COMMAND mv ARGS ${PROJECT_BINARY_DIR}/test1.c ${PROJECT_BINARY_DIR}/tests/ ) Each time I run make, the custom target is run (since custom targets are always out-of-date). But I want to avoid moving the new test1.c generated each time if build/test1.c is the same as build/tests/test1.c since there are other targets like add_executable and add_library later in the CMakelists file that are re-built each time since they depend on test1.c Try cmake -E copy_if_different ... HS -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake
Re: [CMake] avoid rebuilding targets depending on generated source files
On 03/04/2012 12:14 AM, Ajay Panyala wrote: No, it wouldn't; check it out: % touch a % rm -f b % ls b ls: cannot access b: No such file or directory % cmake -E copy_if_different a b % ls b b % cksum a b 4294967295 0 a 4294967295 0 b It works with one file, but I have 4 files that are generated. I have 4 cmake -E copy_if_different commands, one for each file. Only the last file is not copied (if similar). The others are copied even if they are the same. I verfied that they are the same with a diff. Any idea what might be happening here ? Please provide a minimal but complete example for this issue. Regards, Michael On Sat, Mar 3, 2012 at 2:47 PM, Michael Hertling mhertl...@online.dewrote: On 03/03/2012 10:36 PM, Ajay Panyala wrote: Try cmake -E copy_if_different ... cmake -E copy_if_different build/test1.c build/tests/test1.c That would work when make is run atleast once. When running make for the 1st time test1.c was never copied to build/tests before. So I would be comparing a file with another non-existant file and that would result in an error halting the make process. No, it wouldn't; check it out: % touch a % rm -f b % ls b ls: cannot access b: No such file or directory % cmake -E copy_if_different a b % ls b b % cksum a b 4294967295 0 a 4294967295 0 b Regards, Michael On Sat, Mar 3, 2012 at 1:20 PM, Hendrik Sattler p...@hendrik-sattler.de wrote: Am Samstag, 3. März 2012, 21:41:49 schrieb Ajay Panyala: I have a custom target which runs a command to generate a C source file say test1.c ADD_CUSTOM_TARGET(TestGen ALL COMMAND genExec ${PROJECT_SOURCE_DIR}/Main.java DEPENDS ${PROJECT_SOURCE_DIR}/Main.java ) And I have a custom command that moves the generated *test1.c * to a new directory inside the build directory. ADD_CUSTOM_COMMAND( TARGET TestGen POST_BUILD COMMAND mv ARGS ${PROJECT_BINARY_DIR}/test1.c ${PROJECT_BINARY_DIR}/tests/ ) Each time I run make, the custom target is run (since custom targets are always out-of-date). But I want to avoid moving the new test1.c generated each time if build/test1.c is the same as build/tests/test1.c since there are other targets like add_executable and add_library later in the CMakelists file that are re-built each time since they depend on test1.c Try cmake -E copy_if_different ... HS -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake
Re: [CMake] avoid rebuilding targets depending on generated source files
Please provide a minimal but complete example for this issue. Please find it in the following link http://pastie.org/private/pd13u33s9xpfihf2dbzc1q Thank You Ajay On Sat, Mar 3, 2012 at 3:54 PM, Michael Hertling mhertl...@online.dewrote: On 03/04/2012 12:14 AM, Ajay Panyala wrote: No, it wouldn't; check it out: % touch a % rm -f b % ls b ls: cannot access b: No such file or directory % cmake -E copy_if_different a b % ls b b % cksum a b 4294967295 0 a 4294967295 0 b It works with one file, but I have 4 files that are generated. I have 4 cmake -E copy_if_different commands, one for each file. Only the last file is not copied (if similar). The others are copied even if they are the same. I verfied that they are the same with a diff. Any idea what might be happening here ? Please provide a minimal but complete example for this issue. Regards, Michael On Sat, Mar 3, 2012 at 2:47 PM, Michael Hertling mhertl...@online.de wrote: On 03/03/2012 10:36 PM, Ajay Panyala wrote: Try cmake -E copy_if_different ... cmake -E copy_if_different build/test1.c build/tests/test1.c That would work when make is run atleast once. When running make for the 1st time test1.c was never copied to build/tests before. So I would be comparing a file with another non-existant file and that would result in an error halting the make process. No, it wouldn't; check it out: % touch a % rm -f b % ls b ls: cannot access b: No such file or directory % cmake -E copy_if_different a b % ls b b % cksum a b 4294967295 0 a 4294967295 0 b Regards, Michael On Sat, Mar 3, 2012 at 1:20 PM, Hendrik Sattler p...@hendrik-sattler.de wrote: Am Samstag, 3. März 2012, 21:41:49 schrieb Ajay Panyala: I have a custom target which runs a command to generate a C source file say test1.c ADD_CUSTOM_TARGET(TestGen ALL COMMAND genExec ${PROJECT_SOURCE_DIR}/Main.java DEPENDS ${PROJECT_SOURCE_DIR}/Main.java ) And I have a custom command that moves the generated *test1.c * to a new directory inside the build directory. ADD_CUSTOM_COMMAND( TARGET TestGen POST_BUILD COMMAND mv ARGS ${PROJECT_BINARY_DIR}/test1.c ${PROJECT_BINARY_DIR}/tests/ ) Each time I run make, the custom target is run (since custom targets are always out-of-date). But I want to avoid moving the new test1.c generated each time if build/test1.c is the same as build/tests/test1.c since there are other targets like add_executable and add_library later in the CMakelists file that are re-built each time since they depend on test1.c Try cmake -E copy_if_different ... HS -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake -- Ajay Panyala | Email: a...@csc.lsu.edu Department of Computer Science | Phone: +1 (225) 907 9501 Louisiana State University | www.csc.lsu.edu/~ajay -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake