Re: [CMake] How to build 2 targets from the same source, differing in -D_SWITCHES_ only

2009-09-05 Thread Hendrik Sattler
Am Freitag 04 September 2009 21:51:59 schrieb Alexander Neundorf:
> On Thursday 27 August 2009, Christian Ehrlicher wrote:
> > > Von: "Marcel Loose" 
> > > CC: cmake@cmake.org
> > > Betreff: Re: [CMake] How to build 2 targets from the same
> > > source,   differing in -D_SWITCHES_ only
> > >
> > > Hi Eike,
> > >
> > > I think the only safe and reliable way to do this is create several
> > > build directories, e.g. build/type_1 and build/type_2.
> > > When running cmake in build/type_1, you should add -D_TYPE1_ to the
> > > preprocessor flags; same for build/type_2.
> >
> > Why? Does SET_TARGET_PROPERTIES() with COMPILE_FLAGS not work?
> 
> So the full code is:
> 
> add_executable(foo main.c)
> set_target_properties(foo PROPERTIES COMPILE_FLAGS -D_TYPE1_)
> 
> add_executable(bar main.c)
> set_target_properties(bar PROPERTIES COMPILE_FLAGS -D_TYPE2_)

Actually better:
set (foo_DEFS _TYPE1_)
set (bar_DEFS _TYPE2_)
foreach(i foo bar)
  add_executable(${i} main.c) 
  set_target_properties(foo PROPERTIES COMPILE_DEFINITIONS ${${i}_DEFS})
  foreach(flag RELEASE DEBUG)
set_target_properties(foo PROPERTIES COMPILE_DEFINITIONS_{flag} 
${${i}_DEFS})
  endforeach(flag)
endforeach(i)

 ;-)

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] How to build 2 targets from the same source, differing in -D_SWITCHES_ only

2009-09-04 Thread Alexander Neundorf
On Thursday 27 August 2009, Christian Ehrlicher wrote:
> > Von: "Marcel Loose" 
> > CC: cmake@cmake.org
> > Betreff: Re: [CMake] How to build 2 targets from the same
> > source, differing in -D_SWITCHES_ only
> >
> > Hi Eike,
> >
> > I think the only safe and reliable way to do this is create several
> > build directories, e.g. build/type_1 and build/type_2.
> > When running cmake in build/type_1, you should add -D_TYPE1_ to the
> > preprocessor flags; same for build/type_2.
>
> Why? Does SET_TARGET_PROPERTIES() with COMPILE_FLAGS not work?

So the full code is:

add_executable(foo main.c)
set_target_properties(foo PROPERTIES COMPILE_FLAGS -D_TYPE1_)

add_executable(bar main.c)
set_target_properties(bar PROPERTIES COMPILE_FLAGS -D_TYPE2_)

Alex

___
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] How to build 2 targets from the same source, differing in -D_SWITCHES_ only

2009-08-30 Thread Eike Kroemer
Hi Marcel,

[...]
> See tiny example below (hope this helps).
Yes, it does, thank you very much for the detailed walkthrough.

Based on your suggestion I've experimented a bit and found that my key
issues were:

- introducing a separated build-directory structure - should have done
  that long before as my makefiles needed a 'make partialclean' and a
  flag-file .LAST_TARGET for switching between targets, ähh,
  historically grown

- giving up on a single main Makefile/CMakeLists.txt for all targets,
  handling those as separate projects makes more sense (perhaps I'll
  keep my main Makefile just to call configure for all CMake-projects).

- stop calling cmake from a directory that is _common_ to all builds;
  changing into a build directory and CMaking from there works fine.

Thanks again,

  Eike
___
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] How to build 2 targets from the same source, differing in -D_SWITCHES_ only

2009-08-28 Thread Marcel Loose
Hi Eike,

Comments are inline.

