Re: [CMake] Assembly language support using gcc or gas
Hi Alex, I've tested your zip file example and it works as expected: the -I options are present but not the -D options. After some more testing of what is different in my setup I think I have isolated the cause. If I change this one line in your example from this: add_definitions(-DFOO) to this: add_definitions("-DFOO -DBAR") then I get the same behaviour I was seeing before: the -DFOO -DBAR options are passed through to the assembler command line. I see from the documentation that I should really be using add_definitions(-DFOO -DBAR) without the double quotes but they were harmless before. Should I file this as a bug - or will it just be marked as "not a bug", i.e. don't use double quotes like that with add_definitions ? -- Glenn 2011/8/3 Alexander Neundorf > Hi, > > On Wednesday 03 August 2011, Glenn Coombs wrote: > > I tried changing from ASM to ASM-ATT and that fails like this: > > > > /usr/bin/as -I/user/grc/msvdx-cvsfiles/sim/msvdx-cmake-2.8.5/systemC/src > > -I/user/grc/msvdx-cvsfiles/sim/msvdx-cmake-2.8.5/systemC/src/sysc/kernel > > -DNOMINMAX -DUSE_SIM_NAMESPACE -o > > CMakeFiles/systemc.dir/src/sysc/qt/md/i386.s.o > > > /user/grc/msvdx-cvsfiles/sim/msvdx-cmake-2.8.5/systemC/src/sysc/qt/md/i386. > > s /usr/bin/as: unrecognized option `-NOMINMAX' > > > > I really don't think the -I and -D options should be passed through for > > assembler files. They only make sense for C/C++ files. There should be > a > > separate variable like CMAKE_ASM_FLAGS that is used instead of > > CMAKE_C_FLAGS or CMAKE_CXX_FLAGS. And maybe there needs to be a change > to > > the > > add_definitions() command to allow an optional LANG argument ? Do > > assembers even support preprocessor definitions ? > > > > I was able to get it to work for both 2.8.4 and 2.8.5 with the following > > code: > > > > if(UNIX) > > list(APPEND sources "src/sysc/qt/qt.c") > > > > # see if we are building 32-bit or 64-bit executables > > file(WRITE ${CMAKE_BINARY_DIR}/check_32or64bit.cpp "int main(int > argc, > > char *argv[]) { return 8 * sizeof(char *); }\n") > > > > try_run( > > run_result > > compile_result > > ${CMAKE_BINARY_DIR} > > ${CMAKE_BINARY_DIR}/check_32or64bit.cpp > > ) > > > > if (${run_result} EQUAL 32) > > list(APPEND sources "src/sysc/qt/md/i386.s") > > if(APPLE) > > set(ASM_SYS_FLAGS "-arch i386") > > else() > > set(ASM_SYS_FLAGS "-32") > > endif() > > else() > > list(APPEND sources "src/sysc/qt/md/iX86_64.s") > > if(APPLE) > > set(ASM_SYS_FLAGS "-arch x86_64") > > else() > > set(ASM_SYS_FLAGS "-64") > > endif() > > endif() > > > > enable_language(ASM-ATT) > > > > set(CMAKE_ASM-ATT_COMPILE_OBJECT " > > ${ASM_SYS_FLAGS} -o ") > > endif() > > > > I'm not sure if this is the recommended way to do this though. I thought > > the documentation said to override CMAKE_ASM-ATT_COMPILE_OBJECT before > the > > enable_language() command. > > You should not have to override it. > To set flags, there are for every enabled language CMAKE__FLAGS > in > the cmake cache, i.e. CMAKE_ASM-ATT_FLAGS in this case. > > I tried to reproduce the problem with the attached tiny project, and I > don't > get the problem you describe. This is the output: > > as-test/b$ /opt/cmake-HEAD/bin/cmake .. > -- The C compiler identification is GNU > -- The CXX 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 > -- Check for working CXX compiler: /usr/bin/c++ > -- Check for working CXX compiler: /usr/bin/c++ -- works > -- Detecting CXX compiler ABI info > -- Detecting CXX compiler ABI info - done > -- The ASM-ATT compiler identification is GNU > -- Found assembler: /usr/bin/as > -- Configuring done > -- Generating done > -- Build files have been written to: /home/alex/src/CMake/build dir/CMake- > git/Tests/Assembler/as-test/b > as-test/b$ make VERBOSE=1 > ... > Scanning dependencies of target hello > make[2]: Leaving directory `/home/alex/src/CMake/build dir/CMake- > git/Tests/Assembler/as-test/b' > make -f CMakeFiles/hello.dir/build.make CMakeFiles/hello.dir/build > make[2]: Entering directory `/home/alex/src/CMake/build dir/CMake- > git/Tests/Assembler/as-test/b' > /opt/cmake-HEAD/bin/cmake -E cmake_progress_report > "/home/alex/src/CMake/build > dir/CMake-git/Tests/Assembler/as-test/b/CMakeFiles" 1 > > [ 50%] Building C object CMakeFiles/hello.dir/main.c.o > /usr/bin/gcc -DFOO -DBLUB=blub -DBAR=bar -I/opt/include-o > CMakeFiles/hello.dir/main.c.o -c "/home/alex/src/CMake/build dir/CMake- > git/Tests/Assembler/as-test/main.c" > /opt/cmake-HEAD/bin/cmake -E cmake_progress_report > "/home/alex/src/CMake/build > dir/CMake-git/Tests/Assembler/as-test/b/CMakeFiles" 2 > > [100%] Building ASM-ATT obje
Re: [CMake] Assembly language support using gcc or gas
Hi, On Wednesday 03 August 2011, Glenn Coombs wrote: > I tried changing from ASM to ASM-ATT and that fails like this: > > /usr/bin/as -I/user/grc/msvdx-cvsfiles/sim/msvdx-cmake-2.8.5/systemC/src > -I/user/grc/msvdx-cvsfiles/sim/msvdx-cmake-2.8.5/systemC/src/sysc/kernel > -DNOMINMAX -DUSE_SIM_NAMESPACE -o > CMakeFiles/systemc.dir/src/sysc/qt/md/i386.s.o > /user/grc/msvdx-cvsfiles/sim/msvdx-cmake-2.8.5/systemC/src/sysc/qt/md/i386. > s /usr/bin/as: unrecognized option `-NOMINMAX' > > I really don't think the -I and -D options should be passed through for > assembler files. They only make sense for C/C++ files. There should be a > separate variable like CMAKE_ASM_FLAGS that is used instead of > CMAKE_C_FLAGS or CMAKE_CXX_FLAGS. And maybe there needs to be a change to > the > add_definitions() command to allow an optional LANG argument ? Do > assembers even support preprocessor definitions ? > > I was able to get it to work for both 2.8.4 and 2.8.5 with the following > code: > > if(UNIX) > list(APPEND sources "src/sysc/qt/qt.c") > > # see if we are building 32-bit or 64-bit executables > file(WRITE ${CMAKE_BINARY_DIR}/check_32or64bit.cpp "int main(int argc, > char *argv[]) { return 8 * sizeof(char *); }\n") > > try_run( > run_result > compile_result > ${CMAKE_BINARY_DIR} > ${CMAKE_BINARY_DIR}/check_32or64bit.cpp > ) > > if (${run_result} EQUAL 32) > list(APPEND sources "src/sysc/qt/md/i386.s") > if(APPLE) > set(ASM_SYS_FLAGS "-arch i386") > else() > set(ASM_SYS_FLAGS "-32") > endif() > else() > list(APPEND sources "src/sysc/qt/md/iX86_64.s") > if(APPLE) > set(ASM_SYS_FLAGS "-arch x86_64") > else() > set(ASM_SYS_FLAGS "-64") > endif() > endif() > > enable_language(ASM-ATT) > > set(CMAKE_ASM-ATT_COMPILE_OBJECT " > ${ASM_SYS_FLAGS} -o ") > endif() > > I'm not sure if this is the recommended way to do this though. I thought > the documentation said to override CMAKE_ASM-ATT_COMPILE_OBJECT before the > enable_language() command. You should not have to override it. To set flags, there are for every enabled language CMAKE__FLAGS in the cmake cache, i.e. CMAKE_ASM-ATT_FLAGS in this case. I tried to reproduce the problem with the attached tiny project, and I don't get the problem you describe. This is the output: as-test/b$ /opt/cmake-HEAD/bin/cmake .. -- The C compiler identification is GNU -- The CXX 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 -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- The ASM-ATT compiler identification is GNU -- Found assembler: /usr/bin/as -- Configuring done -- Generating done -- Build files have been written to: /home/alex/src/CMake/build dir/CMake- git/Tests/Assembler/as-test/b as-test/b$ make VERBOSE=1 ... Scanning dependencies of target hello make[2]: Leaving directory `/home/alex/src/CMake/build dir/CMake- git/Tests/Assembler/as-test/b' make -f CMakeFiles/hello.dir/build.make CMakeFiles/hello.dir/build make[2]: Entering directory `/home/alex/src/CMake/build dir/CMake- git/Tests/Assembler/as-test/b' /opt/cmake-HEAD/bin/cmake -E cmake_progress_report "/home/alex/src/CMake/build dir/CMake-git/Tests/Assembler/as-test/b/CMakeFiles" 1 [ 50%] Building C object CMakeFiles/hello.dir/main.c.o /usr/bin/gcc -DFOO -DBLUB=blub -DBAR=bar -I/opt/include-o CMakeFiles/hello.dir/main.c.o -c "/home/alex/src/CMake/build dir/CMake- git/Tests/Assembler/as-test/main.c" /opt/cmake-HEAD/bin/cmake -E cmake_progress_report "/home/alex/src/CMake/build dir/CMake-git/Tests/Assembler/as-test/b/CMakeFiles" 2 [100%] Building ASM-ATT object CMakeFiles/hello.dir/foo.s.o /usr/bin/as -I/opt/include-o CMakeFiles/hello.dir/foo.s.o "/home/alex/src/CMake/build dir/CMake-git/Tests/Assembler/as-test/foo.s" Linking C executable hello ... So, here main.c gets all the -D's, and foo.s gets the -I, but not the -D's. Is that different for you ? Alex as-test.tar.gz Description: application/compressed-tar ___ 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] Assembly language support using gcc or gas
I tried changing from ASM to ASM-ATT and that fails like this: /usr/bin/as -I/user/grc/msvdx-cvsfiles/sim/msvdx-cmake-2.8.5/systemC/src -I/user/grc/msvdx-cvsfiles/sim/msvdx-cmake-2.8.5/systemC/src/sysc/kernel -DNOMINMAX -DUSE_SIM_NAMESPACE -o CMakeFiles/systemc.dir/src/sysc/qt/md/i386.s.o /user/grc/msvdx-cvsfiles/sim/msvdx-cmake-2.8.5/systemC/src/sysc/qt/md/i386.s /usr/bin/as: unrecognized option `-NOMINMAX' I really don't think the -I and -D options should be passed through for assembler files. They only make sense for C/C++ files. There should be a separate variable like CMAKE_ASM_FLAGS that is used instead of CMAKE_C_FLAGS or CMAKE_CXX_FLAGS. And maybe there needs to be a change to the add_definitions() command to allow an optional LANG argument ? Do assembers even support preprocessor definitions ? I was able to get it to work for both 2.8.4 and 2.8.5 with the following code: if(UNIX) list(APPEND sources "src/sysc/qt/qt.c") # see if we are building 32-bit or 64-bit executables file(WRITE ${CMAKE_BINARY_DIR}/check_32or64bit.cpp "int main(int argc, char *argv[]) { return 8 * sizeof(char *); }\n") try_run( run_result compile_result ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}/check_32or64bit.cpp ) if (${run_result} EQUAL 32) list(APPEND sources "src/sysc/qt/md/i386.s") if(APPLE) set(ASM_SYS_FLAGS "-arch i386") else() set(ASM_SYS_FLAGS "-32") endif() else() list(APPEND sources "src/sysc/qt/md/iX86_64.s") if(APPLE) set(ASM_SYS_FLAGS "-arch x86_64") else() set(ASM_SYS_FLAGS "-64") endif() endif() enable_language(ASM-ATT) set(CMAKE_ASM-ATT_COMPILE_OBJECT " ${ASM_SYS_FLAGS} -o ") endif() I'm not sure if this is the recommended way to do this though. I thought the documentation said to override CMAKE_ASM-ATT_COMPILE_OBJECT before the enable_language() command. If I do that then I get the -I and -D flags back and my ASM_SYS_FLAGS variable is ignored. Is there a cleaner way to do this or is my current solution okay ? 2011/8/2 Alexander Neundorf > Hi, > > On Tuesday 02 August 2011, Glenn Coombs wrote: > > Previously with cmake 2.8.4 we were using these lines to compile an > > with 2.8.5 there was a major rework of the assembler support (and now it > finally does not say "Assembler support is experimental" anymore). > Sorry that this causes inconvenience for you. > > If you enable "ASM", you get support for assembler via your C/C++ compiler. > That's why you get gcc now instead of as. > If the C/C++ compiler does not support processing assembler files, this > language can't be enabled. > > If you need a "real" assembler, you have to enable the respective assembler > "dialect". E.g. to get as/gas, you need to enable "ASM-ATT". > This should work with both versions. > > Let me know if this doesn't work for you. > > 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] Assembly language support using gcc or gas
Hi, On Tuesday 02 August 2011, Glenn Coombs wrote: > Previously with cmake 2.8.4 we were using these lines to compile an with 2.8.5 there was a major rework of the assembler support (and now it finally does not say "Assembler support is experimental" anymore). Sorry that this causes inconvenience for you. If you enable "ASM", you get support for assembler via your C/C++ compiler. That's why you get gcc now instead of as. If the C/C++ compiler does not support processing assembler files, this language can't be enabled. If you need a "real" assembler, you have to enable the respective assembler "dialect". E.g. to get as/gas, you need to enable "ASM-ATT". This should work with both versions. Let me know if this doesn't work for you. 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
[CMake] Assembly language support using gcc or gas
Previously with cmake 2.8.4 we were using these lines to compile an assembly language file in our project: if(UNIX) enable_language(ASM) # see if we are building 32-bit or 64-bit executables file(WRITE ${CMAKE_BINARY_DIR}/check_32or64bit.cpp "int main(int argc, char *argv[]) { return 8 * sizeof(char *); }\n") try_run( run_result compile_result ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}/check_32or64bit.cpp ) if (${run_result} EQUAL 32) list(APPEND sources "src/sysc/qt/md/i386.s") if(APPLE) set(ASM_SYS_FLAGS "-arch i386") else() set(ASM_SYS_FLAGS "-32") endif() else() list(APPEND sources "src/sysc/qt/md/iX86_64.s") if(APPLE) set(ASM_SYS_FLAGS "-arch x86_64") else() set(ASM_SYS_FLAGS "-64") endif() endif() set(CMAKE_ASM${ASM_DIALECT}_COMPILE_OBJECT " ${ASM_SYS_FLAGS} -o ") endif() And this resulted in the appropriate 32-bit or 64-bit assembler file being compiled like so: /usr/bin/as -32 -o /i386.s.o /i386.s /usr/bin/as -64 -o /iX86_64.s.o /iX86_64.s Now with cmake 2.8.5 it fails when compiling that assembler file as it uses /usr/bin/gcc rather than /usr/bin/as and gcc wants -m32 and -c instead of -32. When I tried commenting out the line that overrides the default setting of CMAKE_ASM${ASM_DIALECT}_COMPILE_OBJECT it fails differently: /usr/bin/gcc -DEXTERNAL_BUS_WIDTH=128 -DLINUX -DHIDEBUG -O3 -DNDEBUG -I/user/grc/msvdx-cvsfiles/sim/msvdx-cmake-2.8.5/systemC/src -I/user/grc/msvdx-cvsfiles/sim/msvdx-cmake-2.8.5/systemC/src/sysc/kernel -DNOMINMAX -DUSE_SIM_NAMESPACE -o CMakeFiles/systemc.dir/src/sysc/qt/md/i386.s.o -c /user/grc/msvdx-cvsfiles/sim/msvdx-cmake-2.8.5/systemC/src/sysc/qt/md/i386.s i386.s:69: Error: suffix or operands invalid for `push' This line works if I add the -m32 option using set(CMAKE_ASM_FLAGS "-m32") but should all the preprocessor defines (-DXXX) and include directory arguments (-IXXX) be present ? I was thinking they were only for C/C++ files, no ? And what is the recommended way to compile an assembly language file that will work on both 2.8.4 and 2.8.5 ? -- Glenn ___ 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