CMake-generated Makefile: "make <a target>" opens shell inside shell repeatedly - windows-7

I open a cmd console, go to where the Makefile is and run "make help", for instance. Instead of listing the available targets, make seems to just run cmd inside cmd again and again for each target. I can go back by typing "exit", "exit", "exit", etc. until I'm back to my original cmd prompt. All other targets are rendered the same way.
I configured (using Cmake GUI) CMake to use MinGW tools, indicated the correct source and build dirs. Everything regarding environment seems ok per the tests performed by CMake.
Please, help, I have no clue of what is going on. That's very odd.
Here is the "help" target from the Makefile generated by Cmake (I edited out some #echoes during investigation). In this case, make opens three cmd prompts in tandem instead of printing the information in the #echo commands.
# Help Target
help:
#echo The following are some of the valid targets for this Makefile:
#echo ... all (the default if no target is provided)
#echo ... clean
.PHONY : help
Please ask any information you want. I didn't paste the entire Makefile or CMakeCache.txt because they are quite large. If you need them, please ask.
This is my CMakeLists.txt, it is quite simple:
#
cmake_minimum_required (VERSION 2.6)
project (HELLO)
add_library (mylib MainLibClass.cpp)
add_executable(myprogram main.cpp)
target_link_libraries(myprogram mylib)

Related

Configure make command for fortran in Geany

sorry if it's a simple question, I'm a bit of a rookie and couldn't find the answer online.
I have a program in Fortran with a makefile that I need to run. I am able to run it through the terminal, by using mingw32-make command, but I'd like to do be able to do it through Geany as well.
When I just try to do it by pressing Make in Geany, nothing happens and a message at the bottom of the screen says Process failed (The system cannot find the file specified). From what I gather, I need to configure a new make command in Geany through Set build commands and that might solve the problem, but this is where I am lost. What exactly do I need to type in there? Do I need to direct it to mingw32-make? How do I do that?
This is what my Set Build commands window looks like now.
Thanks!
Two options
In your fortran bin directory copy mingw32_make.exe to make.exe.
In geany, change make to mingw32_make
The make in geany should then work.

weird behavior of nmake under gsh.exe on windows10

Please help me troubleshoot the following problem I am facing with my app.
I have written my own shell for windows, named gsh, which currently implements most of the CMD.EXE functionality. So far all activities I perform under GSH are identical to CMD, except for this issue I have with the NMAKE program.
Here's the test scenario. I have several c++ projects built using 'nmake all' on command prompt. Under CMD, nmake runs smoothly (meaning it builds all the targets that need to be built). Under GSH, however, namke builds the first set of targets ( i.e. all *.obj for *.cpp) but not the *.exe that depend on the newly bult *.obj. I have to run 'nmake all' a second time to built the *.exe.
If I run 'nmake clean' before 'nmake all' then all targets are built fine.
I am 100% sure makefile is correct. I have checked all environment variables between GSH and CMD and they are the same. I have also checked the dates on the produced files and they look fine(meaning dates on produced files are newer, and date of *.exe is older than the date of the depending *.obj). I can also confirm that while 'nmake all' is running, it does not invoke another copy of the shell (to do its tasks, which might caused a problem to nmake). Note: On a complex makefile, I can see nmake issuing system(...) function which invokes the shell pointed by ComSpec env var, which I can direct it to either GSH or CMD, without any apparent change in behavior.
Thank you all for any ideas you might have on the root cause of the above.
cheers!, gt

How to config Geany to build and execute at the same time?

I just started using Geany for a week. And always having to hit F9 to build and then hit F5 to run, it just sucks.
So is there any way to config Geany so that it'll build and then execute immediately (like F9 in CodeBlocks) ?
You can add your own custom commands or even adjust existing ones. Go to Build->Set Build Commands and change the compile command to something like command1 && command 2. The && should cause your POSIX shell to execute command 2 if command 1 was successful. Inside wiki there is a more verbose version of documentation what can be done on "Set Build Commands"
I know this is old but I just figured out how to do this on Ubuntu Linux.
-Click "Build" in the menu at the top
-At the bottom go to "Set Build Commands"
-Prepend the command in the "Build" section before the command in the "Execute" section.
Execute should look like g++ -Wall -o "%e" "%f" && "./%e".
Here are before and after images.
Default Build Commands
Build and Execute Combined
You should now be able to build and run your program by pressing F5 (default) once or running execute from the build dropdown menu.
i did this for windows.
donwload git bash for windows
(https://git-scm.com/download/win)
download mingw c compiler for windows
(https://sourceforge.net/projects/tdm-gcc/)
simpler way of this,is to simply use mingw bin folder of codeblocks which has the gcc for winodws binaries, to search , go to your codeblocks installed folder and search "gcc.exe" in search bar. set this bin folder as path through in enevirment variables(https://www.java.com/en/download/help/path.html)
in geany go to build->set build commands
in execute box write
\bin\bash -c "gcc %f && time ./a.exe"
Example : D:\Downloads\GitBash\bin\bash -c "gcc %f && time ./a.exe"
after this , write a source file and hit F5. Your code will compile and on successfull compile it will run

Makefile.mak giving error [duplicate]

I have Windows 7 and tried to use the 'make' command but 'make' is not recognized as an internal or external command.
I did Start -> cmd -> run -> make, which outputs:
'make' is not recognized as an internal or external command,operable program or batch file.
Then I typed 'mingw32-make' instead of 'make' (Start -> cmd -> run -> mingw32-make) and I get the same output:
'mingw32-make' is not recognized as an internal or external command,operable program or batch file.
What shall I do next in order to fix this problem?
In Windows10, I solved this issue by adding C:\MinGW\bin to Path and then called it using MinGW32-make not make.
Your problem is most likely that the shell does not know where to find your make program. If you want to use it from "anywhere", then you must do this, or else you will need to add the full path each time you want to call it, which is quite cumbersome. For instance:
"c:\program files\gnuwin32\bin\make.exe" option1=thisvalue option2=thatvalue
This is to be taken as an example, it used to look like something like this on XP, I can't say on W7. But gnuwin32 used to provide useful "linux-world" packages for Windows. Check details on your provider for make.
So to avoid entering the path, you can add the path to your PATH environment variable. You will find this easily.
To make sure it is registered by the OS, open a console (run cmd.exe) and entering $PATH should give you a list of default pathes. Check that the location of your make program is there.
This is an old question, but none of the answers here provide enough context for a beginner to choose which one to pick.
What is make?
make is a traditional Unix utility which reads a Makefile to decide what programs to run to reach a particular goal. Typically, that goal is to build a piece of software from a set of source files and libraries; but make is general enough to be used for various other tasks, too, like assembling a PDF from a collection of TeX source files, or retrieving the newest versions of each of a list of web pages.
Besides encapsulating the steps to reach an individual target, make reduces processing time by avoiding to re-execute steps which are already complete. It does this by comparing time stamps between dependencies; if A depends on B but A already exists and is newer than B, there is no need to make A. Of course, in order for this to work properly, the Makefile needs to document all such dependencies.
A: B
commands to produce A from B
Notice that the indentation needs to consist of a literal tab character. This is a common beginner mistake.
Common Versions of make
The original make was rather pedestrian. Its lineage continues to this day into BSD make, from which nmake is derived. Roughly speaking, this version provides the make functionality defined by POSIX, with a few minor enhancements and variations.
GNU make, by contrast, significantly extends the formalism, to the point where a GNU Makefile is unlikely to work with other versions (or occasionally even older versions of GNU make). There is a convention to call such files GNUmakefile instead of Makefile, but this convention is widely ignored, especially on platforms like Linux where GNU make is the de facto standard make.
Telltale signs that a Makefile uses GNU make conventions are the use of := instead of = for variable assignments (though this is not exclusively a GNU feature) and a plethora of functions like $(shell ...), $(foreach ...), $(patsubst ...) etc.
So Which Do I Need?
Well, it really depends on what you are hoping to accomplish.
If the software you are hoping to build has a vcproj file or similar, you probably want to use that instead, and not try to use make at all.
In the general case, MinGW make is a Windows port of GNU make for Windows, It should generally cope with any Makefile you throw at it.
If you know the software was written to use nmake and you already have it installed, or it is easy for you to obtain, maybe go with that.
You should understand that if the software was not written for, or explicitly ported to, Windows, it is unlikely to compile without significant modifications. In this scenario, getting make to run is the least of your problems, and you will need a good understanding of the differences between the original platform and Windows to have a chance of pulling it off yourself.
In some more detail, if the Makefile contains Unix commands like grep or curl or yacc then your system needs to have those commands installed, too. But quite apart from that, C or C++ (or more generally, source code in any language) which was written for a different platform might simply not work - at all, or as expected (which is often worse) - on Windows.
First make sure you have MinGW installed.
From MinGW installation manager check if you have the mingw32-make package installed.
Check if you have added the MinGW bin folder to your PATH. type PATH in your command line and look for the folder. Or on windows 10 go to Control Panel\System and Security\System --> Advanced system settings --> Environment Variables --> System Variables find Path variable, select, Edit and check if it is there. If not just add it!
As explained here, create a new file in any of your PATH folders. For example create mingwstartup.bat in the MinGW bin folder. write the line doskey make=mingw32-make.exe inside, save and close it.
open Registry Editor by running regedit. As explained here in HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER go to \Software\Microsoft\Command Processor right click on the right panel New --> Expandable String Value and name it AutoRun. double click and enter the path to your .bat file as the Value data (e.g. "C:\MinGW\bin\mingwstartup.bat") the result should look like this:
now every time you open a new terminal make command will run the mingw32-make.exe. I hope it helps.
P.S. If you don't want to see the commands of the .bat file to be printed out to the terminal put #echo off at the top of the batch file.
If you already have MinGW installed in Windows 7, just simply do the following:
Make another copy of C:\MinGW\bin\mingw32-make.exe file in the same folder.
Rename the file name from mingw32-make.exe to make.exe.
Run make command again.
Tested working in my laptop for above steps.
For window-10 resolved error- make' is not recognized as an internal or external command.
Download MinGW - Minimalist GNU for Windows from here https://sourceforge.net/projects/mingw/
install it
While installation mark all basic setup packages like shown in image
Apply changes
After completion of installation
copy C:\MinGW\bin
paste in system variable
Open MyComputer properties and follow as shown in image
You may also need to install this
https://sourceforge.net/projects/gnuwin32/
As other answers already suggested, you must have MinGW installed. The additional part is to add the following two folders to the PATH environment variable.
C:\MinGW\bin
C:\MinGW\msys\1.0\bin
Obviously, adjust the path based on where you installed MinGW. Also, dont forget to open a new command line terminal.
'make' is a command for UNIX/Linux. Instead of it, use 'nmake' command in MS Windows. Or you'd better use an emulator like CYGWIN.
Search for make.exe using the search feature, when found, note down the absolute path to the file. You can do that by right-clicking on the filename in the search result and then properties, or open location folder (not sure of the exact wording, I'm not using an English locale).
When you open the command line console (cmd) instead of typing make, type the whole path and name, e.g. C:\Windows\System32\java (this is for java...).
Alternatively, if you don't want to provide the full path each time, then you have to possibilities:
make C:\Windows\System32\ the current working directory, using cd at cmd level.
add C:\Windows\System32\ to you PATH environment variable.
Refs:
use full path: http://technet.microsoft.com/en-us/magazine/ff678296.aspx
cd: http://technet.microsoft.com/en-us/library/cc731237.aspx
PATH: http://technet.microsoft.com/en-us/library/bb490963.aspx
I am using windows 8. I had the same problem. I added the path "C:\MinGW\bin" to system environment variable named 'path' then it worked. May be, you can try the same. Hope it'll help!
try download & run my bat code
======run 'cmd' as admin 2 use 'setx'=====
setx scoop "C:\Users%username%\scoop" /M
echo %scoop%
setx scoopApps "%scoop%\apps" /M
echo %scoopApps%
scoop install make
=======Phase 3: Create the makePath environment variable===
setx makePath "%scoopApps%/make" /M
echo %makePath%
setx makeBin "%makePath%/Bin" /M
echo %makeBin%
setx Path "%Path%;%makeBin%" /M
echo %Path%
use mingw32-make instead of cmake in windows

running an exe from NppExec

I'm making a script to compile and run an entire project on Notepad++ using NppExec.
I keep each project on a folder and each folder has a makefile to compile the entire project, the compiler will produce a single .exe file so in each folder there is just one executable that has the same name of the folder (with the .exe extension).
I made the first part of the script (compiling with the makefile) but I don't know how to make the second part (running the executable). I know how to run an executable in NppExec but I'm trying to do something different: I want to compile the exe without specifying its name in the commands so that I can use the script to compile and run every project organized as I explained above (each folder with only one .exe that has the same name of the folder).
How can I do it?
If you don't know how to do that in NppExec, how can I do the same thing in cmd? (I can then write that in NppExec by adding cmd \c at the and of the command)
There are some special targets make knows about:
all: to compile everything
run: to run the program, if this depends on all, then the program is recompiled if necessary
clean: for necessary clean ups
So what you need are two npp_exec scripts which you can bind to different keyboard shortcuts (save the scripts under some names, in the menu use Plugins, Nppexec, Advanced options: add the scripts to the menu using the controls on the left; give the menu items different menu_names; restart notepad++; goto Settings, Shortcut mapper, Plugins commands: you will find the menu_names somewhere in this list, you can assign keyboard shortcuts to them).
The second ingredient are the targets in the makefile:
all: depends on your binary
run: depends on all, the command would normally be something like
./$(ProgName)
but in your case (windows with mingw32-make, as explained in the comments, and you need a command window) your run target would look like
run: all
cmd /C $(ESEGUIBILE)
This way you have one setup in Notepad++ that works for all your folders, the interface is
make all
make run
The makefiles in each folder know the name of the folder specific binary, you only need to add the run section to each makefile.

Resources