On Thu, 2009-08-27 at 14:55 +0200, Eike Kroemer wrote:
> Hi Marcel, Christian,
> 
> > Am 08/27/2009 01:30 PM Marcel Loose wrote:
> > I think the only safe and reliable way to do this is create several
> > build directories, e.g. build/type_1 and build/type_2.
> > When running cmake in build/type_1, you should add -D_TYPE1_ to the
> > preprocessor flags; same for build/type_2.
> By 'build directories' you mean to duplicate the library sourcecodes?
> 
> Using the approach sketched in the original post, I have tried to create
> different directories for holding objects and libs - so far without success.
> 
It should work, because this is the way it's done by many people.
But (see below)...
> -
> 
> > Am 08/27/2009 01:37 PM Christian Ehrlicher wrote:
> > Why? Does SET_TARGET_PROPERTIES() with COMPILE_FLAGS not work?
> I tried something with SET_TARGET_PROPERTIES but when used on the target
> sim_type1 the define-flag won't be inherited by the library the target
> depends on, thus I used add_definitions instead
> 
> 
> 
> I think the problem comes with using
>add_subdirectory(../../VEHICLE VEHICLE)
> and the subsequent
>add_library(vehicle ${SRC})
> 
> While this sets up a binary directory local to the make-target, it also
> creates CMake*-files 'globally', for all targets.
> 
The problem is probably that you're using relative paths in
add_subdirectory(). Furthermore, if I remember your original mail
correctly, you have a CMakeLists.txt files in your so-called
build-directory. Don't do that, you don't need to.

Example project with directory layout:

source# use add_subdirectory() to add sub1 and sub2
  sub1# use add_library() to add libsub1
  sub2# use add_library() to add libsub2 and
  # target_link_libraries() to make libsub2 depend on libsub1
  main# use add_executable(prog) to add prog and
  # target_link_libraries() to make it link against the libs.
build
  type1   # build type-1 libs and binaries
  type2   # build type-2 libs and binaries

Only the source directory and its subdirectories contain CMakeLists.txt
files!

>From the directory build/type1, invoke cmake like 'cmake ../..' and add
-DTYPE1 to the preprocessor flags.
Do the same for the directory build/type2.

See tiny example below (hope this helps).

Best regards,
Marcel Loose.


$ pwd
/tmp/cmake/preproc
$ cat CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(demo C)
add_executable(preproc preproc.c)
$ cat preproc.c
#include 
int main()
{
#ifdef TYPE_1
  printf("I am TYPE_1\n");
#elif TYPE_2
  printf("I am TYPE_2\n");
#else
  printf("I don't know my type!\n");
#endif
  return 0;
}
$ mkdir -p build/type_1
$ mkdir -p build/type_2
$ mkdir -p build/no_type
$ cd build/type_1
$ cmake -DCMAKE_C_FLAGS="-DTYPE_1" ../..
-- The C compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/cmake/preproc/build/type_1
$ make
Scanning dependencies of target preproc
[100%] Building C object CMakeFiles/preproc.dir/preproc.c.o
Linking C executable preproc
[100%] Built target preproc
$ ./preproc
I am TYPE_1
$ cd ../type_2
$ cmake -DCMAKE_C_FLAGS="-DTYPE_2" ../..
-- The C compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/cmake/preproc/build/type_2
$ make
Scanning dependencies of target preproc
[100%] Building C object CMakeFiles/preproc.dir/preproc.c.o
Linking C executable preproc
[100%] Built target preproc
$ ./preproc
I am TYPE_2
$ cd ../no_type
cmake ../..
-- The C compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/cmake/preproc/build/no_type
$ make
Scanning dependencies of target preproc
[100%] Building C object CMakeFiles/preproc.dir/preproc.c.o
Linking C executable preproc
[100%] Built target preproc
$ ./preproc
I don't know my type!



___
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] How to build 2 targets from the same source, differing in -D_SWITCHES_ only

2009-08-27 Thread John Drescher
On Thu, Aug 27, 2009 at 8:55 AM, Eike
Kroemer wrote:
> Hi Marcel, Christian,
>
>> Am 08/27/2009 01:30 PM Marcel Loose wrote:
>> I think the only safe and reliable way to do this is create several
>> build directories, e.g. build/type_1 and build/type_2.
>> When running cmake in build/type_1, you should add -D_TYPE1_ to the
>> preprocessor flags; same for build/type_2.
> By 'build directories' you mean to duplicate the library sourcecodes?
>
Not the source just the output. You put your source in a single folder
and then create 1 build tree for each different type of build you
want. On windows I use this to build my projects with different
compilers and on top of that I use this to create separate 32 and 64
bit builds.

John
___
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] How to build 2 targets from the same source, differing in -D_SWITCHES_ only

2009-08-27 Thread Eike Kroemer
Hi Marcel, Christian,

> Am 08/27/2009 01:30 PM Marcel Loose wrote:
> I think the only safe and reliable way to do this is create several
> build directories, e.g. build/type_1 and build/type_2.
> When running cmake in build/type_1, you should add -D_TYPE1_ to the
> preprocessor flags; same for build/type_2.
By 'build directories' you mean to duplicate the library sourcecodes?

