From: John P. <jwp...@gm...> - 2013-12-12 20:31:04
|
Quite a while ago, I started using ./configure INSTALL="`which install` -C" ... on (I think) Paul's recommendation. So far on OSX this has worked just fine: if you touch a random .C file and run 'make install', the timestamps on all the headers in the install directory remain unchanged. But, for some reason, this same approach doesn't seem to work on Linux. Every time I run make install, the timestamp of libmesh_config.h is updated, and it forces me to recompile basically every file in my app, which is very annoying. After running 'make' but before running 'make install', I've verified that diff include/libmesh_config.h ${LIBMESH_DIR}/include/libmesh/libmesh_config.h reports no differences. I also don't think it's the install command itself, since I can run /usr/bin/install -C --mode=644 include/libmesh_config.h ${LIBMESH_DIR}/include/libmesh/libmesh_config.h manually, and the file's timestamp is not updated. But as soon as I run make install, it is. Any ideas? -- John |
From: Kirk, B. (JSC-EG311) <ben...@na...> - 2013-12-12 20:41:09
|
When I run configure twice in a row on linux, I get this the second time: ... config.status: creating include/libmesh_config.h.tmp config.status: include/libmesh_config.h.tmp is unchanged config.status: executing include/libmesh_config.h commands config.status: creating include/libmesh_config.h - prefix LIBMESH for include/libmesh_config.h.tmp defines config.status: include/libmesh_config.h is unchanged config.status: executing depfiles commands === configuring in contrib/netcdf/v4 (/aerolab/benkirk/libmesh/gcc-4.6/contrib/netcdf/v4) … Do you not? Notice you can actually get this by running $ ./config.status $ ./config.status I'm guessing something is causing that logic to fail, but I can't guess why… Might have a look for 'unchanged' in the config.status file… On Dec 12, 2013, at 2:30 PM, John Peterson <jwp...@gm...> wrote: > INSTALL="`which install` -C" |
From: John P. <jwp...@gm...> - 2013-12-12 21:30:53
|
On Thu, Dec 12, 2013 at 1:41 PM, Kirk, Benjamin (JSC-EG311) <ben...@na...> wrote: > When I run configure twice in a row on linux, I get this the second time: > > ... > config.status: creating include/libmesh_config.h.tmp > config.status: include/libmesh_config.h.tmp is unchanged > config.status: executing include/libmesh_config.h commands > config.status: creating include/libmesh_config.h - prefix LIBMESH for include/libmesh_config.h.tmp defines > config.status: include/libmesh_config.h is unchanged > config.status: executing depfiles commands > === configuring in contrib/netcdf/v4 (/aerolab/benkirk/libmesh/gcc-4.6/contrib/netcdf/v4) > … > > > Do you not? > > Notice you can actually get this by running > > $ ./config.status > $ ./config.status > > I'm guessing something is causing that logic to fail, but I can't guess why… Repeated calls to ./config.status results in the same output for me: ... config.status: creating include/libmesh_config.h.tmp config.status: include/libmesh_config.h.tmp is unchanged config.status: executing include/libmesh_config.h commands config.status: creating include/libmesh_config.h - prefix LIBMESH for include/libmesh_config.h.tmp defines config.status: include/libmesh_config.h is unchanged > Might have a look for 'unchanged' in the config.status file… Did you mean config.log? Looks like the same output of config.status that I pasted above is in config.log as well. Note that just running 'make install' repeatedly, even without touching any files, updates the timestamp on the libmesh_config.h file _every_ time on my linux box. Another file that seems to get updated every time is ${LIBMESH_DIR}/bin/libmesh-config, but it's pretty easy to see why... we do some sed magic on it and then manually move it to its final location rather than /usr/bin/install'ing it: cat /home/petejw/projects/libmesh_git/install/bin/libmesh-config | /bin/sed "s/has_been_installed=no/has_been_installed=yes/g" > /home/petejw/projects/libmesh_git/install/bin/libmesh-config.installed mv /home/petejw/projects/libmesh_git/install/bin/libmesh-config.installed /home/petejw/projects/libmesh_git/install/bin/libmesh-config && chmod +x /home/petejw/projects/libmesh_git/install/bin/libmesh-config But I don't think we're doing anything like that to libmesh_config.h. In fact I can see the command that installs it: /usr/bin/install -C -m 644 libmesh/libmesh_config.h (... bunch of other files ...) '/home/petejw/projects/libmesh_git/install/include/libmesh' and that should really do the right thing. -- John |
From: John P. <jwp...@gm...> - 2013-12-12 22:32:07
|
On Thu, Dec 12, 2013 at 2:30 PM, John Peterson <jwp...@gm...> wrote: > On Thu, Dec 12, 2013 at 1:41 PM, Kirk, Benjamin (JSC-EG311) > > But I don't think we're doing anything like that to libmesh_config.h. > In fact I can see the command that installs it: > > /usr/bin/install -C -m 644 libmesh/libmesh_config.h (... bunch of > other files ...) > '/home/petejw/projects/libmesh_git/install/include/libmesh' > > and that should really do the right thing. So... I'm having much better luck with '/usr/bin/install -p' (preserve-timestamps) than I was with 'install -C' on Linux.... It's a bit hard to say what the difference between -C and -p might be just from reading the /usr/bin/install man page. On OSX, it appears that -p imples -C OSX: -p Preserve the modification time. Copy the file, as if the -C (compare and copy) option is specified, except if the target file doesn't already exist or is different, then preserve the modification time of the file. but on Linux the description is more vague: Linux: -p, --preserve-timestamps apply access/modification times of SOURCE files to corresponding destination files Anyway, I'm updating my Linux install scripts. Perhaps this thread will help somebody with the same issue in the future... -- John |