On Wed, Aug 25, 2010 at 11:17 PM, Michael Wild <them...@gmail.com> wrote:
>
> On 26. Aug, 2010, at 1:34 , Mark Roden wrote:
>
>> I'm starting to get deep into CMake, and I have a few questions as I
>> try to convert the socket++ library such that it can be compiled by
>> CMake on Windows.
>>
>
> Cool!
Thanks, I think so to :)

>
>> 1) The default install directory on Windows is C:\Program Files, or
>> C:\Program Files (x86) on 64 bit.  This default will not work on
>> Windows 7 (and perhaps Vista), because the user isn't running as
>> administrator anymore, and only administrators can modify that
>> directory.  There should probably be a warning to that effect on
>> windows systems; otherwise, there are painful ways to run install, but
>> they are painful.
>
> I hope you will create an installer using CPack, and most users will then use 
> that instead of compiling from sources, so IMHO that is no real problem.

I generally intend to create an installer using WiX, mainly out of
ignorance of CPack and extensive experience using WiX.  Not that WiX
is better-- it has some serious usability problems-- but it integrates
nicely with visual studio.

However, I'm more talking about when I run CMake to install on my own machine.

My work paradigm runs like this:
1) get all the libraries I need
2) compile them all
3) put the libraries and headers into a file
4) make my own project in visual studio
5) reference those libraries and headers in my project

Why not put it all into CMake, I hear you cry?  A few reasons:
1) For the longest time (and still ongoing), the gdcm version in itk
doesn't match the latest greatest from gdcm.  There is a compiler
switch to use 'system gdcm', whatever that means on Windows, but other
projects I have require the 1.2 branch in itk.  So I can (and do) have
multiple versions of itk to account for this, and so need to ensure I
reference the right one.
2) I'm generally not messing directly with the libraries I install via
cmake, I just compile against them and use provided functions.  Going
through the cmakelists process is not helpful when I'm just using the
libraries as is.  When I modify the libraries, then I use CMake,
because that's the way these libraries come.
3) Since I don't want to recompile the libraries on multiple machines,
I just check in the results of running the installation into source
control.  This works great when you're deploying on windows;
everything compiles and builds on one machine will work on another, so
reproducing my dev environment, either for a coworker or for myself on
another machine, is much simpler and saves more time than getting the
source, making sure it's the same source as what I started with, and
rebuilding again.

So, yes, a warning would be very nice, given the way that I use the
installation option in CMake.
>
>>
>> 2) I'm trying to check to see if a certain C++ code chunk will
>> compile.  The line is:
>>
>> CHECK_CXX_SOURCE_COMPILES("
>> #include <string.h>
>> #include <stdio.h>
>> void main(){
>>  char buf[100];
>>  char buf2[100];
>>  strncpy(buf2, buf, 5);
>>  buf2[5] = '\0';
>>  puts(buf2);
>> }" EXTERN_C)
>>
>> The EXTERN_C test is failing here.  The problem is, I can cut and
>> paste that code into a blank project in vs2008 and it compiles just
>> fine.  Is there a way to see the compiler error, or to determine why
>> that would fail?
>>
>> The code in the configure.in file is:
>>
>> AC_TRY_LINK([
>> # include <string.h>
>> # include <stdio.h>
>> ], [
>>  char buf[100];
>>  strcpy(buf, "Hello world\n");
>> ],
>>  bz_cv_cplusplus_needexternCwrapper=no,
>>  bz_cv_cplusplus_needexternCwrapper=yes)
>> ])
>>
>> I can't use that directly (or can I?) because the quotation marks in
>> "Hello World" prematurely cut off the code in the SOURCE section of
>> CHECK_CXX_SOURCE_COMPILES, and I get an error that the variable World"
>> makes no sense.
>
> Just put \ in front of the quotation marks, and the hello world code will 
> work.

That's not my point.  The code I gave has no double quotes in it, and
it still doesn't compile properly, but it does compile and work in a
visual studio environment.
If I do:

CHECK_CXX_SOURCE_COMPILES("
#include <string.h>
#include <stdio.h>
 void main(){
  char buf[100];
  strcpy(buf, \"Hello world\n\");
 }" EXTERN_C)

I get

Performing Test EXTERN_C
Performing Test EXTERN_C - Failed

But that code compiles in an empty vs2008 project.

 How can I get the compiler error?  I don't see why this code test should fail.

>
>
>>
>> 3) There is a check for the presence of the Libg++ library, but no
>> specific mention of which function is needed.  According to what I can
>> find on CheckLibraryExists, I need to provide a specific function to
>> determine if that library is present.  The code in configure.in is:
>>
>> AC_CHECK_HEADER(_G_config.h, AC_DEFINE(_S_LIBGXX))
>>
>> In that case, should I be looking for a particular function in
>> _G_config.h (which I don't have, since I'm on Windows) and just using
>> it arbitrarily?  I'm not even close to the point where this code can
>> fail in compilation and therefore determine the error directly.
>
> In that case I just find a sufficiently unique function in libg++ (using e.g. 
> the nm tool on Unix systems or dumpbin on Windows). But what above code 
> actually does corresponds to
>
> find_file(G_CONFIG_H_PATH _G_config.h)
> if(G_CONFIG_H_PATH)
>  set(_S_LIBGXX 1)
> else()
>  set(_S_LIBGXX 0)
> endif()
>
> Actually, it does a bit more (see the docs of AC_DEFINE), but I don't think 
> it is relevant to you.

Thanks, I'll add that in!

I'm assuming that it works, because when I swap around the 1 and the
0, I get the opposite result (ie, it things that _S_LIBGXX should be
1).

>
>>
>> 4) There are two checks for potentially predefined variables, namely
>> sys_siglist and sys_errlist.  The code to check for these looks like:
>>
>> AC_CACHE_VAL(socketxx_cv_siglist, [
>> AC_TRY_LINK([
>> # include <unistd.h>
>> # include <sys/signal.h>
>> ], [
>> #ifndef _sys_siglist
>>  extern char* _sys_siglist[];
>> #endif
>>  puts(*_sys_siglist);
>> ],
>> socketxx_cv_siglist=_sys_siglist,
>> socketxx_cv_siglist=sys_siglist) ])
>> AC_DEFINE_UNQUOTED(SYS_SIGLIST, $socketxx_cv_siglist)
>>
>> Windows doesn't have unistd.h or sys/signal.h, so I know that this
>> will fail, regardless of the test.  I'm unfamiliar with these
>> variables; does anyone have any insight into them?  It looks like if
>> the code compiles, the variable _sys_siglist will be used, otherwise,
>> sys_siglist, whatever that is.  I'm tempted to just say that it is
>> what it is, and if other unix users have issues, we can fix the cmake
>> file then.  The typical sloppiness of someone not dealing with their
>> native platform, I guess :)
>>
>
> Those are definitely unixy, they contain operating system signal and error 
> descriptions and are usually accessed through the psginal, strsignal, perror 
> and strerror family of functions. Normally they should not be accessed 
> directly. I think the above code assumes it's running on Unix and just 
> determines whether the C library implementor prefixed the variables with a _ 
> (to mark them for internal use only).

Right, ok.

This code does need to work with linux, as it's going to be deployed
via cmake.  Should I just get a colleague using linux to fix those up
then?  How would they go about checking which version to use?

Thanks much!
Mark
_______________________________________________
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

Reply via email to