Using the approach sketched in the original post, I have tried to create
different directories for holding objects and libs - so far without success.

-

> Am 08/27/2009 01:37 PM Christian Ehrlicher wrote:
> Why? Does SET_TARGET_PROPERTIES() with COMPILE_FLAGS not work?
I tried something with SET_TARGET_PROPERTIES but when used on the target
sim_type1 the define-flag won't be inherited by the library the target
depends on, thus I used add_definitions instead



I think the problem comes with using
   add_subdirectory(../../VEHICLE VEHICLE)
and the subsequent
   add_library(vehicle ${SRC})

While this sets up a binary directory local to the make-target, it also
creates CMake*-files 'globally', for all targets.

A brute-force-approach would be to remove those sources from the ${SRC}
in the add_library commands that need the -D_TYPE*_ defines and add them
to the source-list of add_executable(sim_type1 ...).

This would be awkward, would it work?

Thanks again,
   Eike
___
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] How to build 2 targets from the same source, differing in -D_SWITCHES_ only

2009-08-27 Thread Christian Ehrlicher

> Von: "Marcel Loose" 
> CC: cmake@cmake.org
> Betreff: Re: [CMake] How to build 2 targets from the same source,     
> differing in -D_SWITCHES_ only

> Hi Eike,
> 
> I think the only safe and reliable way to do this is create several
> build directories, e.g. build/type_1 and build/type_2.
> When running cmake in build/type_1, you should add -D_TYPE1_ to the
> preprocessor flags; same for build/type_2.
> 
Why? Does SET_TARGET_PROPERTIES() with COMPILE_FLAGS not work?


Christian
-- 
Neu: GMX Doppel-FLAT mit Internet-Flatrate + Telefon-Flatrate
für nur 19,99 Euro/mtl.!* http://portal.gmx.net/de/go/dsl02
___
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] How to build 2 targets from the same source, differing in -D_SWITCHES_ only

2009-08-27 Thread Marcel Loose
Hi Eike,

I think the only safe and reliable way to do this is create several
build directories, e.g. build/type_1 and build/type_2.
When running cmake in build/type_1, you should add -D_TYPE1_ to the
preprocessor flags; same for build/type_2.

Best regards,
Marcel Loose.

On Thu, 2009-08-27 at 12:28 +0200, Eike Kroemer wrote:
> Hi there,
> 
> in the hope of achieving platform independence of my plain-C project
> I have started looking into CMake, trying to duplicate what my
> manually created makefiles do.
> 
> A minimalistic description of my problem is the following:
> 
> * I have 2 executable targets
> * both having the same main program source MAIN/main.c
> * both linking to a library libvehicle.a that is built from the same
>   set of sources, e.g. VEHICLE/read_hydrodynamic_coeffs.c
> 
> The difference between both targets is a compiler definition
> -D_TYPE1_ or -D_TYPE2_ that is used in the sourcecode, e.g.
> 
>   hydro_par_t read_hydrodynamic_coeffs(sys_par_t sys_par)
>   {
>   #if defined(_TYPE1_)
>   return(read_hydrodynamic_coeffs_type1(sys_par));
>   #elif defined(_TYPE2_)
>   return(read_hydrodynamic_coeffs_type2(sys_par));
>   #endif
>   }
> 
> So the in both cases the library libvehicle.a will contain a
> function read_hydrodynamic_coeffs but the actual content of this
> function will be different.
> 
> [
>  In realiter it's more complicated because there are more
>  executables and combinations of several switches, so I really don't
>  want to change the sources.
> ]
> 
> What I've done so far is
> 
> * in the main CMakeLists.txt:
>   add_subdirectory(CMakeTargets/sim_type1)
> 
> * in CMakeTargets/sim_type1/CMakeLists.txt:
>   add_definitions(-D_TYPE1_)
>   include_directories("../../VEHICLE/INCLUDE")
>   add_subdirectory(../../VEHICLE VEHICLE)
>   add_executable(sim_type1 ../../MAIN/main)
>   target_link_libraries(sim_type1 vehicle)
> 
> * in CMakeTargets/VEHICLE/CMakeLists.txt:
>   set(SRC "read_hydrodynamic_coeffs")
>   set(SRC "${SRC} read_hydrodynamic_coeffs_type1")
>   set(SRC "${SRC} read_hydrodynamic_coeffs_type2")
>   add_library(vehicle ${SRC})
> 
> For one target only this gives a executable
> CMakeTargets/sim_type1/sim_type1 that is working as expected.
> 
> As specified by
>   add_subdirectory(../../VEHICLE VEHICLE),
> object file and library are created locally:
> ./CMakeTargets/sim_type1/VEHICLE/CMakeFiles/vehicle.dir/read_hydrodynamic_coeffs.c.o
> ./CMakeTargets/sim_type1/VEHICLE/libvehicle.a
> 
> But as soon as I try to
>  add_subdirectory(CMakeTargets/sim_type2)
>  [rest as above, only 1->2]
> I get an error message
>   add_library cannot create target "vehicle" because another target with the
>   same name already exists.  The existing target is a static library created
>   in source directory "./VEHICLE".  See documentation
>   for policy CMP0002 for more details.
> 
> Trying to cheat with cmake_policy(SET CMP0002 OLD) I can compile
> both executables but they are messed up, obviously trying to execute
> read_hydrodynamic_coeffs for the wrong type.
> 
> So, how do I define a set of executable make targets, differing only
> in the -D_defines_ that are used to build all of the source needed?
> 
> 
> Thanks in advance,
>Eike
> ___
> 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


