Re: [CMake] Adding an individual define to each source file of a library

2018-08-24 Thread George PF
>> foreach(x IN LISTS mysrcs)
>> message("at ${x}")
>> set_property(SOURCE x APPEND PROPERTY COMPILE_DEFINITIONS 
>> "TEST1;TEST2;")
>
> almost there but you forgot to take value of 'x'
>
> set_property(SOURCE ${x} APPEND PROPERTY COMPILE_DEFINITIONS "TEST1;TEST2;")
>
> works for me.

Thank you very much, now it indeed works.


FTR, extracted into a separate 'add_library_with_defs' function in the toplevel 
CMakeLists.txt


function(add_library_with_defs libname libtype)
math(EXPR endindex "${ARGC}-1")
set(files)
foreach(index RANGE 2 ${endindex})
list(GET ARGV ${index} arg)
list(APPEND files ${arg})
endforeach()

add_library("${libname}" "${libtype}" "${files}")

get_property(mysrcs TARGET "${libname}" PROPERTY SOURCES)
foreach(x IN LISTS mysrcs)
# message("${libname}: at ${x}")
set_property(SOURCE ${x} APPEND PROPERTY COMPILE_DEFINITIONS TEST1 
TEST2)
endforeach()
endfunction()


so now it is simplified to: add_library_with_defs(mylib SHARED file1.c file2.c)
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake


Re: [CMake] Adding an individual define to each source file of a library

2018-08-23 Thread Eric Noulard
Le jeu. 23 août 2018 à 19:18, George PF  a écrit :

> > > However, whatever I write into 'set_property()' - no APPEND, single
> entry,
> > > not quoted - does not end up
> > > on the compiler command line. Is there a type mismatch which is
> silently
> > > ignored?
> > >
> >
> > Or you are doing this in a directory which is not the one where the
> target
> > is defined and from the doc:
> > $ cmake --help-command set_property
> >
> > ...
> > ``SOURCE``
> >   Scope may name zero or more source files.  Note that source
> >   file properties are visible only to targets added in the same
> >   directory (CMakeLists.txt).
> >
> > ...
>
> This is all in the same directory, full setup and test:
>
> % cmake --version
> cmake version 3.12.0   [..]
> % mkdir mylib && cd mylib
> mylib% touch file1.c file2.c
> mylib% cat > CMakeLists.txt
>
> cmake_minimum_required(VERSION 3.12)
>
> add_library(mylib SHARED file1.c file2.c)
>
> get_property(mysrcs TARGET mylib PROPERTY SOURCES)
> foreach(x IN LISTS mysrcs)
> message("at ${x}")
> set_property(SOURCE x APPEND PROPERTY COMPILE_DEFINITIONS
> "TEST1;TEST2;")
>

almost there but you forgot to take value of 'x'

set_property(SOURCE ${x} APPEND PROPERTY COMPILE_DEFINITIONS "TEST1;TEST2;")

works for me.





> endforeach(x)
> # ^D
>
> mylib% mkdir build && cd build && cmake ..
> [..]
> at file1.c
> at file2.c
> -- Configuring done
> [..]
> mylibs/build% grep -r TEST1 . || echo no TEST1
> no TEST1
>
> and 'make VERBOSE=1' also shows no extra -DTEST1 compiler arguments.
> --
>
> Powered by www.kitware.com
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Kitware offers various services to support the CMake community. For more
> information on each offering, please visit:
>
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> https://cmake.org/mailman/listinfo/cmake
>


-- 
Eric
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake


Re: [CMake] Adding an individual define to each source file of a library

2018-08-23 Thread George PF
> > However, whatever I write into 'set_property()' - no APPEND, single entry,
> > not quoted - does not end up
> > on the compiler command line. Is there a type mismatch which is silently
> > ignored?
> >
> 
> Or you are doing this in a directory which is not the one where the target
> is defined and from the doc:
> $ cmake --help-command set_property
> 
> ...
> ``SOURCE``
>   Scope may name zero or more source files.  Note that source
>   file properties are visible only to targets added in the same
>   directory (CMakeLists.txt).
> 
> ...

This is all in the same directory, full setup and test:

% cmake --version
cmake version 3.12.0   [..]
% mkdir mylib && cd mylib
mylib% touch file1.c file2.c
mylib% cat > CMakeLists.txt

cmake_minimum_required(VERSION 3.12)

add_library(mylib SHARED file1.c file2.c)

get_property(mysrcs TARGET mylib PROPERTY SOURCES)
foreach(x IN LISTS mysrcs)
message("at ${x}")
set_property(SOURCE x APPEND PROPERTY COMPILE_DEFINITIONS 
"TEST1;TEST2;")
endforeach(x)
# ^D

mylib% mkdir build && cd build && cmake ..
[..]
at file1.c
at file2.c
-- Configuring done
[..]
mylibs/build% grep -r TEST1 . || echo no TEST1
no TEST1

and 'make VERBOSE=1' also shows no extra -DTEST1 compiler arguments.
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake


Re: [CMake] Adding an individual define to each source file of a library

2018-08-23 Thread Eric Noulard
Le jeu. 23 août 2018 à 18:31, George PF  a écrit :

> Thank you for the precise pointers, I added to the same CMakeLists.txt:
>
> get_property(mysrcs TARGET mylib PROPERTY SOURCES)
>
> foreach(x IN LISTS mysrcs)
> message("at ${x}")
> set_property(SOURCE x APPEND PROPERTY COMPILE_DEFINITIONS
> "TEST1;TEST2;")
> #set_source_files_properties(x PROPERTIES COMPILE_DEFINITIONS
> "TEST1;TEST2;") # also not working
> endforeach(x)
>
> However, whatever I write into 'set_property()' - no APPEND, single entry,
> not quoted - does not end up
> on the compiler command line. Is there a type mismatch which is silently
> ignored?
>

Or you are doing this in a directory which is not the one where the target
is defined and from the doc:
$ cmake --help-command set_property

...
``SOURCE``
  Scope may name zero or more source files.  Note that source
  file properties are visible only to targets added in the same
  directory (CMakeLists.txt).

...


> As to __FILE__ or similar, the define is used as a variable, i.e. the .c
> suffix would have to be removed
> via the c processor. The current directory is also used. I think replacing
> .c and appending the name of
> the current directory will be easier in cmake.
>
>
> > Le jeu. 23 août 2018 à 13:02, George PF  a
> écrit :
> >
> > > Hello,
> > >
> > > following "modern cmake" conventions I want to create a library where
> > > every single file is compiled with an individual define (-D_fileX_,
> > > required for a macro which integrates code into every translation
> unit).
> > >
> > > So following this
> > >
> > > add_library(mylib SHARED file1.c file2.c)
> > > target_link_libraries(mylib PUBLIC otherlib)
> > >
> > > I'd like to iterate over all "mylib" source file targets and modify
> them
> > > so that the compiler is called like this:
> > >
> > > cc -c -o file1.o file1.cc -D_file1_define_
> > > cc -c -o file1.o file2.cc -D_file2_define_
> > > etc.
> > >
> > > Is this possible?
> > >
> >
> > You can retrieve the sources associated with a target using SOURCES
> > properties.
> > https://cmake.org/cmake/help/latest/prop_tgt/SOURCES.html
> >
> > then
> > https://cmake.org/cmake/help/latest/command/foreach.html
> > with
> > https://cmake.org/cmake/help/latest/command/set_property.html
> > or
> >
> https://cmake.org/cmake/help/latest/command/set_source_files_properties.html
> >
> > for setting property:
> > https://cmake.org/cmake/help/latest/prop_sf/COMPILE_DEFINITIONS.html
> >
> > on each source file.
> >
> > not sure why you want to do that you know that compiler already defined
> > many "standard" macro for you, like __FILE__
> >
> https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html#Standard-Predefined-Macros
> > ?
> >
> > --
> > Eric
> --
>
> Powered by www.kitware.com
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Kitware offers various services to support the CMake community. For more
> information on each offering, please visit:
>
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> https://cmake.org/mailman/listinfo/cmake
>


-- 
Eric
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake


Re: [CMake] Adding an individual define to each source file of a library

2018-08-23 Thread George PF
Thank you for the precise pointers, I added to the same CMakeLists.txt:
 
get_property(mysrcs TARGET mylib PROPERTY SOURCES)