[CMake] How to build 2 targets from the same source, differing in -D_SWITCHES_ only

2009-08-27 Thread Eike Kroemer
Hi there,

in the hope of achieving platform independence of my plain-C project
I have started looking into CMake, trying to duplicate what my
manually created makefiles do.

A minimalistic description of my problem is the following:

* I have 2 executable targets
* both having the same main program source MAIN/main.c
* both linking to a library libvehicle.a that is built from the same
  set of sources, e.g. VEHICLE/read_hydrodynamic_coeffs.c

The difference between both targets is a compiler definition
-D_TYPE1_ or -D_TYPE2_ that is used in the sourcecode, e.g.

  hydro_par_t read_hydrodynamic_coeffs(sys_par_t sys_par)
  {
  #if defined(_TYPE1_)
  return(read_hydrodynamic_coeffs_type1(sys_par));
  #elif defined(_TYPE2_)
  return(read_hydrodynamic_coeffs_type2(sys_par));
  #endif
  }

So the in both cases the library libvehicle.a will contain a
function read_hydrodynamic_coeffs but the actual content of this
function will be different.

[
 In realiter it's more complicated because there are more
 executables and combinations of several switches, so I really don't
 want to change the sources.
]

What I've done so far is

* in the main CMakeLists.txt:
  add_subdirectory(CMakeTargets/sim_type1)

* in CMakeTargets/sim_type1/CMakeLists.txt:
  add_definitions(-D_TYPE1_)
  include_directories("../../VEHICLE/INCLUDE")
  add_subdirectory(../../VEHICLE VEHICLE)
  add_executable(sim_type1 ../../MAIN/main)
  target_link_libraries(sim_type1 vehicle)

* in CMakeTargets/VEHICLE/CMakeLists.txt:
  set(SRC "read_hydrodynamic_coeffs")
  set(SRC "${SRC} read_hydrodynamic_coeffs_type1")
  set(SRC "${SRC} read_hydrodynamic_coeffs_type2")
  add_library(vehicle ${SRC})

For one target only this gives a executable
CMakeTargets/sim_type1/sim_type1 that is working as expected.

As specified by
  add_subdirectory(../../VEHICLE VEHICLE),
object file and library are created locally:
./CMakeTargets/sim_type1/VEHICLE/CMakeFiles/vehicle.dir/read_hydrodynamic_coeffs.c.o
./CMakeTargets/sim_type1/VEHICLE/libvehicle.a

But as soon as I try to
 add_subdirectory(CMakeTargets/sim_type2)
 [rest as above, only 1->2]
I get an error message
  add_library cannot create target "vehicle" because another target with the
  same name already exists.  The existing target is a static library created
  in source directory "./VEHICLE".  See documentation
  for policy CMP0002 for more details.

Trying to cheat with cmake_policy(SET CMP0002 OLD) I can compile
both executables but they are messed up, obviously trying to execute
read_hydrodynamic_coeffs for the wrong type.

So, how do I define a set of executable make targets, differing only
in the -D_defines_ that are used to build all of the source needed?


Thanks in advance,
   Eike
___
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