foreach(x IN LISTS mysrcs)
message("at ${x}")
set_property(SOURCE x APPEND PROPERTY COMPILE_DEFINITIONS 
"TEST1;TEST2;")
#set_source_files_properties(x PROPERTIES COMPILE_DEFINITIONS 
"TEST1;TEST2;") # also not working
endforeach(x)

However, whatever I write into 'set_property()' - no APPEND, single entry, not 
quoted - does not end up 
on the compiler command line. Is there a type mismatch which is silently 
ignored?

As to __FILE__ or similar, the define is used as a variable, i.e. the .c suffix 
would have to be removed 
via the c processor. The current directory is also used. I think replacing .c 
and appending the name of 
the current directory will be easier in cmake.


> Le jeu. 23 août 2018 à 13:02, George PF  a écrit :
> 
> > Hello,
> >
> > following "modern cmake" conventions I want to create a library where
> > every single file is compiled with an individual define (-D_fileX_,
> > required for a macro which integrates code into every translation unit).
> >
> > So following this
> >
> > add_library(mylib SHARED file1.c file2.c)
> > target_link_libraries(mylib PUBLIC otherlib)
> >
> > I'd like to iterate over all "mylib" source file targets and modify them
> > so that the compiler is called like this:
> >
> > cc -c -o file1.o file1.cc -D_file1_define_
> > cc -c -o file1.o file2.cc -D_file2_define_
> > etc.
> >
> > Is this possible?
> >
> 
> You can retrieve the sources associated with a target using SOURCES
> properties.
> https://cmake.org/cmake/help/latest/prop_tgt/SOURCES.html
> 
> then
> https://cmake.org/cmake/help/latest/command/foreach.html
> with
> https://cmake.org/cmake/help/latest/command/set_property.html
> or
> https://cmake.org/cmake/help/latest/command/set_source_files_properties.html
> 
> for setting property:
> https://cmake.org/cmake/help/latest/prop_sf/COMPILE_DEFINITIONS.html
> 
> on each source file.
> 
> not sure why you want to do that you know that compiler already defined
> many "standard" macro for you, like __FILE__
> https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html#Standard-Predefined-Macros
> ?
> 
> -- 
> Eric
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake


Re: [CMake] Adding an individual define to each source file of a library

2018-08-23 Thread Eric Noulard
Le jeu. 23 août 2018 à 13:02, George PF  a écrit :

> Hello,
>
> following "modern cmake" conventions I want to create a library where
> every single file is compiled with an individual define (-D_fileX_,
> required for a macro which integrates code into every translation unit).
>
> So following this
>
> add_library(mylib SHARED file1.c file2.c)
> target_link_libraries(mylib PUBLIC otherlib)
>
> I'd like to iterate over all "mylib" source file targets and modify them
> so that the compiler is called like this:
>
> cc -c -o file1.o file1.cc -D_file1_define_
> cc -c -o file1.o file2.cc -D_file2_define_
> etc.
>
> Is this possible?
>

You can retrieve the sources associated with a target using SOURCES
properties.
https://cmake.org/cmake/help/latest/prop_tgt/SOURCES.html

then
https://cmake.org/cmake/help/latest/command/foreach.html
with
https://cmake.org/cmake/help/latest/command/set_property.html
or
https://cmake.org/cmake/help/latest/command/set_source_files_properties.html

for setting property:
https://cmake.org/cmake/help/latest/prop_sf/COMPILE_DEFINITIONS.html

on each source file.

not sure why you want to do that you know that compiler already defined
many "standard" macro for you, like __FILE__
https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html#Standard-Predefined-Macros
?

-- 
Eric
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake


[CMake] Adding an individual define to each source file of a library

2018-08-23 Thread George PF
Hello,

following "modern cmake" conventions I want to create a library where every 
single file is compiled with an individual define (-D_fileX_, required for a 
macro which integrates code into every translation unit).

So following this

add_library(mylib SHARED file1.c file2.c)
target_link_libraries(mylib PUBLIC otherlib)

I'd like to iterate over all "mylib" source file targets and modify them so 
that the compiler is called like this:

cc -c -o file1.o file1.cc -D_file1_define_
cc -c -o file1.o file2.cc -D_file2_define_
etc.

Is this possible?


Regards

GPF
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake